web-dev-qa-db-fra.com

problème add_action ('wp_ajax_ [nom de l'action]', mafonction)

Je rencontre exactement le même problème que décrit dans cet article: add_action ('wp_ajax_ [nom de l'action]', myfunction) problème

Je règle add_action ('wp_ajax_my_function_call', 'mon_ajax_function'). Si je print_r ($ wp_filter) immédiatement après cette ligne, mon action est dans le tableau $ wp_filter.

Cependant, au moment où je passe mon appel jQuery.post à admin-ajax.php, mon action a disparu de $ wp_filter. J'ai vérifié cela en l'ajoutant à la ligne 354 de wp-includes/plugin.php:

if($tag=='wp_ajax_my_function_call') print_r($wp_filter);

Selon user1567 dans l'article susmentionné, "le problème était l'ordre de chargement et l'emplacement des appels add_action". Malheureusement, cela ne m'a pas aidé à détecter le problème. J'ai essayé de définir la priorité de add_action à 99 et à 1. Ni aidé.

Toute autre idée sur ce qui pourrait être à l'origine de cette situation, ou pour expliquer pourquoi, en général, une action qui était définitivement dans $ wp_filter à un moment donné en disparaîtrait inexplicablement sans même être déclenchée?

2
trumpetblast

Il n'y a que trois explications pour expliquer pourquoi cela ne fonctionne pas:

Premièrement, quelque chose pourrait annuler votre action. Cela ne semble pas très probable, cependant.

Deuxièmement, votre code ne s'exécute jamais lors de l'initialisation ajax.

Troisièmement, le hook wp_ajax_my_function_call ne s'exécute jamais.

Je ne m'inquiéterais pas de la possibilité du premier.

En ce qui concerne le second, assurez-vous que votre code est exécuté avant le wp_loaded, car tout ce qui suit (c'est-à-dire template_redirect, wp, pre_get_posts) n'est pas exécuté dans un chargement ajax.

Pour le troisième, assurez-vous de bien envoyer votre demande ajax à wp-admin/admin-ajax.php.

Aussi, si vous ne l'avez pas déjà fait, je suggérerais de donner une lecture rapide à admin-ajax.php et wp-settings.php.

2
John P Bloch

Je viens de rencontrer un problème similaire dans l'un de mes plugins (et suis tombé sur cette question). Dans mon cas, je l'ai retrouvé dans une instruction conditionnelle dans ma fonction admin_init. Dans le but d'éviter de charger le code de mon plugin (et javascript et CSS) sur chaque page d'administration, j'avais inclus le contrôle suivant:

$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : NULL ;
if ($uri && (strpos($uri,'post.php') OR strpos($uri,'post-new.php')) ) { 
   add_action( 'wp_ajax_my_plugin', 'my_plugin_callback' );
   // load scripts etc.
}

Cela fonctionne bien pour ajouter mon action à $ wp_filter lors du chargement de la page post-new.php. Mais lorsque le script AJAX publie ses données sur admin-ajax.php, il exécute bien sûr à nouveau la fonction admin_init (car elle est exécutée à chaque chargement de la page d'administration). post.php 'ou' post-new.php '.

J'ai déplacé l'instruction wp_ajax add_action en dehors de mon test d'URI, et maintenant cela fonctionne très bien.

1
danblaker