Пользовательское массовое действие


17

Я хотел бы добавить пользовательское массовое действие к пользовательскому типу записи. Я наткнулся на фильтр bulk_actions-screenid, который, согласно его документации , будет работать именно так, как я хочу . Однако примерно после двух часов отладки я нашел следующий комментарий// This filter can currently only be used to remove actions. к строке 278 class-wp-list-table.php - отлично!

Я подумал, что смогу взломать его, используя jQuery для добавления действия в качестве опции

/**
 * Hack to add a custom bulk action. 
 */
public function admin_footer() {
    if($_GET['post_type'] != self::POST_TYPE) return;
    ?> 
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
        });
    </script>
    <?php
}

Это работает. Действие теперь появляется в меню массовых действий. Я предполагал, что смогу добавить некоторую логику admin_initдля выполнения необходимой обработки - однако, похоже, что create_invoiceона никогда не публикуется. Я что-то не так делаю?

=== ОБНОВЛЕНИЕ ===

Я обновил код, чтобы использовать load-*хук. Когда я применяю массовое действие к users.php - я вижу, create_invoiceчто передается через запрос. Тем не менее, на edit.php create_invoiceникогда не печатается.

function a39x2_admin_footer() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
            jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action2']");
        });
    </script>
    <?php
}
add_action('admin_footer', 'a39x2_admin_footer');


function a39x2_load() {
    echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
}
add_action('load-edit.php', 'a39x2_load');
add_action('load-users.php', 'a39x2_load');

1
Может быть, этот ответ поможет кому-то в будущем. Вот способ сделать это: добавить пользовательское массовое действие WordPress
Ayoub

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

1
Похоже, это скоро будет исправлено в WordPress. Билет core.trac.wordpress.org/ticket/16031 был закрыт в конце октября 16 года.
Дениз Дрейпер

Ответы:


2

Я думаю, что последний крупный релиз требует нового ответа на этот вопрос, учитывая популярность этого вопроса.

Начиная с WordPress 4.7 (выпущен в декабре 2016 года), можно добавлять собственные массовые действия без использования JavaScript.

Фильтр bulk_actions-{$screen}(например, bulk_actions-edit-pageдля обзора страниц) теперь позволяет добавлять настраиваемые массовые действия. Кроме того, новое действие, называемое handle_bulk_actions-{$screen}(например handle_bulk_actions-edit-page), позволяет вам управлять выполнением действия.

Все это довольно хорошо объяснено в этом посте . Например, скажем, мы хотим добавить массовое действие, чтобы отправить заголовки выбранных элементов в обзоре страниц по электронной почте. Мы могли бы сделать это так:

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

Добавление массового действия в выпадающий список:

function wpse29822_page_bulk_actions( $actions ) {
    // Add custom bulk action
    $actions['my-action-handle'] = __( 'My Custom Bulk Action' );
    return $actions;
}
add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' );

Добавление обработчика для массового действия:

function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) {
    // Check whether action that user wants to perform is our custom action
    if ( $doaction == 'my-action-handle' ) {
        // Do stuff
    }
    return $redirect_to;
}
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );

Это действие обработчика не работает для меня. Я использую WordPress 4.7.2. Буду признателен за любую помощь в этом. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Мария Даниэль Дипак

Что не работает @MariaDanielDeepak? У меня на 4.7.2 работает нормально. Несколько вещей, на которые следует обратить внимание: (1) Обратный вызов предназначен для обзора «Страницы» в администраторе (так как edit-pageчасть является идентификатором экрана). (2) Действие не будет выполнено, если не выбрано ни одной страницы (т.е. попытка выполнить массовое действие на пустом наборе страниц)
engelen

Я ценю ваш комментарий. Я добавил полное объяснение того, что не работает на форуме WordPress .
Мария Даниэль Дипак

9

bulk_actions-*Фильтр не позволяет добавлять пользовательские массовые действия именно потому , что это сложно , то добавить обработчик для этого действия. Обновлен Кодекс.

Я бы предложил использовать load-*действие вместо admin_init. Обратите внимание, что вы должны выполнить все проверки безопасности, такие как check_ajax_referrer () и current_user_can ().


Благодарность! load-*Крюк , кажется, работает. Также спасибо за обновление кодекса и повторное открытие трейк-билета.
v0idless

1
Возможно, я преждевременно принял ответ. Я обновил код, чтобы использовать load-*хук. Когда я применяю массовое действие к users.php - я вижу, create_invoiceчто передается через запрос. Тем не менее, на edit.php create_invoiceникогда не печатается.
бездеп 29.09.11

Попробуйте добавить exit;вызов послеecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu

1
Я думаю, что есть лучший хук действий, чем load-*: admin_action_*( admin_action_create_invoiceв вашем случае). Он вызывается сразу после load-*перехвата и только когда запускается настраиваемое массовое действие.
Фабьен Кватраво

0

Вы должны использовать bulk_actionsфильтры, когда WP_Screenобъект определен. как это:

add_action( 'current_screen', 'custom_bulk_actions' );
function custom_bulk_actions() {
    if( current_user_can( 'administrator' ) {
        add_filter( 'bulk_actions-edit-post'       , 'register_custom_bulk_actions' );
        add_filter( 'handle_bulk_actions-edit-post', 'custom_bulk_action_handler', 10, 3 );
        add_action( 'admin_notices'                , 'custom_bulk_action_admin_notice' );
    }
}    
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.