Benutzerdefinierte bulk_action


17

Ich möchte einem benutzerdefinierten Beitragstyp eine benutzerdefinierte Sammelaktion hinzufügen. Ich bin auf den Filter gestoßen bulk_actions-screenid, der laut Dokumentation genau das tun würde, was ich wollte . Nach ungefähr zwei Stunden Debugging fand ich den folgenden Kommentar // This filter can currently only be used to remove actions.in Zeile 278 von class-wp-list-table.php - großartig!

Ich dachte, ich könnte es hacken, indem ich jQuery verwende, um die Aktion als Option zu injizieren

/**
 * 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
}

Das funktioniert. Die Aktion wird jetzt im Menü für Massenaktionen angezeigt. Ich war unter der Annahme, dass ich dann einige Logik hinzufügen könnte admin_init, um die notwendige Verarbeitung durchzuführen - es scheint jedoch, dass dies create_invoiceniemals gebucht wird. Gibt es etwas, was ich falsch mache?

=== UPDATE ===

Ich habe den Code aktualisiert, um den load-*Hook zu verwenden. Wenn ich die Bulk-Aktion auf users.php anwende, create_invoicewird die Anforderung wie ich sehe durchlaufen. Auf edit.php create_invoicewird jedoch nie gedruckt.

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
Vielleicht hilft diese Antwort jemandem in der Zukunft. Hier ist eine Möglichkeit, dies zu tun: Fügen Sie eine benutzerdefinierte WordPress-Massenaktion hinzu
Ayoub

Der Link im vorherigen Kommentar hat sich geändert. Sie können den Artikel hier noch lesen .
Morphatic

1
Es sieht so aus, als ob dies bald in WordPress behoben wird. Das Ticket core.trac.wordpress.org/ticket/16031 wurde gerade Ende Oktober '16 geschlossen.
Denise Draper

Antworten:


2

Ich denke, dass die neueste Hauptversion angesichts der Popularität dieser Frage eine neue Antwort auf diese Frage rechtfertigt.

Seit WordPress 4.7 (veröffentlicht im Dezember 2016) ist es möglich, benutzerdefinierte Massenaktionen ohne Verwendung von JavaScript hinzuzufügen.

Mit dem Filter bulk_actions-{$screen}(z. B. bulk_actions-edit-pagefür die Seitenübersicht) können Sie jetzt benutzerdefinierte Massenaktionen hinzufügen. Darüber hinaus können Sie mit einer neuen Aktion namens handle_bulk_actions-{$screen}(zB handle_bulk_actions-edit-page) die Ausführung der Aktion verwalten.

Dies alles wird in diesem Blog-Beitrag ziemlich gut erklärt . Angenommen, Sie möchten eine Sammelaktion hinzufügen, um die Titel der ausgewählten Elemente in der Seitenübersicht per E-Mail zu versenden. Wir könnten es so machen:

In einem kleinen Beispiel fügen wir der Dropdown-Liste für Massenaktionen eine Aktion hinzu und fügen ihr eine Handlerfunktion hinzu.

Hinzufügen der Massenaktion zur Dropdown-Liste:

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' );

Hinzufügen eines Handlers für die Massenaktion:

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 );

Diese Handleraktion funktioniert bei mir nicht. Ich benutze WordPress 4.7.2. Ich würde mich über jede Hilfe freuen. add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
Maria Daniel Deepak

Was funktioniert @MariaDanielDeepak nicht? Es funktioniert gut auf 4.7.2 für mich. Ein paar Dinge zu beachten: (1) Der Rückruf ist für die "Seiten" -Übersicht im Admin (da der edit-pageTeil seine Bildschirm-ID ist)
Massenaktion

Ich freue mich über Ihren Kommentar. Ich habe die vollständige Erklärung hinzugefügt, was im WordPress- Forum nicht funktioniert .
Maria Daniel Deepak

9

Mit dem bulk_actions-*Filter können Sie keine benutzerdefinierten Massenaktionen hinzufügen, da es schwierig ist, einen Handler für diese Aktion hinzuzufügen. Der Codex wurde aktualisiert.

Ich würde vorschlagen, die load-*Aktion anstelle von zu verwenden admin_init. Beachten Sie, dass Sie alle Sicherheitsprüfungen wie check_ajax_referrer () und current_user_can () durchführen müssen.


Vielen Dank! Der load-*Haken scheint zu funktionieren. Vielen Dank auch für die Aktualisierung des Codex und das erneute Öffnen des Trac-Tickets.
v0idless

1
Möglicherweise habe ich die Antwort vorzeitig akzeptiert. Ich habe den Code aktualisiert, um den load-*Hook zu verwenden. Wenn ich die Bulk-Aktion auf users.php anwende, create_invoicewird die Anforderung wie ich sehe durchlaufen. Auf edit.php create_invoicewird jedoch nie gedruckt.
V0idless

Versuchen Sie, einen exit;Anruf nachecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu 29.09.11

1
Ich denke, es gibt einen besseren Aktionshaken als load-*: den admin_action_*( admin_action_create_invoicein deinem Fall). Es wird direkt nach dem load-*Hook aufgerufen und nur dann, wenn die benutzerdefinierte Massenaktion ausgelöst wird.
Fabien Quatravaux

0

Sie müssen bulk_actionsFilter verwenden , wenn ein WP_ScreenObjekt definiert ist. so was:

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' );
    }
}    
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.