根据发布时间自动逐条删除帖子

时间:2019-04-25 作者:Adham Mohamed

如何根据帖子每24小时发布的时间逐个删除帖子?

为什么这段代码会一次删除所有帖子,即使它们不是在同一时间或同一天发布的?

非常感谢你的帮助。

add_action( \'wp\', \'delete_expired_story_daily\' );
function delete_expired_story_daily() {
    if ( ! wp_next_scheduled( \'delete_expired_story\' ) ) {
        wp_schedule_event( time(), \'daily\', \'delete_expired_story\');
    }
}
已过期的回调。

add_action( \'delete_expired_story\', \'delete_expired_story_callback\' );

function delete_expired_story_callback() {
    $args = array(
        \'post_type\' => \'post\',
        \'category_name\' => \'stories\',
        \'posts_per_page\' => -1
    );

    $stories = new WP_Query($args);
    if ($stories->have_posts()):
        while($stories->have_posts()): $stories->the_post();    

            $expiration_date = get_post_meta( get_the_ID(), \'expiry_story_date\', true );
            $expiration_date_time = strtotime($expiration_date);

            if ($expiration_date_time < time()) {
                wp_delete_post(get_the_ID(),true);                 
            }

        endwhile;
    endif;
}

Update 1

我试图使用时间戳,但仍然不起作用?

我使用时间戳添加了发布时间+86400!

add_action( \'wp\', \'delete_expired_story_daily\' );
function delete_expired_story_daily() {
    if ( ! wp_next_scheduled( \'delete_expired_story\' ) ) {
        wp_schedule_event( time(), \'daily\', \'delete_expired_story\');
    }
}

add_action( \'delete_expired_story\', \'delete_expired_story_callback\' );

function delete_expired_story_callback() {
    $args = array(
    \'post_type\' => \'post\',
    \'category_name\' => \'stories\',
    \'post_status\' => \'publish\',
    \'posts_per_page\' => -1
    );

    $stories = new WP_Query($args);
    if ($stories->have_posts()):
        while($stories->have_posts()): $stories->the_post();    

    $publish_time = get_the_time(\'U\'); // Returns our $publish time as a Unix timestamp
    $delete_time = $publish_time + 86400; // 60 sec * 60 min * 12 hrs = 43,200 sec
    $current_time = time(); // time is a the current time in a Unix timestamp

    if ( $current_time >= $delete_time ) {
        wp_delete_post(get_the_ID(), true);
    }

        endwhile;
    endif;
}

1 个回复
SO网友:Krzysiek Dróżdż

让我从第二个开始回答你的问题。。。所以

为什么要一次删除所有帖子

您正确安排了活动,因此它将每天运行一次。在运行的函数中,选择一些帖子并将其删除,如果它们已过期:

$args = array(
    \'post_type\' => \'post\',
    \'category_name\' => \'stories\',
    \'posts_per_page\' => -1
);

$stories = new WP_Query($args);
上面的代码将从“故事”类别中选择所有帖子(因为posts\\u per\\u page=-1)。

在这里,您可以循环浏览所有这些帖子,检查给定帖子是否已过期,如果已过期,请将其删除:

    while($stories->have_posts()): $stories->the_post();    

        $expiration_date = get_post_meta( get_the_ID(), \'expiry_story_date\', true );
        $expiration_date_time = strtotime($expiration_date);

        if ($expiration_date_time < time()) {
            wp_delete_post(get_the_ID(),true);                 
        }

    endwhile;
这就是它一次删除所有帖子的原因。

那么如何让它只删除一篇帖子呢

修改代码的最简单方法是添加一行,在删除第一篇帖子后停止循环:

        if ($expiration_date_time < time()) {
            wp_delete_post(get_the_ID(),true);    
            return;             
        }
但这当然不是最好的方式。

更好的方法是只获取应该删除的帖子,只获取其中一个:

$args = array(
    \'post_type\' => \'post\',
    \'category_name\' => \'stories\',
    \'posts_per_page\' => 1,
    \'meta_query\' => array(
        array( \'key\' => \'expiry_story_date\', \'compare\' => \'<=\', \'value\' => date(\'Y-m-d\') ) // here’s the very important part - you have to change the date format so it’s the same as the format you store in your custom fields
    )
);

$expired_stories = new WP_Query($args);

相关推荐

用于通过html表单插入数据的php文件的路径

我有一个HTML表单,可以将数据插入到自定义表中。用于插入数据的代码位于PHP文件中。我的问题是,在WordPress文件系统中,PHP文件应该放在哪里?我尝试将文件放在根目录中,但不起作用。将其放在wp-content/themes/mytheme文件夹中。不起作用。找不到错误页。<form id=\"XXXForm\" method=\"POST\" action=\"/xxx_insert.php\"> 非常感谢您的帮助。大卫