正确的方法是使用WordPress Cron 并安排您的活动。此外,您还应该考虑添加真正的cron作业,如所述here 以获得更好的精度。
1)我修改了您的draft_the_post
支持参数的函数。所以现在我们可以指定哪个帖子,我也更新了检查时间的部分。
2.)dg_cron_schedule_delete_posts
如果启动init hook时未计划钩子,则将计划钩子。我将其设置为hourly
为了获得更好的精度,但您也可以将其设置为daily
. 注意:如果您使用插件执行此操作,最好使用激活挂钩并将其安排在此处。
3.)dg_delete_posts_handler
是处理删除的位置。它遍历所有POST并调用函数maybe_draft_the_post
在每个上。注意:这将查询所有帖子,因此根据数据的大小,这可能会导致性能问题。我建议实现某种队列,但这应该是一个很好的起点。
/**
* Function that will draft specific post on specific conditions
*
* @param \\WP_Post $_post
*/
function maybe_draft_the_post( $_post ) {
$expire_date = get_field( "your_field_name" );
// Bail if no expire date set.
if ( ! $expire_date ) {
return;
}
$expire_date = strtotime( $expire_date );
$actual_date = time();
if ( $expire_date <= $actual_date ) {
wp_update_post( array(
\'ID\' => $_post->ID,
\'post_status\' => \'draft\'
) );
}
}
/**
* Register cron event on init action
*/
function dg_cron_schedule_delete_posts() {
$timestamp = wp_next_scheduled( \'dg_delete_posts\' );
if ( $timestamp == false ) {
wp_schedule_event( time(), \'hourly\', \'dg_delete_posts\' );
}
}
add_action( \'init\', \'dg_cron_schedule_delete_posts\' );
/**
* Handle deletion of posts periodically.
* - Loop through the posts and call the draft_the_post function.
*/
function dg_delete_posts_handler() {
$posts = get_posts( array(
\'posts_per_page\' => - 1,
\'post_type\' => \'post\',
\'post_status\' => \'publish\',
) );
foreach ( $posts as $_post ) {
maybe_draft_the_post( $_post );
}
}
add_action( \'dg_delete_posts\', \'dg_delete_posts_handler\' );