Разрешить редакторам редактировать ожидающие сообщения, но не черновики

У меня есть большое количество пользователей с Редактором Возможности , которые помогают пройти через сообщения. Это моя текущая настройка для этой роли:

Возможности редактора

Как вы можете видеть, им разрешено edit_posts и edit_others_posts, но они не могут edit_published_posts. Это означает, что они могут редактировать сообщения, находящиеся в статусе Черновик и Ожидание .

Теперь я хочу ограничить их только возможностью редактирования ожидающих сообщений. Таким образом, у них не будет возможности касаться черновиков сообщений (, если , если они являются авторами сообщения). К сожалению нет такой возможности, как edit_pending_posts ... должен быть .

Как это решить?

8 голосов | спросил Christine Cooper 9 PMpTue, 09 Apr 2013 21:07:32 +040007Tuesday 2013, 21:07:32

1 ответ


4

На самом деле это не сложно. Чтобы добавить новую возможность, вызовите WP_Roles->add_cap(). Вы должны сделать это только один раз, потому что он будет храниться в базе данных. Поэтому мы используем крючок активации плагинов.

Примечание для других читателей: весь следующий код область плагина .

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;
}
ответил fuxia 15 AMpMon, 15 Apr 2013 08:48:58 +040048Monday 2013, 08:48:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132