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

8

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

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

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

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

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

Кристина Купер
источник

Ответы:

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;
}
Фуксия
источник
Я сделал тесты и столкнулся с несколькими проблемами. Во-первых, у меня было edit_postsи edit_others_postsс новым edit_pending_posts. Я попытался просто edit_pending_postsбез двух других, и меню сообщений не появилось. При тестировании я обнаружил, что могу добавить новое сообщение, но не смог сохранить черновик ( You are not allowed to edit this postуведомление). Вы тестировали, чтобы сохранить свой пост в этой роли? Редактирование ожидающих сообщений в порядке.
Кристина Купер
@ChristineCooper Это произошло потому, что $post->post_authorпередается как строка , но $args[1]как целое число. Иногда. Глупый WordPress! Я исправил это, приведя оба к целым числам. И я позволил редакторам редактировать свои собственные опубликованные посты. Если вы не хотите этого, удалите returnстроку в блоке после // Let users edit their own posts.
fuxia
Понял! Одна проблема остается. Я проверил ваш обновленный код, и он работал нормально! Однако я не хочу позволять редакторам редактировать свои опубликованные посты, поэтому я удалил эту return $allcaps;строку, и та же проблема с разрешением появляется при сохранении черновика. Почему?
Кристина Купер
Хм, у меня работает. Мои настройки возможностей
fuxia
Просто чтобы подтвердить, вы имели в виду удалить обратную строку под $allcaps[ $caps[0] ] = TRUE;? Очень странно, что я испытываю это, логически не имеет смысла, что это не должно работать для меня, если оно работает для вас, вот мои настройки: i.imgur.com/X3bv9rH.png
Кристина Купер