我的想法是安排这个函数,这样它大约每天运行一次。经过更多的研究,我应该能够解决这个问题(使用本文)。
请注意WP_Cron
无法控制每天设置为exactly
创造发生的时间。如果晚上没有人访问您的站点,那么早上的第一个用户将经历很长的页面加载时间。有一些变通方法,有时我会使用:创建一个钩住shutdown
操作,然后通过该函数调用运行繁重工作的urlcurl
.
但是,如果您有权访问cron table 最好使用此功能。
也因为搜索引擎会触发WP_Cron
同样,在搜索引擎访问时,也有可能会开始缓慢的工作,导致页面加载缓慢,从而影响SEO。
…但也许有另一种有效的方法来构建如此大的数据集。
如果需要刷新all 每天的文件内容几乎没有机会。但如果all 您的艺术家/活动CPT帖子标题不会每天更改,您可以
挂接一次文件创建save_post
, post_updated
和delete_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内容。