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

Для полного скрытия типа записи по умолчанию необходимо подключиться к 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' );
}

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

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

Альтернативное, но похожее решение по сравнению с вариантами Стефана и Рафаэля. Этот код не вызывает ошибок, и обратите внимание, что при прямом переходе по адресу /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);

В принципе, можно отменить регистрацию уже зарегистрированных типов записей с помощью функции 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);

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

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

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

Решение Стефана отличное, но если включить режим отладки, можно увидеть: 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);
