Intereting Posts

Запустите снова текущий запрос через ajax, но измените var

У меня есть пользовательский запрос, который является $query . Вход основан на вводе формы. Запрос уже запущен на странице, но после этого я хочу снова запустить его без перезагрузки страницы, поэтому с AJAX (когда пользователи выбирают вкладку (Bootstrap)).

Дело в том, что мне нужно изменить запрос var posts_per_page на -1 .

Код, который нужно сделать, когда выбран вкладка:

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

Теперь в рамках этой функции я могу сделать

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

Но я не знаю, как использовать $query который уже определен. Мне нужно только изменить posts_per_page . Могу ли я сделать это с помощью set_query_var ? Или это можно использовать только для основного цикла?

Solutions Collecting From Web of "Запустите снова текущий запрос через ajax, но измените var"

Вы должны заметить, что запрос ajax представляет собой совершенно новый HTTP-запрос, поэтому переменная $query определена на странице, которая отправляет запрос ajax, но не будет установлена ​​на странице, которая получит запрос.

Это означает, что вы полностью воссоздаете запрос и не изменяете параметр.

При этом у вас есть две возможности:

1: запрос является обычным

Если запрос является настраиваемым (вы создаете его с помощью WP_Query ), вы можете написать функцию, которая возвращает этот запрос и вызывать его со страницы и из функции, зависящей от действия 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: Запрос является основным запросом

Если вы хотите реплицировать основной запрос, изменяя один или несколько параметров, cosider, чтобы передать vars запросов к скрипту через wp_localize_script и передать их через ajax функции, которая обрабатывает действие ajax, что-то вроде:

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

После этого в файле js вы можете:

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

Теперь вы можете передать запрос ajax так:

 // 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(); }