设置帖子到期并在到期时删除帖子

时间:2019-05-30 作者:willwoody

我正在尝试创建一个函数,允许我在一天的日期等于或高于自定义ACF字段中填写的日期时删除文章。

我在我的单曲中写了下面的函数。php来测试它。它可以工作,但您必须阅读相关文章才能执行此函数(实际上非常符合逻辑)。

我想要的是,这个函数在所有文章上自动运行,而不必转到文章。这对我来说很困难,我经常使用插件来做这样的事情。

你能告诉我一些达到预期效果的方法吗?我真的在寻找使用Wordpress来提高我的后端技能,所以我不是特别要求现成的解决方案,而是如何指导我的工作。

功能如下:

/**
 * Draft after expiration
 */

function draft_the_post(){
    $expire_date = get_field( "field_5cef86384e5f2" );
    $actual_date = date("d-m-Y");
    $postid = $post->ID;

    if ($expire_date <= $actual_date) {
        wp_update_post(array(
            \'ID\'    =>  $postid,
            \'post_status\'   =>  \'draft\'
        ));
    } else {
        echo "Not same date or inferior than today";
    };
}
哦,请原谅我的英语,我是法国人:-)

我先谢谢你,willwoody。

1 个回复
SO网友:gdarko

正确的方法是使用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\' );