我的函数中有一个函数。php文件,该文件用于在过期后更新我的帖子状态。我在测试中调用此函数。php文件,它也是一个带有url/测试搜索结果/的模板页面。如果我通过浏览器访问此url,该函数将启动并执行它应该执行的操作。
我想创建一个服务器端cronjob来实现这一点,但我似乎无法正确实现这一点。我已经联系了我的主机,他们确认路径正确,cron正在执行si。问题一定是我的脚本。
请有人告诉我,为了让cronjob执行脚本,我必须对脚本进行哪些更改。
函数在我的函数中。php文件:
function expire_posts () {
$args = array (
\'post_type\' => \'post\',
\'meta_key\' => \'Expiry Date\',
\'meta_value\' => date(\'Y-m-d\'),
\'meta_compare\' => \'<\',
);
$query = new WP_Query($args);
if( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
$post_id = get_the_ID();
$post_data = array(
\'ID\' => $post_id,
\'post_type\' => \'post\',
\'post_status\' => \'expired\',
\'post_modified\' => current_time ( \'mysql\' ),
);
wp_update_post($post_data);
endwhile;
wp_reset_postdata();
endif;
}
我在测试中调用该函数。php文件如下:
expire_posts();
我的cronjob遵循的路径是:
/home/userID/public_html/wp-content/themes/twentyseventeen-child/test.php
我希望有人能解释为什么我的脚本没有通过cronjob执行。
SO网友:TheDeadMedic
当您使用*nix cron运行这样的PHP文件时,不会加载WordPress。您可以手动加载,但更好的方法是使用WordPress自己的cron API.
在您的functions.php
:
if ( ! wp_next_scheduled( \'expire_posts\' ) ) {
wp_schedule_event( time(), \'hourly\', \'expire_posts\' );
}
我用过
hourly
, 其他可用默认值包括
daily
&;
twicedaily
(
more on scheduling).
现在让我们把你的expire_posts
功能到我们新创建的expire_posts
事件:
add_action( \'expire_posts\', \'expire_posts\' );
塔达!
注意:WordPress cron依赖于一个请求(即用户或访问站点的机器人),其频率至少与您的日程安排相同,以确保运行顺利。如果您的站点处于安静状态,我们可以使用*nix cron每隔15分钟触发WordPress cron API,并让WordPress处理自己的内部事件。
首先,在中禁用默认的基于请求的cron行为wp-config.php
:
define( \'DISABLE_WP_CRON\', true );
现在设置*nix cron以触发WordPress的cron:
/15 * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron
SO网友:Kaperto
使用WP cron,您可以每天、每天两次或每小时启动一个操作:
https://codex.wordpress.org/Function_Reference/wp_schedule_event
如果需要另一个句点,可以使用过滤器定义它cron_schedules
就像这样:
// execute the function "expire_posts" when the action "MyPlugin__cron_clean_post" is launched
add_action("MyPlugin__cron_clean_post", "expire_posts");
add_action("wp_loaded", function () {
// launch the action "MyPlugin__cron_clean_post" every 15 minutes
if (!wp_next_scheduled("MyPlugin__cron_clean_post")) {
wp_schedule_event(1, "15_minutes", "MyPlugin__cron_clean_post");
}
});
add_filter("cron_schedules", function ($cron_schedules) {
$cron_schedules["15_minutes"] = [
"display" => "15 minutes",
"interval" => 15 * MINUTE_IN_SECONDS,
];
return $cron_schedules;
});