web-dev-qa-db-fra.com

Exécuter à nouveau la requête actuelle via ajax mais en changeant une var

J'ai une requête personnalisée qui est $query. La saisie est basée sur la saisie de formulaire. La requête a déjà été exécutée sur une page, mais je souhaite ensuite l'exécuter à nouveau sans rechargement de page, donc avec AJAX (lorsque l'utilisateur sélectionne un onglet (Bootstrap)).

Le problème est que je dois changer la requête var posts_per_page en -1.

Le code pour faire quelque chose lorsque l'onglet est sélectionné est:

$('#myTab').on('shown', function () {
   // Do stuff here
})

Maintenant, dans cette fonction, je peux faire

jQuery.ajax(
    {  
        type: 'POST',  
        url: ajaxurl, // example.com/wp-admin/admin-ajax.php is defined in my js file
        data: 
        {  
            action: 'the_function_here',
            ajaxnonce: YTajax.ajaxnonce, // Also defined
        },
        success: function(data, textStatus, XMLHttpRequest)
        {  
            jQuery('#bodyForOutput').html(data);  
        },  
        error: function(MLHttpRequest, textStatus, errorThrown)
        {  
            alert(errorThrown);
        }
    });

Mais je ne sais pas vraiment comment utiliser le $query qui est déjà défini. Je n'ai qu'à modifier le posts_per_page. Puis-je faire cela avec set_query_var? Ou est-ce seulement utilisable pour la boucle principale?

1
eskimo

Vous devez noter qu'une demande ajax est une toute nouvelle requête http, donc la variable $query est définie dans la page quesendla demande ajax mais sera pas défini dans la page quereceivela requête.

Cela signifie que vous avez complètement recréé la requête et non modifié un paramètre.

Ceci dit, vous avez 2 possibilités:

1: La requête est personnalisée

Si la requête est personnalisée (vous la créez à l'aide de WP_Query), vous pouvez écrire une fonction qui retourne cette requête et l'appeler à partir de la page et de la fonction accrochée à l'action ajax:

// in functions.php or in plugin
function my_custom_query( $posts_per_page = 10 ) {
  $args = array(
    'posts_per_page' => $posts_per_page,
    // other args here
  ); 
  return new WP_Query( $args );
}

// then inside the page
$query = my_custom_query();
while ( $query->have_posts() ) { $query->the_post();
  // your loop code here
}

// and handling ajax action
add_action('wp_ajax_the_function_here', 'my_ajax_loop');
add_action('wp_ajax_nopriv_the_function_here', 'my_ajax_loop');
function my_ajax_loop() {
   $query = my_custom_query( -1 );
   while ( $query->have_posts() ) { $query->the_post();
     // your loop code here
   }
   die();
}

2: la requête est la requêtemain

Si vous souhaitez répliquer la requête principale en changeant un ou plusieurs paramètres, choisissez de transmettre les vars de requête au script via wp_localize_script et de les transmettre via ajax à la fonction qui gère l'action ajax, par exemple:

add_action('wp_enqueue_script', 'add_my_scripts');

function add_my_scripts() {
  // here I'm assuming the javascript file where you have the code you posted
  // is called 'myscript.js' and resides in 'js' subfolder inside theme folder
  wp_enqueue_script('my_script', get_template_directory_uri() . '/js/myscript.js');
  global $wp_query;
  $qv = $wp_query->query;
  wp_localize_script('my_script', 'my_script_data', array('query' => $qv) );
}

Après cela, dans le fichier js, vous pouvez:

jQuery.ajax({  
  type: 'POST',  
  url: ajaxurl, // example.com/wp-admin/admin-ajax.php is defined in my js file
  data:  {  
    action: 'the_function_here',
    ajaxnonce: YTajax.ajaxnonce, // Also defined
    query: my_script_data.query // Defined by 'wp_localize_script'
  },
  success: function(data, textStatus, XMLHttpRequest) {  
    jQuery('#bodyForOutput').html(data);  
  },  
  error: function(MLHttpRequest, textStatus, errorThrown) {
    alert(errorThrown);
  }
});

Maintenant vous pouvez manipuler la requête ajax comme ceci:

// and handling ajax action
add_action('wp_ajax_the_function_here', 'my_ajax_loop');
add_action('wp_ajax_nopriv_the_function_here', 'my_ajax_loop');
function my_ajax_loop() {
   $args = (array) filter_var(INPUT_POST, 'query');
   $args['posts_per_page'] = -1;
   $query = new WP_Query($args);
   while ( $query->have_posts() ) { $query->the_post();
     // your loop code here
   }
   die();
}
4
gmazzap