it-swarm.com.de

Benutzerdefinierte bulk_action

Ich möchte einem benutzerdefinierten Beitragstyp eine benutzerdefinierte Sammelaktion hinzufügen. Ich bin auf den Filter bulk_actions-screenid gestoßen, was laut seiner dokumentation genau das machen würde was ich wünsche. Nach ungefähr zwei Stunden Debugging fand ich jedoch 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 einzuschleusen

/**
 * 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 eine Logik in admin_init einfügen könnte, um die erforderliche Verarbeitung durchzuführen - es scheint jedoch, dass create_invoice niemals veröffentlicht wird. Gibt es etwas, was ich falsch mache?

=== UPDATE ===

Ich habe den Code aktualisiert, um den Hook load-* zu verwenden. Wenn ich die Massenaktion auf users.php anwende, wird create_invoice über die Anforderung weitergeleitet. In edit.php wird create_invoice 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');
17
v0idless

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-page fü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} (z. B. handle_bulk_actions-edit-page) die Ausführung der Aktion verwalten.

Dies wird alles ziemlich gut in diesem Blogbeitrag 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 );
1
engelen

Mit dem Filter bulk_actions-* 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 Aktion load-* anstelle von admin_init zu verwenden. Beachten Sie, dass Sie alle Sicherheitsprüfungen wie check_ajax_referrer () und current_user_can () durchführen müssen.

9
scribu

Sie müssen bulk_actions-Filter verwenden, wenn ein WP_Screen-Objekt 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' );
    }
}    
0
Themesfa