允许编辑编辑待定帖子,但不允许编辑草稿帖子

时间:2013-04-09 作者:Christine Cooper

我有大量使用编辑器的用户Capabilities 这有助于完成帖子提交。这是我当前对此角色的设置:

Editor Capabilities

正如你所看到的,他们被允许edit_postsedit_others_posts 但他们不能edit_published_posts. 这意味着他们可以编辑处于草稿和待处理状态的帖子。

现在,我想限制他们only 能够编辑挂起的帖子。因此,他们将无法接触选秀岗位(unless 如果他们是这篇文章的作者)。不幸的是,没有像edit_pending_posts... <应该有。

如何解决此问题?

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

这其实并不难。要添加新功能,请调用WP_Roles->add_cap(). 您只需执行一次,因为它将存储在数据库中。所以我们使用插件激活挂钩。

其他读者注意:以下所有代码都是plugin territory.

register_activation_hook( __FILE__, \'epp_add_cap\' );

/**
 * Add new capability to "editor" role.
 *
 * @wp-hook "activate_" . __FILE__
 * @return  void
 */
function epp_add_cap()
{
    global $wp_roles;

    if ( ! isset( $wp_roles ) )
        $wp_roles = new WP_Roles;

    $wp_roles->add_cap( \'editor\', \'edit_pending_posts\' );
}
现在我们必须筛选所有…

current_user_can( $post_type_object->cap->edit_post, $post->ID );
…因为这就是WordPress检查用户是否可以编辑帖子的方式。在内部,这将映射到edit_others_posts 其他作者职位的能力。

所以我们必须过滤user_has_cap 看看我们的新edit_pending_posts 当一些人想要使用edit_post 能力。

我已经包括delete_post 也是,因为这也是一种编辑。

听起来很复杂,但其实很简单:

add_filter( \'user_has_cap\', \'epp_filter_cap\', 10, 3 );

/**
 * Allow editing others pending posts only with "edit_pending_posts" capability.
 * Administrators can still edit those posts.
 *
 * @wp-hook user_has_cap
 * @param   array $allcaps All the capabilities of the user
 * @param   array $caps    [0] Required capability (\'edit_others_posts\')
 * @param   array $args    [0] Requested capability
 *                         [1] User ID
 *                         [2] Post ID
 * @return  array
 */
function epp_filter_cap( $allcaps, $caps, $args )
{
    // Not our capability
    if ( ( \'edit_post\' !== $args[0] && \'delete_post\' !== $args[0] )
        or empty ( $allcaps[\'edit_pending_posts\'] )
    )
        return $allcaps;

    $post = get_post( $args[2] );


    // Let users edit their own posts
    if ( (int) $args[1] === (int) $post->post_author
        and in_array(
            $post->post_status,
            array ( \'draft\', \'pending\', \'auto-draft\' )
        )
    )
    {
        $allcaps[ $caps[0] ] = TRUE;
    }
    elseif ( \'pending\' !== $post->post_status )
    { // Not our post status
        $allcaps[ $caps[0] ] = FALSE;
    }

    return $allcaps;
}

结束

相关推荐

子主题中的Comments.php更改不会显示在站点上

我正在尝试自定义评论中的评论模板。php和so对代码进行了一些更改,包括wp\\u list\\u comments()中的回调函数(我在functions.php中定义了该函数)所有这些更改在我的本地开发机器上都可以正常工作,但不知何故,当我上传评论时,我看不到任何更改。php和函数。php在我的主题文件夹的根目录中。我尝试过取消激活和重新激活所有插件,但仍然没有成功。现在我快发疯了。有人知道可能出了什么问题吗?