Только для чтения пользовательский тип записи

Вопрос или проблема

Для контактной формы моей темы я создал Пользовательский Тип Записи, в который автоматически сохраняются сообщения пользователей. В административной панели сообщения можно читать, подобно комментариям.

Таким образом, вы можете создавать, изменять и удалять сообщения в административной панели. Все эти функции должны быть ограничены, чтобы оставалась возможность только чтения сообщений.

Я пытался достичь этого, назначив пользовательскому типу записи свою собственную возможность и предоставив права на чтение всем ролям пользователей. К сожалению, в результате этого Пользовательский Тип Записи вообще перестал отображаться. Как выяснилось, это, вероятно, связано с тем, что права на чтение предназначены для фронтенда. Так как же можно ограничить доступ к пользовательскому типу записи только чтением?


Вот мои параметры CPT:

$args = array(
    'labels'             => $labels,
    'public'             => false,
    'publicly_queryable' => false,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'show_in_admin_bar'  => false,
    'menu_icon'          => 'dashicons-email-alt',
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'contact-form' ),
    'capability_type'    => array( 'contactFormMessage', 'contactFormMessages' ),
    'capabilities'       => array(
        'edit_post'          => 'edit_contactFormMessage',
        'edit_posts'         => 'edit_contactFormMessages',
        'edit_others_posts'  => 'edit_other_contactFormMessages',
        'publish_posts'      => 'publish_contactFormMessages',
        'read_post'          => 'read_contactFormMessage',
        'read_private_posts' => 'read_private_contactFormMessages',
        'delete_post'        => 'delete_contactFormMessage'
    ),
    'map_meta_cap'       => true,
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => null,
    'supports'           => array( 'title', 'editor', 'author' )
);

И, используя следующий цикл, я предоставил права на чтение всем ролям пользователей.

global $wp_roles;

foreach ( $wp_roles->roles as $key => $value )
{
    $currentRole = get_role( $key );

     $currentRole->add_cap( 'read_contactFormMessages' );
     $currentRole->add_cap( 'read_private_contactFormMessages' );
}

В целях безопасности я ищу решение этой проблемы без использования плагинов. Однако, если это окажется большой проблемой, использование плагина всё ещё возможно.

Вы правы, что возможность read предназначена для фронтенда. Не существует возможности, которую вы ищете.

Кроме того, если бы она существовала (а её нет), пользовательский интерфейс WP Admin не предоставляет интерфейс для просмотра/чтения записей, только добавления и редактирования.

Если вы этого хотите, мне страшно сообщить, что вам необходимо выполнить следующие шаги:

  • Добавьте новую возможность и добавьте её к соответствующим ролям
  • Удалите стандартный доступ WP к этим пользовательским типам записей для этих ролей
  • Реализуйте интерфейс с нуля, включая экран списка и страницу параметров для просмотра элементов

Я только сейчас это вижу… Я реализовал что-то подобное тому, что вы хотите внедрить, с помощью ответа @webaware на https://wordpress.stackexchange.com/a/124992/165023. Если вам нужно дополнительное разъяснение его кода, дайте знать… Я здесь, чтобы помочь.

Ответ или решение

Чтобы реализовать функциональность для вашего пользовательского типа записи (CPT), который будет доступен только для чтения без возможности редактирования, удаления или добавления новых записей, вам следует выполнить несколько шагов. Ниже представлена пошаговая инструкция.

1. Зарегистрируйте пользовательский тип записи с корректными возможностями

При регистрации вашего CPT укажите возможности (capabilities) таким образом, чтобы они соответствовали вашим требованиям. Обратите внимание, что важно настроить map_meta_cap на true, чтобы использовать свои настраиваемые возможности.

$args = array(
    'labels'             => $labels,
    'public'             => false,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'capability_type'    => array('contactFormMessage', 'contactFormMessages'),
    'capabilities'       => array(
        'edit_post'          => 'edit_contactFormMessage',
        'delete_post'        => 'delete_contactFormMessage',
        'read_post'          => 'read_contactFormMessage',
        'read_private_posts' => 'read_private_contactFormMessages',
    ),
    'map_meta_cap'       => true,
    'supports'           => array('title', 'editor', 'author'),
);
register_post_type('contact_form_message', $args);

2. Настройте права доступа для ролей пользователей

Теперь необходимо добавить доступные возможности для всех ролей, которые вы хотите, чтобы имели доступ к CPT, но только для чтения. Это можно сделать следующим образом:

global $wp_roles;

foreach ($wp_roles->roles as $key => $value) {
    $role = get_role($key);
    if ($role) {
        $role->add_cap('read_contactFormMessage');
        $role->add_cap('read_private_contactFormMessages');
    }
}

3. Скрыть возможности редактирования и удаления

Чтобы полностью исключить возможность редактирования и удаления сообщений, вам нужно удалить возможности из ролей, у которых вы не хотите, чтобы были эти права. Вы также можете использовать хуки для управления выводом интерфейса для администратора.

function remove_edit_delete_capabilities() {
    if (!current_user_can('manage_options')) { // Предполагаем, что только администраторы могут редактировать и удалять
        remove_post_type_support('contact_form_message', 'editor');
        remove_post_type_support('contact_form_message', 'author');
    }
}
add_action('init', 'remove_edit_delete_capabilities');

4. Реализация пользовательского интерфейса

Поскольку вся стандартная админка WordPress связана с возможностями редактирования, вам необходимо создать пользовательский интерфейс для отображения сообщений. Это может включать в себя создание страницы администрирования для вашего CPT, где пользователи смогут видеть только список сообщений. Вы можете использовать функцию add_menu_page для создания такой страницы.

function custom_post_type_menu() {
    add_menu_page(
        'Сообщения',           // Название страницы
        'Сообщения',          // Название меню
        'read_contactFormMessage', // Минимальная возможность
        'contact_form_messages', // Уникальный слуг для страницы
        'display_contact_form_messages', // Функция для отображения сообщений
        'dashicons-email-alt'  // Иконка меню
    );
}
add_action('admin_menu', 'custom_post_type_menu');

function display_contact_form_messages() {
    // Код, который выводит список сообщений
    // Это может быть простая таблица с заголовками и списком сообщений
}

Заключение

Следуя этим шагам, вы сможете создать пользовательский тип записи, который будет доступен только для чтения в админ-панели WordPress. Обратите внимание, что потребуется немного настраивать пользовательский интерфейс, чтобы отображать ваши записанные сообщения, так как стандартный интерфейс будет скрыт.

Если у вас возникнут дополнительные вопросы или потребуется более подробная помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...