Je voudrais ajouter une action groupée personnalisée à un type de publication personnalisé. Je suis tombé sur le filtre bulk_actions-screenid
, qui , selon sa documentation , ferait exactement ce que je veux . Cependant, après environ deux heures de débogage, j'ai trouvé le commentaire suivant // This filter can currently only be used to remove actions.
sur la ligne 278 de class-wp-list-table.php - super!
J'ai pensé que je pouvais le pirater en utilisant jQuery pour injecter l'action en option
/**
* 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
}
Cela marche. L'action apparaît maintenant dans le menu d'actions groupées. J'étais dans l'hypothèse que je pourrais alors ajouter de la logique admin_init
pour faire le traitement nécessaire - cependant, il semble que ce create_invoice
ne soit jamais publié. Y a-t-il quelque chose que je fais mal?
=== MISE À JOUR ===
J'ai mis à jour le code pour utiliser le load-*
crochet. Lorsque j'applique l'action en masse sur users.php - je vois que create_invoice
la demande est transmise. Cependant, sur edit.php create_invoice
n'est jamais imprimé.
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');
la source
Réponses:
Je pense que la dernière version majeure mérite une nouvelle réponse à cette question, compte tenu de la popularité de cette question.
Depuis WordPress 4.7 (sorti en décembre 2016), il est possible d'ajouter des actions groupées personnalisées sans utiliser JavaScript.
Le filtre
bulk_actions-{$screen}
(par exemplebulk_actions-edit-page
pour l'aperçu des pages) vous permet désormais d'ajouter des actions groupées personnalisées. De plus, une nouvelle action appeléehandle_bulk_actions-{$screen}
(par exemplehandle_bulk_actions-edit-page
) vous permet de gérer l'exécution de l'action.Tout cela est assez bien expliqué dans cet article de blog . Par exemple, supposons que nous souhaitons ajouter une action groupée pour envoyer par e-mail les titres des éléments sélectionnés dans l'aperçu des pages. Nous pourrions le faire comme ceci:
Pour un petit exemple, où nous ajoutons une action à la liste déroulante d'actions en masse et y ajoutons une fonction de gestionnaire.
Ajout de l'action groupée à la liste déroulante:
Ajout d'un gestionnaire pour l'action groupée:
la source
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
edit-page
partie est son id d'écran) (2) L'action ne sera pas exécutée si aucune page n'est sélectionnée (c'est-à-dire en essayant de faire le actionLe
bulk_actions-*
filtre ne vous permet pas d'ajouter des actions groupées personnalisées précisément parce qu'il est difficile d'ajouter ensuite un gestionnaire pour cette action. Mise à jour du Codex.Je suggère d'utiliser l'
load-*
action au lieu deadmin_init
. Notez que vous devez effectuer tous les contrôles de sécurité comme check_ajax_referrer () et current_user_can ().la source
load-*
crochet semble fonctionner. Merci également d'avoir mis à jour le codex et de rouvrir le ticket trac.load-*
crochet. Lorsque j'applique l'action en masse sur users.php - je vois quecreate_invoice
la demande est transmise. Cependant, sur edit.phpcreate_invoice
n'est jamais imprimé.exit;
appel aprèsecho "<pre>" . print_r($_REQUEST, true) . "</pre>";
load-*
: leadmin_action_*
(admin_action_create_invoice
dans votre cas). Il est appelé juste après leload-*
hook et uniquement lorsque l'action groupée personnalisée est déclenchée.Vous devez utiliser des
bulk_actions
filtres lorsque l'WP_Screen
objet est défini. comme ça:la source