Вопрос или проблема
Я настроил плагин, и из-за объема используемых данных я создал пользовательскую таблицу и расширил класс 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 без выполнения действий, а также с ошибкой перенаправления при удалении.
Формирование интерфейса для редактирования проекта
-
Расширение WP_List_Table:
Вы уже правильно создали собственный класс, расширяющийWP_List_Table
. Чтобы правильно обработать действия, такие как редактирование, вам нужно обрабатывать их через механизмadmin_init
или на этапе загрузки страницы администратора. -
Обработка нажатий кнопки "Редактировать":
Когда вы добавляете ссылку на редактирование, вам необходимо также создать функцию, которая будет отвечать за отображение формы редактирования на отдельной странице.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');
-
Функция отображения:
Эта функция будет обрабатывать отображение страницы администратора для редактирования:function render_edit_project_page() { if (isset($_GET['project'])) { $project_id = intval($_GET['project']); // Получаем данные проекта из базы данных // Отображаем форму редактирования с текущими данными проекта } }
Обработка удаления проекта
-
Проверка и обработка действия "Удалить":
Убедитесь, что вы используете проверку нонсов перед выполнением действия для безопасности: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; } } }
-
Добавление нонсов:
При создании ссылок используйте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')))) ];
Итог
Обеспечив обработку событий через специальные функции и проверку безопасности с помощью нонсов, вы минимизируете вероятность появления ошибок и защищаете сайт от потенциальных угроз. Следуя этой инструкции, вы сможете не только стабилизировать работу вашего настраиваемого интерфейса, но и обеспечить удобную и безопасную работу пользователей с вашим плагином.