Как обрабатывать действия со строками в таблице пользовательского списка в административном разделе

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

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

В любом случае, у меня есть следующий код, и я прошел через множество учебников по расширению класса WP_List_Table, но наткнулся на стену.

function column_name( $item ) {
  $title = "<strong>" . $item['projectName'] . '</strong>';

  $actions = [
    'edit'    => sprintf( '<a href="https://wordpress.stackexchange.com/questions/275853/?page=%s&action=%s&project=%s">Edit</a>',
      $_REQUEST['page'], 'edit', $item['projectID'] ),
    'delete'  => sprintf( '<a href="https://wordpress.stackexchange.com/questions/275853/?page=%s&action=%s&project=%s">Delete</a>',
      $_REQUEST['page'], 'delete', $item['projectID'] )
  ];

  return $title . $this->row_actions( $actions );
}

Когда я нажимаю «редактировать», происходит только изменение URL. Я не уверен, как на самом деле сгенерировать форму/административную страницу для редактирования/обновления проекта при нажатии кнопки редактирования. Я также получаю ошибку перенаправления, когда нажимаю «удалить», с которой планирую разобраться позже. Я предполагаю, что для удаления мне просто нужно убедиться, что у меня правильный SQL-запрос для удаления проекта из базы данных.

Заранее спасибо за вашу помощь.

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

add_action('admin_menu', function() {
    $page_hook_suffix = add_submenu_page( # или связанная функция
        …
        function() {
            # содержимое страницы с таблицей
        }
    );
    if ($page_hook_suffix) {
        add_action("load-$page_hook_suffix", function() {
           # проверка nonce, обработка действий, перенаправление и т. д.
        });
    }
});

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

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

Формирование интерфейса для редактирования проекта

  1. Расширение WP_List_Table:
    Вы уже правильно создали собственный класс, расширяющий WP_List_Table. Чтобы правильно обработать действия, такие как редактирование, вам нужно обрабатывать их через механизм admin_init или на этапе загрузки страницы администратора.

  2. Обработка нажатий кнопки "Редактировать":
    Когда вы добавляете ссылку на редактирование, вам необходимо также создать функцию, которая будет отвечать за отображение формы редактирования на отдельной странице.

    function my_custom_admin_menu() {
       $hook_suffix = add_submenu_page(
           'options-general.php',   // Родительская страница
           'Редактировать проект',  // Заголовок страницы
           'Редактирование',        // Название в меню
           'manage_options',        // Права доступа
           'edit_project',          // Слаг для URL
           'render_edit_project_page' // Функция, которая отрисует страницу
       );
    
       add_action("load-$hook_suffix", 'process_edit_action');
    }
    add_action('admin_menu', 'my_custom_admin_menu');
  3. Функция отображения:
    Эта функция будет обрабатывать отображение страницы администратора для редактирования:

    function render_edit_project_page() {
       if (isset($_GET['project'])) {
           $project_id = intval($_GET['project']);
           // Получаем данные проекта из базы данных
           // Отображаем форму редактирования с текущими данными проекта
       }
    }

Обработка удаления проекта

  1. Проверка и обработка действия "Удалить":
    Убедитесь, что вы используете проверку нонсов перед выполнением действия для безопасности:

    function process_edit_action() {
       if (isset($_GET['action']) && $_GET['action'] === 'delete') {
           if (isset($_GET['project']) && check_admin_referer('delete_project')) {
               $project_id = intval($_GET['project']);
               // SQL-запрос для удаления проекта из базы данных
               wp_redirect(admin_url('options-general.php?page=my_custom_table')); // Перенаправление после удаления
               exit;
           }
       }
    }
  2. Добавление нонсов:
    При создании ссылок используйте wp_nonce_url для защиты:

    $actions = [
       'edit' => sprintf('<a href="%s">Edit</a>', esc_url(add_query_arg(['action' => 'edit', 'project' => $item['projectID']], wp_nonce_url(admin_url('options-general.php?page=my_custom_table'), 'edit_project')))),
       'delete' => sprintf('<a href="%s">Delete</a>', esc_url(add_query_arg(['action' => 'delete', 'project' => $item['projectID']], wp_nonce_url(admin_url('options-general.php?page=my_custom_table'), 'delete_project'))))
    ];

Итог

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

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

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