web-dev-qa-db-fra.com

Emplacement de add_action () pour le rappel ajax?

Ceci est probablement une question gifle Palm, mais je suis confus.

J'ai créé ce que je pensais être une simple page de modèle WP. Un formulaire pour mettre à jour un formulaire sur une base de données via un rappel ajax. En bas, j'ai placé les instructions add_action () pour que la fonction de rappel se déclenche lorsque le formulaire est envoyé via WP-AJAX.

J'ai vite compris que la fonction de rappel (les fonctions des instructions add_action ()) ne se déclenchait pas. Le code de réponse de la fonction 'done' dans mon jQuery était 0 ... ce qui signifie que WP-AJAX ne pouvait pas se connecter à la fonction de rappel.

add_action('wp_ajax_updateuserprofileAction',        'updateuserprofileAction');
add_action('wp_ajax_nopriv_updateuserprofileAction', 'updateuserprofileAction');


function updateuserprofileAction($args) {
$nonce = $_POST['send'];

if ( !wp_verify_nonce($_POST['send'],'jch-ajax-update-userprofile') ) {
  echo $nonce;
  die ( $nonce ); }

// Read the form values
$success = false;
$senderFirstName = isset( $_POST['senderFirstName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderFirstName'] ) : "";
$senderLastName = isset( $_POST['senderLastName'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_POST['senderLastName'] ) : "";   
$senderEmail = isset( $_POST['senderEmail'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['senderEmail'] ) : "";

// If all values exist, send the email
if ( $senderFirstName && $senderLastName && $senderEmail) {

    global $current_user;
    get_currentuserinfo();

    update_user_meta( $current_user->ID, 'phone', $_POST['senderPhone']);

    if($success == 1)
    {       
      die('success');
    }
}
else {
    die( 'ERROR');
}
}

Par frustration, j'ai déplacé la fonction de rappel et les instructions add_action vers un plug-in qui utilise également WP-AJAX et immédiatement ... cela fonctionne.

Donc ma question est: pourquoi? Pourquoi ne pouvez-vous pas insérer les instructions add_action () dans une page de modèle? Ou pour le dire autrement: quelles sont les "règles" pour l'endroit où vous pouvez placer add_action ()?

Idéalement, j'aimerais conserver les fonctions add_action () et de rappel dans le même fichier que la page de modèle. Y a-t-il un moyen de faire cela?

1
jchwebdev

Lorsque vous envoyez une demande AJAX, wp-admin/admin-ajax.php est appelé et non votre fichier de modèle. Cette demande séparée n’a pas connaissance de tout le code existant dans tous les modèles existants, car ils ne sont même pas inclus.

Ce qui est inclus: les fichiers functions.php et les plugins du thème. C'est pourquoi votre rappel fonctionne dans un plugin.

En règle générale, les modèles ne doivent jamais contenir de code d'entreprise. Pas de déclaration de fonction ou de classe, pas d'enregistrement de rappels. Ce sont des modèles, ils devraient simplement ajouter du balisage aux données, rien d’autre.

2
fuxia