Поддержка Проблемы и решения Как добавить пользовательский тип записи в меню административной панели?

  • Я создаю пользовательский тип записи — заказы. Он должен быть доступен только из админки. Доступ для него нужно настроить отдельно, потому даю метку capability_type «sale» для установления прав. Пока всё правильно: если установить метку «post», с ним можно нормально работать.

    function create_posttype_order() {
        register_post_type( 'ord',
            array(
                'labels' => array(
                'name' => __( 'Заказы' ),
                'singular_name' => __( 'Заказ' )
            ),
            'public' => false,
            'show_ui' => true,
        'menu_position' => 7,
            'has_archive' => false,
        'capability_type' => array('sale', 'sales'),
        'map_meta_cap' => true,
            'rewrite' => false,
        'show_in_menu' => true
            )
        );
    }
    add_action( 'init', 'create_posttype_order' );

    Дальше я пытаюсь для администратора добавить возможность читать и удалять заказы.

    function ord_change_roles(){
      $admin = get_role( 'administrator' );
      $admin->add_cap( 'delete_published_sales' );
      $admin->add_cap( 'delete_sales' );
      $admin->add_cap( 'delete_private_sales' );
      $admin->add_cap( 'read_private_sales' );
      $admin->add_cap( 'read_sales' );
    }
    add_action( 'admin_init', 'ord_change_roles');

    Пункта «Заказы» в меню админки не появляется. То ли я вообще неправильно что-то делаю, то ли нужно задать какое-то ещё право, чтобы этот пункт отображался.
    Версия wordpress — 5.2.2

Просмотр 1 ответа (всего 1)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    то ли нужно задать какое-то ещё право

    Да, не хватает edit_sales, edit_others_sales и publish_sales.

    После их добавления и двухкратного обновления страницы пункт отображается.

    Метод $wp_roles->add_cap() сохраняет результат в базу данных, поэтому функцию ord_change_roles() достаточно выполнить один раз и потом можно убрать с admin_init.

    Отдельное спасибо за код, с помощью которого удалось воспроизвести проблему и проверить решение за считанные минуты, и хорошо сформулированный вопрос 🙂

Просмотр 1 ответа (всего 1)