web-dev-qa-db-fra.com

Récupère la variable renvoyée d'une fonction à la fonction add_shortcode

Je passe avec succès un objet ajax au serveur suivant (le script dans le JS n'a pas d'importance, car je l'obtiens bien):

add_action( 'wp_ajax_my_action', 'my_action_callback' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
add_action( 'wp_enqueue_scripts', 'theme_name_scripts' );
add_shortcode('tagtest', 'timezone');

function theme_name_scripts() {
    wp_enqueue_script( 'script-name', plugins_url( '/assets/js/timezone.js', __FILE__ ), array('jquery'), '1.0.0', true );
    wp_localize_script( 'script-name', 'MyAjax', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
        'security' => wp_create_nonce( 'my-special-string' ),
    ));
}

function my_action_callback() {
    $whatever = strval( $_POST['whatever'] );
    echo $whatever;
    return $whatever;
    wp_die();
}

Mais j'ai la fonction de fuseau horaire qui est la fonction du hook add_shortcode. Je dois obtenir la variable $ what de my_action_callback dans la fonction timezone. Comment puis je faire ça?

function timezone(){
    $whatever = //Here I need the result from my_action_callback function
}

Juste au cas où voici mon script JS et une image assurant que l'objet passe correctement

jQuery(document).ready(function($) {

  var data = {
    action: 'my_action',
    security : MyAjax.security,
    whatever: 'Hello there'
  };

  // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
  $.post(MyAjax.ajaxurl, data, function(response) {
    alert('Here is: ' + response);
    return response;
  });
});

Voici la réponse XHR:

action: my_action
security: f1860eab4b
whatever: Hello there

Je reçois cet objet sans problème dans le rappel add_action

enter image description here

Comme je l'ai déjà dit, la seule chose dont j'ai besoin et que je n'ai pas fait fonctionner cela est d'obtenir la fonction $ quel que soit le fuseau horaire (le fuseau horaire est la fonction de add_shortcode). Comment puis-je obtenir cela? Merci d'avance.

1
dfrojas

Vous ne pouvez pas mettre AJAX dans le rappel pour un code abrégé. Cela n'a aucun sens de. Si vous faites une demande AJAX, vous le faites sur le serveur frontal et le shortcode a déjà été rendu.

Donc, tout ce que vous faites avec la réponse à la demande AJAX doit se produire sur le serveur frontal. Vous devez donc générer du code HTML dans le shortcode avec une classe ou un ID que votre JavaScript peut utiliser pour renseigner les données sur le serveur frontal.

Donc, votre shortcode pourrait ressembler à ceci:

function timezone(){
    echo '<div class="timezone"></div>';
}

Ensuite, votre demande AJAX devrait renseigner cette div avec la réponse à la fin:

$.post(MyAjax.ajaxurl, data, function(response) {
    $('.timezone').html( response );
});

Dans cet exemple, nous utilisons jQuery pour définir le code HTML de cette div sur la valeur de la réponse.

Si vous souhaitez que le code court ait une valeur par défaut, vous pouvez alors résumer la fonction responsable de la sortie dans sa propre fonction. Ensuite, utilisez simplement la même fonction à la fois dans les rappels AJAX et les codes abrégés.

Créons donc une fonction pour la sortie du texte:

function wpse_301294_whatever() {
    return 'Whatever';
}

Cette fonction renverra la chaîne Whatever.

Ensuite, nous pouvons mettre à jour le shortcode pour utiliser cette fonction dans la div:

function timezone(){
    echo '<div class="timezone">' . wpse_301294_whatever() . '</div>';
}

Et le AJAX callback:

function my_action_callback() {
    echo wpse_301294_whatever();
    wp_die();
}

Vous avez maintenant une fonction, wpse_301294_whatever(), chargée de générer quelque chose, ainsi qu'un code abrégé et un callback AJAX pouvant utiliser cette sortie dans différents contextes.

1
Jacob Peattie