Вопрос или проблема
Я создал класс, расширяющий WP_List_Table
, и создал метод для массовых действий следующим образом:
function get_bulk_actions()
{
$actions = array(
'synchronize' => 'Synchronize',
'delete' => 'Delete from Shareino',
);
return $actions;
}
и другой метод для их обработки:
function process_bulk_action()
{
// Определяем, когда вызывается массовое действие...
if ('delete' === $this->current_action()) {
wp_die('Items deleted (or they would be if we had items to delete)!');
}
}
Это действие отображается в dropbox
, но когда я выбираю элементы и одно из действий и нажимаю на “применить”, ничего не происходит, так что process_bulk_action
не работает;
Когда вызывается $synchronizationList->display()
, все, что связано с таблицей, создается, включая разбиение на страницы, сортировку и массовые действия, но когда создается массовое действие, оно просто создает 2 ввода: один — это dropbox
, содержащий все массовые действия, и кнопку отправки для применения, так что тег form
не создается, и когда кнопка отправки не находится внутри form
, она ничего не делает.
Поэтому я создал form
, и все работает нормально.
add_action('admin_menu', array("Shareino", 'ShareinoAdminMenu'));
/**
* Этот метод добавляет элементы shareino в меню администратора
*/
public static function ShareinoAdminMenu()
{
add_menu_page(__('Shareino', 'access'), __('Shareino', 'access'), 'manage_options', __('shareino', 'vibe'),
array("Shareino", "shareinoSetting"), WP_PLUGIN_URL . "/shareino/assets/images/logo.gif", 80);
add_submenu_page(
'shareino',
__('Synchronize', 'access'),
__('Synchronize'),
'manage_options',
__('Synchronize'),
array("Shareino", "shareinoSynchronize"));
}
public function shareinoSynchronize()
{
$synchronizationList = new SynchronizationList();
$synchronizationList->prepare_items();
?>
<!-- Формы НЕ создаются автоматически, поэтому вам нужно обернуть таблицу в одну, чтобы использовать такие функции, как массовые действия -->
<form id="movies-filter" method="get">
<!-- Для плагинов нам также нужно убедиться, что форма отправляется обратно на нашу текущую страницу -->
<input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>"/>
<!-- Теперь мы можем отобразить завершенную таблицу списка -->
<?php $synchronizationList->display() ?>
</form>
<?php
}
Ответ или решение
Ваша проблема связана с использованием класса WP_List_Table
в WordPress для создания таблицы с возможностью выполнения массовых действий. Основная цель заключается в том, чтобы обеспечить корректное выполнение действий, таких как синхронизация и удаление, при выборе элементов и нажатии кнопки "Применить". Давайте разберем вашу ситуацию и шаги, необходимые для решения проблемы.
Проблема
Ваша функция process_bulk_action
, предназначенная для обработки массовых действий, не выполняется. Основной причиной является отсутствие элемента <form>
, оборачивающего таблицу и кнопки, которые отвечают за передачу данных из выпадающего списка (дропбокса) на сервер.
Решение
-
Обрамление таблицы в форму: Чтобы действия из дропбокса могли быть выполнены, убедитесь, что вся таблица содержится в элементе
<form>
. Это позволит кнопке "Применить" отправлять данные на сервер. -
Правильные атрибуты формы: Форма должна иметь метод
GET
и скрытое поле с именемpage
, чтобы сохранять контекст текущей страницы. Это делается для того, чтобы форма отправлялась на ту же страницу, где отображается таблица, что обеспечит корректную обработку данных в WordPress. -
Использование метода prepare_items: Этот метод следует вызвать перед выводом таблицы, чтобы подготовить данные и управлять пагинацией.
Код с учетом исправлений:
add_action('admin_menu', array("Shareino", 'ShareinoAdminMenu'));
/**
* Добавляет элементы Shareino в меню администратора.
*/
public static function ShareinoAdminMenu() {
add_menu_page(__('Shareino', 'access'), __('Shareino', 'access'), 'manage_options', 'shareino', array("Shareino", "shareinoSetting"), WP_PLUGIN_URL . "/shareino/assets/images/logo.gif", 80);
add_submenu_page('shareino', __('Synchronize', 'access'), __('Synchronize'), 'manage_options', 'Synchronize', array("Shareino", "shareinoSynchronize"));
}
public function shareinoSynchronize() {
$synchronizationList = new SynchronizationList();
$synchronizationList->prepare_items();
echo '<form id="movies-filter" method="get">';
echo '<input type="hidden" name="page" value="' . $_REQUEST['page'] . '"/>';
$synchronizationList->display();
echo '</form>';
}
Дополнительные рекомендации
-
Проверка безопасности: Убедитесь, что любой код, выполняющийся при обработке массовых действий, проходит проверку безопасности с использованием
check_admin_referer
для защиты от CSRF атак. -
Логика действий: Разместите вашу бизнес-логику в методе
process_bulk_action
для обработки каждого соответствующего действия, например, удалить или синхронизировать данные. -
Отладка и проверка: Убедитесь, что ваше окружение для разработки позволяет отслеживать ошибки PHP, что может помочь в выявлении проблем с обработкой действий.
Эти шаги должны помочь в корректной реализации функционала массовых действий для вашего WP_List_Table в WordPress. Убедитесь, что строка if ('delete' === $this->current_action())
в методе process_bulk_action
вызывается корректно в нужное время.