Wordpress ограничивает редактирование, но разрешает предварительный просмотр для пользовательского статуса публикации

Я разрабатываю сайт Wordpress с помощью плагина Edit Flow, поэтому я могу создавать собственные статусы сообщений, чтобы упростить управление сообщениями авторов и участников.

Итак, я создал настраиваемый статус сообщения и получил следующий фильтр, чтобы ограничить возможности редактирования для этого сообщения. Он работает нормально, но проблема в том, что пользователи (кроме администратора) не могут предварительно просмотреть сообщение. Другие пользователи по-прежнему могут видеть ссылку «Предварительный просмотр» в списке сообщений на панели управления, но если они нажмут на нее и перейдут на страницу предварительного просмотра публикации (../post-with-custom-status/?preview=true), будет указано, что сообщение может ' не найти.

function restrict_edit_custom_status_posts( $allcaps, $cap, $args ) {

    // Bail out if we're not asking to edit a post ...
    if( 'edit_post' != $args[0]
        // ... or user is admin
        || !empty( $allcaps['manage_options'] )
        // ... or user already cannot edit the post
        || empty( $allcaps['edit_posts'] ))
        return $allcaps;

    // Load the post data:
    $post = get_post( $args[2] );

    // If post have custom status
    if( 'my_custom_status' == $post->post_status ) {
    // Then disallow editing
    $allcaps["edit_posts"] = FALSE;
        return $allcaps;
    }

    return $allcaps;
}

add_filter( 'user_has_cap', restrict_edit_custom_status_posts10, 3 );

Итак, есть ли способ ограничить возможность редактирования, но разрешить предварительный просмотр?


person user1449504    schedule 06.05.2013    source источник
comment
Повторяющийся вопрос о WPSE.   -  person montrealist    schedule 06.05.2013
comment
Комментарий бесконечного цикла.   -  person Jimbali    schedule 19.08.2013


Ответы (1)


Вы можете использовать фильтр "posts_results", чтобы "изменить" статус вашего сообщения на "опубликовать" только для предварительного просмотра и администратора с хорошей ролью: (изменение не сохраняется)

add_filter( 'posts_results', array( get_class(), 'change_post' ), 10, 2 );

public static function change_post( $posts ) {


    if ( empty( $posts )) {
        return;
    }

    if(!empty($_GET['preview'])){

        if($_GET['preview'] == true){
            if(current_user_can('preview_your_post_type')){
                $post_id = $posts[0]->ID;
                $post_type = $posts[0]->post_type;
                $posts[0]->post_status = 'publish';
            }
        }
    }

    return $posts;
}
person Stoule    schedule 17.09.2014