Как удалить кнопку "Добавить новую запись" в произвольном типе записи?
У меня есть много произвольных типов записей, которым нужна функция "Добавить [произвольный тип записи]", но у меня есть произвольный тип записи "О нас", и мне не нужна кнопка "Добавить новую запись" для этого типа записи. Поэтому я хочу удалить кнопку вверху, на которой написано "Добавить О нас".
Вот что я имею в виду:
Есть идеи, как я могу удалить эту кнопку?

Более элегантное решение — отключить возможность создания записей пользовательского типа (custom_post_type):
Просто передайте параметр 'create_posts' => 'do_not_allow',
в массиве capabilities при вызове функции register_post_type
.
$args = array(
'label' => __( 'Пользовательский тип записи', 'text_domain' ),
'description' => __( 'Пользовательский тип записи', 'text_domain' ),
'labels' => $labels,
'supports' => array( ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'map_meta_cap' => true,
'capabilities' => array(
'create_posts' => 'do_not_allow'
)
);
register_post_type( 'custom_post_type', $args );

Есть ли недостатки у такого подхода? Это кажется гораздо лучшим решением, чем просто скрывать ссылки с помощью CSS.

Подтверждаю, что это работает! Это должно быть принятым ответом, так как не использует CSS-костыли.

Не работает в 4.7.2
... Кроме того, параметр вообще не должен принимать boolean
значение. Должно быть строковое значение: do_not_allow
.

не самое предпочтительное решение, иногда просто не должно быть возможности создавать "записи" без заранее определенного контекста. Некоторые вещи — это просто UX-конфетки, а альтернатива в виде попытки выдавать возможности на основе контекста в админке — это кошмар, который невозможно поддерживать.

Есть связанный баг в WP #22895 (https://core.trac.wordpress.org/ticket/22895), из-за которого страница edit.php для CPT не отображается, если в подменю админки для CPT будет только пункт "Все записи". Обходное решение есть по ссылке https://wordpress.stackexchange.com/questions/178033/disable-posts-only-allow-to-edit-existing-pages-not-create-new-ones-create-po.

Чтобы иметь возможность выбирать для каждой роли, кто может создавать записи CPT, нужно указать 'capabilities' => array('create_posts' => 'create_custom_post_types')), где 'custom_post_types' — это имя вашего CPT с добавленной 's'. Или второй элемент массива capability_type, если вы определили его таким образом.

Пожалуйста, ознакомьтесь с кодом ниже:
function disable_new_posts() {
// Скрываем ссылку в боковой панели
global $submenu;
unset($submenu['edit.php?post_type=CUSTOM_POST_TYPE'][10]);
// Скрываем ссылку на странице списка записей
if (isset($_GET['post_type']) && $_GET['post_type'] == 'CUSTOM_POST_TYPE') {
echo '<style type="text/css">
#favorite-actions, .add-new-h2, .tablenav { display:none; }
</style>';
}
}
add_action('admin_menu', 'disable_new_posts');

Спасибо, действительно ценю это. Ещё один вопрос по коду: можно ли его использовать для удаления других элементов на той же странице? Например, "Поиск" справа.

Да, но для этого вам нужно изменить соответствующие элементы в коде.

Если вы просто хотите убрать пункт Добавить новое и не используете custom_post_type
, вам не следует использовать 'capability_type' => 'custom_post_type'
. Лучше удалить этот код. Удачи :)
Демонстрация ниже:
array(
'labels' => $member_labels,
'has_archive' => true,
'public' => true,
'hierarchical' => true, // как страница
'rewrite' => array('slug' => 'member_pages'),
'supports' => array(
'title',
'editor',
'excerpt',
'custom-fields',
'thumbnail',
'page-attributes',
),
'taxonomies' => array('post_tag', 'cm_club'),
// 'capability_type' => 'custom_post_type',
'capabilities' => array(
'create_posts' => false,
),
'map_meta_cap' => true,
)

Отредактировал ответ @TompaLompa, так как он был неполным. Добавление create_posts => false
не будет работать, если map_meta_cap
не установлен в true
.
Если не устанавливать этот параметр (или установить его в false
), это также отключит возможность редактирования типа записи. Это связано с тем, что вам потребуется добавить edit_post
для каждой роли пользователя, чтобы можно было добавлять И редактировать записи вашего типа.
Установка этого параметра задействует внутреннюю систему WordPress для обработки мета-возможностей и сделает всё автоматически, если вам не требуется более тонкий контроль над правами ролей, чем стандартные возможности WordPress.

Лучший способ, который я нашел, это установить плагин add-admin-javascript и активировать его, затем перейти в настройки и добавить JavaScript. Напишите этот код в последнем поле:
$('.wrap .wp-heading-inline').remove();
$('.wrap .page-title-action').remove();
$('#wp-admin-bar-new-content').remove();
