Как удалить стандартный тип записи из панели инструментов админки

5 февр. 2018 г., 05:30:30
Просмотры: 21.2K
Голосов: 11

Мы настраиваем новый WordPress для использования пользовательских типов записей, и хотим, чтобы наши редакторы при входе в систему видели только настроенные типы записей, а не стандартный тип 'post'. Нам удалось удалить 'post' из меню администратора, используя этот способ, но в панели инструментов всё еще остается кнопка "+ Добавить", которая содержит опцию создания записи и по умолчанию создает запись. Есть ли простой и безопасный способ удалить пункт "запись" из кнопки добавить на панели инструментов и/или скрыть саму кнопку добавить?

2
Комментарии

Если вы удалите возможности, связанные с записями, из роли Редактора (или любой другой, которую вы используете), эти опции не должны отображаться.

Jacob Peattie Jacob Peattie
5 февр. 2018 г. 05:38:30

Если тип записи отказывается удаляться, и если функция "register_post_type" не находится в functions.php, проверьте, не сохранена ли регистрация в "must use plugin". Напоминаю, я оставляю этот комментарий в начале своего functions.php: "/ если что-то застряло, проверь must use plugins!!! /"

Dave Miller Dave Miller
22 апр. 2023 г. 15:53:20
Все ответы на вопрос 4
2
17

Для полного скрытия типа записи по умолчанию необходимо подключиться к 3 различным хукам действий. Однако прямой доступ к записям по URL всё равно останется возможным. Давайте начнём.

Боковое меню

add_action( 'admin_menu', 'remove_default_post_type' );

function remove_default_post_type() {
    remove_menu_page( 'edit.php' );
}

Ссылка + Новый > Запись в панели администратора

add_action( 'admin_bar_menu', 'remove_default_post_type_menu_bar', 999 );

function remove_default_post_type_menu_bar( $wp_admin_bar ) {
    $wp_admin_bar->remove_node( 'new-post' );
}

Ссылка + Новый в панели администратора

function remove_add_new_post_href_in_admin_bar() {
    ?>
    <script type="text/javascript">
        function remove_add_new_post_href_in_admin_bar() {
            var add_new = document.getElementById('wp-admin-bar-new-content');
            if(!add_new) return;
            var add_new_a = add_new.getElementsByTagName('a')[0];
            if(add_new_a) add_new_a.setAttribute('href','#!');
        }
        remove_add_new_post_href_in_admin_bar();
    </script>
    <?php
}
add_action( 'admin_footer', 'remove_add_new_post_href_in_admin_bar' );


function remove_frontend_post_href(){
    if( is_user_logged_in() ) {
        add_action( 'wp_footer', 'remove_add_new_post_href_in_admin_bar' );
    }
}
add_action( 'init', 'remove_frontend_post_href' );

Виджет "Быстрый черновик" в консоли

add_action( 'wp_dashboard_setup', 'remove_draft_widget', 999 );

function remove_draft_widget(){
    remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
}
5 февр. 2018 г. 16:21:21
Комментарии

Это самый чистый способ, хотя кнопка New в админ-баре всё ещё ведёт на post-new.php — это можно отключить с помощью JavaScript, например: $(document).on('click', '#wp-admin-bar-new-content', function(){ return false })

Mina Mina
27 июл. 2019 г. 13:39:46

Это выглядит безупречно работающим, но: виджет "Обзор" по-прежнему показывает записи (и он в любом случае не показывает пользовательские типы записей!), так же как и раздел "Следующие шаги" в элементе дашборда "Добро пожаловать в WP" [который я, кстати, ненавижу и всегда закрываю]. Также в "Активности" могут показываться записи, но этого не должно быть, если всё настроено аккуратно.

user3445853 user3445853
25 мар. 2021 г. 22:55:42
0
14

Альтернативное, но похожее решение по сравнению с вариантами Стефана и Рафаэля. Этот код не вызывает ошибок, и обратите внимание, что при прямом переходе по адресу /wp-admin/edit.php вы не сможете просмотреть список записей (стандартный тип записи) или редактировать их.

Важно: этот код фактически не отключает стандартный тип записи, то есть существующие записи останутся опубликованными и доступными по публичным URL. Он эффективно отключает доступ к стандартному типу записи в админ-панели для всех пользователей.

