web-dev-qa-db-fra.com

add_action et Ajax

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?

1
Lucio Crusca

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' );

}
3
birgire

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.

3
Bordoni