Спеціальний масовий контроль


17

Я хотів би додати спеціальну групову дію до спеціального типу публікації. Я натрапив на фільтр bulk_actions-screenid, який відповідно до його документації робив би саме так, як я хотів . Однак приблизно через дві години налагодження я знайшов наступний коментар // This filter can currently only be used to remove actions.у рядку 278 класу-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 Вибіркового
Аюб

Посилання в попередньому коментарі змінилося. Ви можете прочитати статтю тут .
морфатичні

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) Дія не буде виконана, якщо не вибрано жодної сторінки (тобто намагаються зробити
групова

Я вдячний за ваш коментар. Я додав повне пояснення того , що не працює в 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ніколи не друкується.
v0idless

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

1
Я думаю, що кращий гак дій, ніж load-*: admin_action_*( admin_action_create_invoiceу вашому випадку). Він називається одразу після load-*гачка, і лише тоді, коли запускається спеціальна групова дія.
Fabien Quatravaux

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.