Je développe un plugin et j'ai commencé à partir de WPPB et de Wordpress 4.3.1. Je l'ai nommé dogmaweb. Je dois soumettre un formulaire au plugin via Ajax. Le formulaire est créé par le plugin lui-même. Dans mon class-dogmaweb.php, j'essaie d'ajouter l'action qui traite le côté serveur de données de formulaire, et voici ce que j'ai proposé jusqu'à présent:
public function enqueue_scripts()
{
$script_handle = 'userprofilesumbit';
add_action( 'wp_ajax_'.$script_handle, array($this, 'userprofileform_process') );
add_action( 'wp_ajax_nopriv_'.$script_handle, array($this, 'userprofileform_process') );
wp_register_script( $script_handle, plugins_url() . '/public/js/dogmaweb-public.js' );
$userprofilesumbit_data = array('ajax_url' => admin_url( 'admin-ajax.php' ), 'form_action' => $script_handle, 'form_id' => '#'.Dogmaweb::$userprofileform_id);
wp_localize_script($script_handle, 'submit_params', $userprofilesumbit_data);
wp_enqueue_script($script_handle);
}
Le symptôme du problème est que admin-ajax.php n'appelle pas ma fonction et renvoie 0. J'ai parcouru le code wordpress pour comprendre pourquoi (j'utilise Netbeans et xdebug). Le problème est que ces lignes de code dans plugin.php ne trouvent pas le $tag
dans le tableau $wp_filter
. La variable $tag
à ce stade contient "wp_ajax_userprofilesumbit"
, ce qui est exactement ce que j'ai spécifié pour l'argument $hook
de la fonction add_action (j'ai utilisé la même variable $script_handle
que vous pouvez voir dans mon code). J'ai également exploré le code add_action
et je suis sûr que le tableau global $wp_filter
contient la clé "wp_ajax_userprofilesumbit"
lorsque add_action
est renvoyé après que je l'ai appelé. Cependant, je suis également sûr qu'il ne contient plus cette clé lorsque plugin.php est exécuté (appelé par admin-ajax.php).
Pourquoi mon filtre est-il supprimé de $wp_filter
? Qu'est-ce que je fais mal?
J'ai parcouru le code du plugin et vous pouvez essayer d'utiliser la méthode define_public_hooks()
de la classe Plugin_Name
pour enregistrer vos rappels d'action ajax de la classe Plugin_Name_Public
:
/**
* Register all of the hooks related to the public-facing functionality
* of the plugin.
*
* @since 1.0.0
* @access private
*/
private function define_public_hooks() {
$plugin_public = new Plugin_Name_Public( $this->get_plugin_name(), $this->get_version() );
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
// Add your ajax actions here instead
$script_handle = 'userprofilesumbit';
$this->loader->add_action( 'wp_ajax_' . $script_handle, $plugin_public, 'userprofileform_process' );
$this->loader->add_action( 'wp_ajax_nopriv_' . $script_handle, $plugin_public, 'userprofileform_process' );
}
Qu'est-ce qui se passe là-bas est que vous devez vous déplacer:
add_action( 'wp_ajax_'.$script_handle, array($this, 'userprofileform_process') );
add_action( 'wp_ajax_nopriv_'.$script_handle, array($this, 'userprofileform_process') );
Hors de la fonction enqueue_scripts
, du fait de la manière dont elle est configurée, ces actions ne sont pas liées, car cette fonction ne sera exécutée que sur les actions frontales.