WordPress: отключить "Добавить новое" в пользовательском типе сообщения - программирование
Подтвердить что ты не робот

WordPress: отключить "Добавить новое" в пользовательском типе сообщения

Есть ли способ отключить возможность добавления нового сообщения в пользовательский тип публикации в WordPress (3.0)? Я просмотрел метки и аргументы, но не могу найти ничего похожего на такую ​​функцию.

4b9b3361

Ответ 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();
});