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_invoice
niemals 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_invoice
wird die Anforderung wie ich sehe durchlaufen. Auf edit.php create_invoice
wird 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');
quelle
Antworten:
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 namenshandle_bulk_actions-{$screen}
(zBhandle_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:
Hinzufügen eines Handlers für die Massenaktion:
quelle
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
edit-page
Teil seine Bildschirm-ID ist)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 verwendenadmin_init
. Beachten Sie, dass Sie alle Sicherheitsprüfungen wie check_ajax_referrer () und current_user_can () durchführen müssen.quelle
load-*
Haken scheint zu funktionieren. Vielen Dank auch für die Aktualisierung des Codex und das erneute Öffnen des Trac-Tickets.load-*
Hook zu verwenden. Wenn ich die Bulk-Aktion auf users.php anwende,create_invoice
wird die Anforderung wie ich sehe durchlaufen. Auf edit.phpcreate_invoice
wird jedoch nie gedruckt.exit;
Anruf nachecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
: denadmin_action_*
(admin_action_create_invoice
in deinem Fall). Es wird direkt nach demload-*
Hook aufgerufen und nur dann, wenn die benutzerdefinierte Massenaktion ausgelöst wird.Sie müssen
bulk_actions
Filter verwenden , wenn einWP_Screen
Objekt definiert ist. so was:quelle