Есть ли способ отключить возможность добавления нового сообщения в пользовательский тип публикации в WordPress (3.0)? Я просмотрел метки и аргументы, но не могу найти ничего похожего на такую функцию.
WordPress: отключить "Добавить новое" в пользовательском типе сообщения
Ответ 1
Полный кредит Симусу Лихи
Существует мета-функция
create_posts, которая задокументирована здесь и используется WordPress для проверки перед вставкой различных кнопок и ссылок "Добавить новый". В пользовательском объявлении типа записи добавьтеcapabilities(не путать сcap), а затем установите его наfalse, как показано ниже.register_post_type( 'custom_post_type_name', array( 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'do_not_allow', // false < WP 4.5, credit @Ewout ), 'map_meta_cap' => true, // Set to 'false', if users are not allowed to edit/delete existing posts ));Возможно, вы также захотите установить
map_meta_capнаtrue. Без этого вы больше не сможете получить доступ к страницам редактирования сообщений.
Могу ли я спросить, почему вы хотите это сделать?
Сначала я бы предложил изменить возможности для вашего пользовательского типа поста, но я не думаю, что есть такой, который ограничивает тех, кто может добавлять посты, а только тех, кто может их редактировать или публиковать.
Это выглядит немного грязно, но вы можете попробовать сбросить элемент в глобале $submenu;
function hide_add_new_custom_type()
{
    global $submenu;
    // replace my_type with the name of your post type
    unset($submenu['edit.php?post_type=my_type'][10]);
}
add_action('admin_menu', 'hide_add_new_custom_type');
Ответ 2
Существует мета-функция create_posts, которая задокументирована здесь и используется WordPress для проверки перед вставкой различных кнопок и ссылок "Добавить новый". В пользовательском объявлении типа записи добавьте capabilities (не путать с cap), а затем установите его на false, как показано ниже.
register_post_type( 'custom_post_type_name', array(
  'capability_type' => 'post',
  'capabilities' => array(
    'create_posts' => false, // Removes support for the "Add New" function ( use 'do_not_allow' instead of false for multisite set ups )
  ),
  'map_meta_cap' => true, // Set to 'false', if users are not allowed to edit/delete existing posts
));
Возможно, вы также захотите установить map_meta_cap на true. Без этого вы больше не сможете получить доступ к страницам редактирования сообщений.
Ответ 3
Комбинации вышеупомянутых решений работают для сокрытия ссылок (хотя кто-то может довольно легко ввести URL-адрес напрямую.
упомянутое решение @3pepe3 опирается на get_post_type(), которое будет работать только в том случае, если в списке уже есть запись. Если сообщений нет, функция не будет ничего возвращать, и будет доступна ссылка "Добавить новый". Альтернативный метод:
function disable_new_posts() {
    // Hide sidebar link
    global $submenu;
    unset($submenu['edit.php?post_type=CUSTOM_POST_TYPE'][10]);
    // Hide link on listing page
    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');
ОБНОВЛЕНИЕ: для предотвращения прямого доступа, если кто-то вводит URL-адрес в себя: https://wordpress.stackexchange.com/a/58292/6003
Ответ 4
В wordpress и для всех типов сообщений существует возможность create_posts. Эта возможность используется в нескольких основных файлах:
- сор-админ\редактировать форм-advanced.php
 - сор-админ\edit.php
 - сор-админ\включает\post.php
 - сор-админ\menu.php
 - сор-админ\после new.php
 - сор-админ\пресс-this.php
 - сор-включает в себя\админ-bar.php
 - сор-включает в себя\класс-сор-XMLRPC-server.php
 - сор-включает в себя \post.php
 
Итак, если вы действительно хотите отключить эту функцию, вы должны сделать это за роль и тип сообщения. Я использую отличный плагин "" Редактор роли пользователя" для управления возможностями для каждой роли.
Но как насчет возможности create_posts? Ну, эта возможность не отображается, а также create_posts равна create_posts, поэтому мы должны исправить это и сопоставить возможности для типа сообщений.
Итак, вы можете добавить этот фрагмент кода в свой файл functions.php, и вы сможете управлять этой возможностью.
function fix_capability_create(){
    $post_types = get_post_types( array(),'objects' );
    foreach ( $post_types as $post_type ) {
        $cap = "create_".$post_type->name;
        $post_type->cap->create_posts = $cap;
        map_meta_cap( $cap, 1); 
    }
}
add_action( 'init', 'fix_capability_create',100);
Итак, здесь мы не скрываем или не удаляем элементы меню... здесь мы удаляем возможности для пользователей (включая запросы xmlrpc).
Действие было init, а не admin_init или что-то еще, потому что init с приоритетом 100 предотвращает отображение "добавить новое" на панели администратора, боковой панели и т.д. (во всем интерфейсе wp).
Ответ 5
add_action("load-post-new.php", 'block_post');
function block_post()
{
    if($_GET["post_type"] == "custom_type") 
        wp_redirect("edit.php?post_type=custom_type");
}
		Ответ 6
  Отключить создание нового сообщения для зарегистрированных пост-типов: (пример для post и page)
function disable_create_newpost() {
    global $wp_post_types;
    $wp_post_types['post']->cap->create_posts = 'do_not_allow';
    //$wp_post_types['page']->cap->create_posts = 'do_not_allow';
    //$wp_post_types['my-post-type']->cap->create_posts = 'do_not_allow';
}
add_action('init','disable_create_newpost');
		Ответ 7
WordPress Networks:  Я обнаружил, что ответ Seamus Leahy не работает, если вы вошли в систему как супер администратор сети, это не имеет значения, если пользователь не имеет возможности, сопоставлен или иным образом, когда current_user_can ($ cap) вызывается CMS. Покопавшись в ядро, я обнаружил, что вы можете сделать следующее.
register_post_type( 'custom_post_type_name', array(
  'capability_type' => 'post',
  'capabilities' => array(
    'create_posts' => 'do_not_allow', // Removes support for the "Add New" function, including Super Admin's
  ),
  'map_meta_cap' => true, // Set to false, if users are not allowed to edit/delete existing posts
));
  принятый ответ скрывает пункт меню, но страница все еще доступна.
Ответ 8
@Стаффан Эстберг,
Это лучший способ скрыть кнопку "Добавить новую" или "Создать новую" в пользовательских почтовых сообщениях
'capability_type'    => 'post',
        'capabilities'       => array( 'create_posts' => false ),       
        'map_meta_cap'       => true,
Отключить создание нового сообщения в пользовательских типах сообщений как в меню администратора, так и над списком типа сообщения.
Ответ 9
Я нашел этот простой способ для этого. Просто введите этот код в темы function.php.
function hd_add_buttons() {
    global $pagenow;
    if (is_admin()) {
        if ($_GET['post_type'] == 'custom_post_type_name') {
            echo '<style>.add-new-h2{display: none !important;}</style>';
        }
    }
}
add_action('admin_head', 'hd_add_buttons');
		Ответ 10
Поскольку вопрос заключается в том, "как отключить кнопку добавления нового для настраиваемого типа записи", а не "как ограничить пользовательское редактирование настраиваемых типов записей", на мой взгляд, ответ должен состоять в том, чтобы просто скрыть кнопки с помощью css, добавив это к Файл functions.php:
add_action( 'admin_head', function(){
    ob_start(); ?>
    <style>
        #wp-admin-bar-new-content{
            display: none;
        }
        a.page-title-action{
            display: none !important;
        }
        #menu-posts-MY-CUSTOM-POST-TYPE > ul > li:nth-child(3) > a{
            display:none;
        }
    </style>
<?php ob_end_flush();
});