WP_LIST_TABLE массовое действие

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

Я создал класс, расширяющий 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>, оборачивающего таблицу и кнопки, которые отвечают за передачу данных из выпадающего списка (дропбокса) на сервер.

Решение

  1. Обрамление таблицы в форму: Чтобы действия из дропбокса могли быть выполнены, убедитесь, что вся таблица содержится в элементе <form>. Это позволит кнопке "Применить" отправлять данные на сервер.

  2. Правильные атрибуты формы: Форма должна иметь метод GET и скрытое поле с именем page, чтобы сохранять контекст текущей страницы. Это делается для того, чтобы форма отправлялась на ту же страницу, где отображается таблица, что обеспечит корректную обработку данных в WordPress.

  3. Использование метода 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 вызывается корректно в нужное время.

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

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