WordPress: отключить «Добавить новый» для пользовательского типа сообщения

48

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

  • 1
    Разговор о том, чтобы выкопать мертвых - я наткнулся здесь сегодня и вижу ответ Симуса, вы должны пометить его как принятый, это определенно «правильный» ответ.
Теги:

9 ответов

41
Лучший ответ

Полный кредит Seamus Leahy

Существует мета-возможность 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
));

Могу ли я спросить, почему вы хотите это сделать?

Я бы сначала предложил изменить возможности для вашего настраиваемого типа сообщений, но я не думаю, что там кто-то ограничивает, кто может добавлять сообщения, но только кто может их редактировать или публиковать.

Он выглядит немного грязным, но вы можете попытаться отключить элемент в $submenu global;

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');

Забастовкa >

  • 0
    Я хочу, чтобы в любое время в администраторе было доступно только 8 элементов определенного типа сообщений (это 8 частей сведений о продукте), и я полагаю, что редактор может ошибиться, добавив еще один пост (даже если я вывожу только 8, это может означать 9-й будет получен вместо другого). Я попытался изменить возможности типа сообщения без результата. Ваш код работал отлично. Спасибо!
  • 3
    Это решение может выглядеть хорошо ... Но оно только скрывает пункт меню - оно не мешает пользователю вводить в адрес браузера URL для редактирования нового сообщения. Что-то вроде: some-site.com/wp-admin/post-new.php . Я имею дело с той же проблемой и пока не нашел решения.
Показать ещё 4 комментария
96

Существует мета-возможность 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
));
  • 1
    Пришлось +1 это тоже. Это, безусловно, удалит возможность добавить новый cpt .. но также удалит гораздо больше. Идеально подходит для экстремальной блокировки ... но мне нужно было несколько функций, которые также удаляет. Тем не менее, отличный ответ! Благодарю.
  • 0
    Рад слышать, что Джош. Не могли бы вы поделиться другими функциями, которые он также заблокировал, чтобы все остальные тоже знали об этом?
Показать ещё 8 комментариев
8

Комбинации решений выше работают в сокрытии ссылок (хотя кто-то мог легко ввести URL-адрес напрямую.

Решение, упомянутое @PavelChernov, зависит от 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

  • 0
    это сработало для меня, ответ GRT ............. Кирк Борода
  • 0
    Спасибо, любезно! Отличный ответ и расширяемый, чтобы охватить другие области, которые мне нужно было настроить. Потрясающие!! +1
5

В 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).

  • 1
    Это должен быть принятый ответ.
4

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
));

принятый ответ скрывает пункт меню, но страница все еще доступна.

3
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");
}
  • 0
    Мне нравится это решение. Спасибо
2

@Стаффан Эстберг,

Это лучший способ скрыть кнопку "Добавить новую" или "Создать новую" в пользовательских почтовых сообщениях

'capability_type'    => 'post',

        'capabilities'       => array( 'create_posts' => false ),       

        'map_meta_cap'       => true,

Отключить создание нового сообщения в пользовательских типах сообщений как в меню администратора, так и над списком типа сообщения.

0

Отключить создание нового сообщения для зарегистрированных пост-типов: (пример для 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');
0

Я нашел этот простой способ для этого. Просто введите этот код в темы 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');
  • 0
    Имейте в виду, что это просто скрывает кнопку «Добавить новое», это программно не мешает пользователям добавлять новые сообщения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню