JSON:计划创建JSON文件

时间:2013-09-06 作者:eskimo

经过一些研究,我成功地创建了一个json文件,作为Twitter的typeahead(预回迁)的输入。在我的网站上,我有数百个活动和数千名艺术家(都是自定义帖子类型)。

json文件是使用下面的函数创建的(只发布了一个函数,因为艺术家的函数是相同的,只是发布类型不同)。由于我们不断更新活动和艺术家,而且这两者都有很多,我想知道应该如何运行这些功能。我的想法是安排这个函数,这样它大约每天运行一次。经过更多的研究,我应该能够解决这个问题(使用this post).

现在我的问题是,这是否是良好的做法。我认为安排每天晚上运行这些功能会很好(我们有8000多名艺术家,所以我不想让这些功能减慢网站的访问速度),但也许还有另一种有效的方法来构建如此大的数据集。

功能:

function json_events() {

  $args = array( 
    \'post_type\' => \'events\',
    \'posts_per_page\' => -1,
    \'post_status\' => \'publish\'
  );

  $query = new WP_Query($args);

  $json = array();

  while ($query->have_posts()): $query->the_post();
    $json[] = get_the_title();
  endwhile;
  wp_reset_query();

  $fp = fopen(\'events.json\', \'w\');
  fwrite($fp, json_encode($json));
  fclose($fp);
}

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

我的想法是安排这个函数,这样它大约每天运行一次。经过更多的研究,我应该能够解决这个问题(使用本文)。

请注意WP_Cron 无法控制每天设置为exactly 创造发生的时间。如果晚上没有人访问您的站点,那么早上的第一个用户将经历很长的页面加载时间。有一些变通方法,有时我会使用:创建一个钩住shutdown 操作,然后通过该函数调用运行繁重工作的urlcurl.

但是,如果您有权访问cron table 最好使用此功能。

也因为搜索引擎会触发WP_Cron 同样,在搜索引擎访问时,也有可能会开始缓慢的工作,导致页面加载缓慢,从而影响SEO。

…但也许有另一种有效的方法来构建如此大的数据集。

如果需要刷新all 每天的文件内容几乎没有机会。但如果all 您的艺术家/活动CPT帖子标题不会每天更改,您可以

挂接一次文件创建save_post, post_updateddelete_post 当添加新的艺术家或活动时,increment the prefetch file (即,只需附加新标题,而不是构建整个文件)和新标题。当标题更新或帖子被删除(或从垃圾桶中还原)时,用这种方式重新创建文件don\'t 需要运行任何繁重的计划任务,并且不会出现网站速度减慢的情况。

我编写了一个简单的插件,可以实现增量保存。插件将json文件保存在WP中uploads a下的目录/json 子文件夹。

<?php 
/**
 * Plugin Name: Json Posts Incremental
 * http://wordpress.stackexchange.com/questions/113198/json-schedule-creation-of-json-file
 * Author: G. M.
 * Author URI: http://wordpress.stackexchange.com/users/35541/
 */

class Json_Posts_Incremental {

  static $types = array(\'artists\', \'events\');

  static $path;

  static $url;

  static function init() {
    self::set_path();
    add_action(\'admin_init\', array( __CLASS__, \'build_all\') );
    add_action(\'delete_post\', array( __CLASS__, \'update\'), 20, 1 );
    add_action(\'post_updated\', array( __CLASS__, \'update\'), 20, 3 );
  }

  static function build_all() {
    foreach ( self::$types as $type ) self::build($type, false);
  }

  static function update( $post_ID = 0, $post_after = null, $post_before = null) {
    if ( ! empty($post_after) && ! empty($post_before) ) {
      $new = $post_before->post_status == \'auto-draft\' || $post_before->post_status == \'new\';
      if ( $new ) return self::increment($post_ID, $post_after, false);
      $skip = $post_after->post_status != \'publish\' && $post_before->post_status != \'publish\';
      if ( $skip ) return;
      $trash = ( $post_after->post_status == \'trash\' && $post_before->post_status == \'publish\' ) || // trash
        ( $post_after->post_status == \'publish\' && $post_before->post_status == \'trash\' ); // restore
      if ( ! $trash && ( $post_after->post_title == $post_before->post_title ) ) return;
    } else {
      $post_after = get_post($post_ID);
      if ( ! is_object($post_after) || ! isset($post_after->post_type) || $post_after->post_status == \'trash\' ) return;
    }
    if ( in_array($post_after->post_type, self::$types) ) self::build( $post_after->post_type, true );
  }

  static function increment( $post_ID, $post, $update ) {
    if ( $update || ! in_array($post->post_type, self::$types) ) return;
    $file = trailingslashit(self::$path) . $post->post_type . \'.json\';
    $content = file_exists($file) ? file_get_contents($file) : \'[]\';
    $content = rtrim($content, \']\');
    if ( $content != \'[\') $content .= \',\';
    $content .= json_encode($post->post_title) . \']\';
    self::write($file, $content);
  }

  static function get_json( $type ) {
    $file = trailingslashit(self::$path) . $type . \'.json\';
    return ( file_exists($file) ) ? file_get_contents($file) : \'\';
  }

  static function get_json_file( $type ) {
    $file = trailingslashit(self::$path) . $type . \'.json\';
    return ( file_exists($file) ) ? $file : \'\';
  }

  static function get_json_url( $type ) {
    $file = trailingslashit(self::$path) . $type . \'.json\';
    return ( file_exists($file) ) ? trailingslashit(self::$url) . $type . \'.json\' : \'\';
  }   

  private static function build( $type = \'\', $force = false ) {
    if ( ! in_array($type, self::$types) ) return;
    $file = trailingslashit(self::$path) . $type . \'.json\';
    if ( file_exists($file) && ! $force ) return;
    $titles = array();
    $posts = get_posts("post_type=$type&nopaging=1");
    if ( ! empty($posts) ) {
      foreach ( $posts as $post )
        $titles[] = apply_filters(\'the_title\', $post->post_title);
      $content = json_encode( $titles );
      self::write($file, $content);
    }
  }

  private static function set_path() {
    $upload_dir = wp_upload_dir();
    self::$path = $upload_dir[\'basedir\'] . \'/json\';
    self::$url = $upload_dir[\'baseurl\'] . \'/json\';
    if ( ! file_exists(self::$path) ) mkdir(self::$path, 0775);
  }

  private static function write( $file = \'\', $content = \'\' ) {
    $fp = fopen($file, \'w\');
    fwrite($fp, $content);
    fclose($fp);
  }

}

add_action(\'init\', array(\'Json_Posts_Incremental\', \'init\') );
要检索json文件url,例如要将其传递给js,可以使用Json_Posts_Incremental::get_json_url($type) 哪里$type 是职位类型,例如。events.

其他实用功能包括:

Json_Posts_Incremental::get_json_file($type) 检索文件路径。

Json_Posts_Incremental::get_json($type) 以字符串形式检索json内容。

结束

相关推荐

以声明方式在XML、JSON或YAML中配置WordPress

在谷歌上找不到这个。。。是否有任何简便的方法可以使用XML/JSON/YAML等完全(或部分)配置Wordpress站点(插件和所有插件)?总的来说,我正在寻找一种可读性强、声明性强的方式来设置Wordpress,并尽量减少处理PHP的工作量。