在一定天数后自动起草特定类别的帖子

时间:2019-12-14 作者:Manish Bajpai

我想把两个类别的帖子在发布后的90天内自动起草,我在其他论坛的一些代码的帮助下创建了一个功能,但它不起作用。

岗位类型=property<分类法=property-ad-type
ID=(free-text-only-ad - ID:108), (photo-ad - ID: 107)目标天数=(90Days from the date of Publish)

我添加了这个函数

wp_schedule_event(time(), \'daily\', \'property_status_update\');
//add_action(\'init\',\'property_ad_status_update\');

function property_status_update() {
    $the_query = get_posts( \'post_type=property\' ); 
    foreach($the_query as $single_post) {
        $id=$single_post->ID;
        $post_date=get_post_modified;
        $taxonomy = \'property-ad-type\';
        if($taxonomy = \'108\' || $taxonomy = \'107\'){
            $today=date(\'Y-m-d\', strtotime(\'-24 days\'));
            if($post_date = $today){
                $update_post = array(
                   \'ID\'             => $id,
                   \'post_status\'    =>  \'draft\',
                   \'post_type\'  =>  \'property\' );
                wp_update_post($update_post);
            }   
        }
    }
}

1 个回复
SO网友:nmr

代码中最重要的两个注释。它不起作用,因为始终仅检索5(默认值为\'post_per_page\' 参数)最近的帖子。如果你想的话add a task to the cron, 你do not 指定function name 作为参数,但action hook. 然后将一个函数附加到此动作挂钩。

add_action( \'se354599_old_posts_to_draft\', \'{function-name}\' );
wp_schedule_event( time(), \'daily\', \'se354599_old_posts_to_draft\' );
任务只能添加到计划中一次,最好是在激活插件或主题时。但您也可以:

在计划任务后设置选项(add_option()), 并在使用计划任务之前检查它是否存在wp_schedule_event(),wp_next_scheduled())现在get_posts() 作用

要更新帖子的状态,无需检索帖子的所有数据,只需检索其ID即可。

\'fields\' => \'ids\'
您希望获得所有符合条件的帖子,因此需要设置post_per_page 参数到-1.
要将结果限制为90天前发布的帖子,请使用\'date_query\' 参数
要将结果限制为特定的自定义类别,请使用\'tax_query\' 参数

有了帖子ID,你所要做的就是更新他们的状态。使用wp_update_post() 将结果数组功能化或拆分为更小的部分(例如,每个30个项目),并批量更新帖子($wpdb->query(())

add_action( \'init\', \'se354599_add_cronjob\' );
add_action( \'se354599_old_posts_to_draft\', \'se354599_update_post\' );

function se354599_add_cronjob()
{
    if ( !wp_next_scheduled( \'se354599_old_posts_to_draft\' ) ) {
        wp_schedule_event(time(), \'daily\', \'se354599_old_posts_to_draft\');
    }
    // DISABLE
    //if ( wp_next_scheduled( \'se354599_old_posts_to_draft\' ) ) {
    //    wp_clear_scheduled_hook( \'se354599_old_posts_to_draft\' );
    //}
}

function se354599_update_post()
{
    $args = [
        \'post_type\'     => \'property\',
        \'fields\'        => \'ids\',
        \'post_per_page\' => -1,
        \'date_query\'    => [
            \'before\' => \'-90 day\',
        ],
        \'tax_query\' => [
            [
                \'taxonomy\'  => \'property-ad-type\',
                \'include_children\' => false,
                \'field\'     => \'term_id\',
                \'terms\'     => [107, 108],
                // --- or by slug: ---
                // \'field\'     => \'slug\',   // ‘term_id’, ‘name’, ‘slug’ or ‘term_taxonomy_id’
                // \'terms\'     => [\'free-text-only-ad\', \'photo-ad\'],
            ],
        ],
    ];
    $to_update = get_posts( $args );
    if ( !is_array($to_update) || empty($to_update) )
        return;

    $arg = [ \'ID\' => 0, \'post_status\' => \'draft\' ];
    foreach ( $to_update as $pID ) 
    {
        $arg[\'ID\'] = (int)$pID;
        wp_update_post( $arg );
    }
}

相关推荐

如何确保WP-Cron工作循环通过所有帖子?

我正在使用WP Crontrol,每天运行一些CRON作业来检查帖子的年龄。如果帖子提前2天发布,则会被删除。这是可行的,但由于某种原因,只有三天以上的帖子被删除了。还有一些仍在出版中。这一定是因为网站上大约有3000个帖子。有没有办法让我的CRON工作更有效率?以下是我运行的当前代码:class EventsWPCron { public function __construct() { if ( ! wp_next_scheduled( \'