function remove_default_post_type($args, $postType) {
    if ($postType === 'post') {
        $args['public']                = false;
        $args['show_ui']               = false;
        $args['show_in_menu']          = false;
        $args['show_in_admin_bar']     = false;
        $args['show_in_nav_menus']     = false;
        $args['can_export']            = false;
        $args['has_archive']           = false;
        $args['exclude_from_search']   = true;
        $args['publicly_queryable']    = false;
        $args['show_in_rest']          = false;
    }

    return $args;
}
add_filter('register_post_type_args', 'remove_default_post_type', 0, 2);
4 янв. 2020 г. 09:03:45
4

В принципе, можно отменить регистрацию уже зарегистрированных типов записей с помощью функции unregister_post_type(). К сожалению, это невозможно для встроенных (_builtin) типов записей.

Альтернативный вариант — изменить права доступа, необходимые для редактирования/создания/удаления/... записей определённого типа. Вы можете использовать фильтр register_post_type_args для изменения прав доступа, требуемых для стандартного типа записи post. Если установить все права в false, это приведёт к тому, что никто не сможет получить доступ к стандартному типу записи. WordPress достаточно умен, чтобы автоматически скрыть соответствующие пункты меню.

add_filter('register_post_type_args', function($args, $postType){
    if ($postType === 'post') {
        $args['capabilities'] = [
            'edit_post' => false,
            'read_post' => false,
            'delete_post' => false,
            'edit_posts' => false,
            'edit_others_posts' => false,
            'publish_posts' => false,
            'read' => false,
            'delete_posts' => false,
            'delete_private_posts' => false,
            'delete_published_posts' => false,
            'delete_others_posts' => false,
            'edit_private_posts' => false,
            'edit_published_posts' => false,
            'create_posts' => false,
        ];
    }

    return $args
}, 0, 2);
5 февр. 2018 г. 16:42:35
Комментарии

Спасибо, я поместил этот код в функцию, которая запускалась по событию 'init', но это, кажется, не оказало никакого влияния на мой интерфейс. Я использую неправильное событие?

Paul Keister Paul Keister
5 февр. 2018 г. 19:48:37

Это слишком поздно. WordPress регистрирует все встроенные (_builtin) типы записей на действии init, но с приоритетом 0.

Приведённый выше код просто регистрирует фильтр, вам не нужно помещать его внутрь другого действия/фильтра — просто напишите его напрямую в functions.php вашей темы, например.

Stefan Stefan
5 февр. 2018 г. 20:47:33

+1. Проблема в том, что он выдаёт 3 уведомления. "Notice: Undefined offset: 0 in /var/www/html/wp-includes/capabilities.php on line 70". Я не смог от них избавиться.

noway noway
17 нояб. 2019 г. 13:37:41

Обратите внимание, что это не удаляет таксономии "category" и "post_tag", поэтому пункт меню навигации "Записи" остается (хотя без возможности просматривать или редактировать сами записи).

W Biggs W Biggs
22 июл. 2020 г. 18:31:32
1

Решение Стефана отличное, но если включить режим отладки, можно увидеть: Undefined offset: 0 в wp-includes/capabilities.php на строке 62 плюс отсутствует точка с запятой после return $args

Исчерпывающий код должен быть:

add_filter('register_post_type_args', function($args, $postType){
    if ($postType === 'post' && current_user_can( 'create_posts' ) && current_user_can( 'edit_post' ) ) {
        $args['capabilities'] = [
            'edit_post' => false,
            'read_post' => false,
            'delete_post' => false,
            'edit_posts' => false,
            'edit_others_posts' => false,
            'publish_posts' => false,
            'read' => false,
            'delete_posts' => false,
            'delete_private_posts' => false,
            'delete_published_posts' => false,
            'delete_others_posts' => false,
            'edit_private_posts' => false,
            'edit_published_posts' => false,
            'create_posts' => false,
        ];
    }
    return $args;
}, 0, 2);
18 мар. 2019 г. 12:20:48
Комментарии

current_user_can выдает ошибку. На данном этапе эта функция еще не определена.

noway noway
17 нояб. 2019 г. 13:59:09