代码中最重要的两个注释。它不起作用,因为始终仅检索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 );
}
}