如何阻止作者编辑已安排的文章?

时间:2014-03-04 作者:jnbdz

在我的旧WordPress中,作者(一种无法发布的用户)在一篇文章被安排之后,无法返回到该文章并对其进行编辑。但现在在WordPress 8.1中,他们(作者)可以返回并编辑日程安排文章。有没有办法阻止这一切?

writer=参与者

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

我,就像@fischi 想想那个过滤器\'user_has_cap\' 是pourpose的最佳选项,然而,我认为这对工作更好,无论是$\\u GET post还是action:WordPress使用额外的参数,在每个post的基础上检查元可计算性。

简而言之,过滤时\'user_has_cap\' 对于元功能(请参见https://codex.wordpress.org/Function_Reference/map_meta_cap) 我们可以访问帖子ID,使用它我们可以阻止用户编辑或删除特定帖子。

add_filter( \'user_has_cap\', \'no_edit_prending_for_contrib\', 9999, 3 );

function no_edit_prending_for_contrib ( $allcaps, $caps, $args ) {
  // an arry of action we want to prevent
  $prevent = array(\'edit_posts\', \'delete_posts\');

  // we are not checking for edit a post, do nothing
  if ( ! array_intersect( $prevent, (array) $caps ) ) return $allcaps; 

  // we are not checking for a specific post, do nothing
  if ( ! isset( $args[2] ) || ! is_numeric( $args[2] ) ) return $allcaps;

  // the user has the capability to edit published posts, do nothing
  if ( array_key_exists( \'edit_published_posts\', (array) $allcaps ) ) return $allcaps;

  // if the post is not a future one, do nothing
  if ( get_post_status( $args[2] ) !== \'future\' ) return $allcaps;

  // if we are here we have to prevent user to edit or delete post
  if ( isset($allcaps[\'edit_posts\']) ) unset($allcaps[\'edit_posts\']);
  if ( isset($allcaps[\'delete_posts\']) ) unset($allcaps[\'delete_posts\']);
  return $allcaps;
}
使用此代码,贡献者仍然可以看到挂起的帖子,但以只读方式,就像其他用户发布的帖子一样。

SO网友:fischi

哎哟,这个问题很难解决;-)然而,问题是,你必须在这里深入挖掘。

功能current_user_can() 战后使用了许多不同的功能,但您可以筛选user_has_cap, 它基本上检查登录用户是否具有特定功能(duh)。

As投稿人(默认情况下)可以编辑状态为publish (如果我错了,请纠正我,我没有检查trash), 此外,加载管理屏幕时会多次检查功能,在返回错误之前,我们必须检查一些不同的内容:

用户可以edit_posts 首先`是要编辑的帖子的状态future?

如果没有post(通过$_GET[\'post\']) 设置后,过滤器可以不受限制地继续。

之后,您必须检查post_status 如果行动(通过$_GET[\'action\']) 是真正的“编辑”,当然,如果首先允许当前用户进行编辑。

add_filter( \'user_has_cap\', \'f711_restrict_editing_future\', 1, 3 );

function f711_restrict_editing_future ( $allcaps, $cap, $args ) {
    // check if a post ist set
    if ( !isset( $_GET[\'post\'] ) ) return $allcaps;
    // get the post
    $thispost = get_post( (int) $_GET[\'post\'] );
    // check everything else
    if ( $cap[0] == \'edit_posts\' && $thispost->post_status == \'future\' && $_GET[\'action\'] == \'edit\' && $allcaps[\'contributor\'] == 1 ) {
        wp_die( \'post is scheduled\' );
    }
    return $allcaps;
}
问题

此筛选用户角色的功能只会在用户想要编辑未来帖子时进行检查。您可能还需要过滤帖子列表,以避免首先显示指向帖子的链接。

第二个问题是,此解决方案取决于具有contributor. 如果要获得此问题的一般解决方案,您可能还需要调整这些设置。

然而,为了回答你的问题-with this function you prevent contributors to edit future posts

这不是最优雅的方式,但我希望你能有所改变:-)

结束

相关推荐

PHP致命错误:无法为wp-includes/capabilities.php中的非对象调用重载函数

我在apache日志中遇到了太多以下错误。PHP Fatal error: Cannot call overloaded function for non-object in wp-includes/capabilities.php on line 1187这是函数current\\u user\\u can($capability)的内部,第1187行如下所示:$current_user = wp_get_current_user(); 我不知道问题出在哪里?