用户更新帖子时是否更改帖子状态?

时间:2012-10-18 作者:tyler

当某一类型的用户尝试更新其帖子时,是否有一种有效的方法将帖子状态从“已发布”更改为“草稿”。我试过这样的方法

function change_post_status($post_id)
{
  if(current_user_can(\'rolename\'))
  {
    $current_post = get_post( $post_id, \'ARRAY_A\' );
    $current_post[\'post_status\'] = \'draft\';
    wp_update_post($current_post);
  }
}

add_action(\'pre_post_update\',\'change_post_status\'); 
代码在我看来很好,但由于某些原因,它不能正常工作,我认为它会创建一个无休止的循环(迫使我重新启动SQL server)。

4 个回复
最合适的回答,由SO网友:tyler 整理而成

因此,我最终使用了wp\\u insert\\u post\\u数据过滤器,并提出了以下内容,经过测试,这些内容似乎工作正常。

add_filter(\'wp_insert_post_data\', \'change_post_status\', \'99\');

function change_post_status($data)
{
    if( (current_user_can(\'role\')) && ($data[\'post_type\'] == \'custom_post_type\') )
    {
        if(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) return;
        //then set the fields you want to update
        $data[\'post_status\'] = \'draft\';     
    }
    return $data;
}

SO网友:Daniel

您是否尝试使用“wp\\u insert\\u post\\u data”而不是“pre\\u post\\u update”?

SO网友:Rarst

既然你的逻辑是以角色为基础的,就不要给出它publish_posts 能力?土生土长的方式Contributor 角色有效。

SO网友:Asped

我想再补充一个问题。当你使用上面的代码时,每一篇文章都会发生这种情况,如果你在后端进行更新的话!因为每次更新帖子时都会触发wp\\U insert\\U post\\U数据,所以如果管理员想要发布帖子,它也会自动再次触发,并将帖子设置为草稿。所以再也不可能发布列表了。这里是一个对我有用的修改代码,请检查我们是否在管理后端:

function change_post_status( $data, $postarr ) {
      $data[ \'post_status\' ] = \'draft\';
      return $data;
}
if (!(is_admin())) {
  add_filter( \'wp_insert_post_data\' , \'change_post_status\' , \'99\', 2 );
}

结束

相关推荐

如何在Functions.php中使用PHP手动修复WordPress库代码?

Wordpress为内置的gallery功能输出了一些非常糟糕的代码,这已经被谈论了很多次了。这是负责库输出的核心代码(在/wp-includes/media.php中):function gallery_shortcode($attr) { global $post; static $instance = 0; $instance++; // Allow plugins/themes to override the de