Как передать в wp_ajax критерий поискового запроса?
Ребята, помогите пожалуйста разобраться. Задача у меня, была такая. Надо было сделать аякс подгрузку результатов штатного механизма поиска. То есть нажимая кнопку "найти", пользователь попадает на новую страничку с результатами поиска (search.php в теме). Но вначале выводятся только три результата, а по мере прокручивания страницы подгружаются остальные, тоже по три.
/* Форма поиска: */
<div id="search">
<button type="button" class="close">×</button>
<form action="<?php echo home_url( '/' ); ?>" method="post" role="search">
<input type="text" name="s" value="" placeholder="<?php _e('type keyword(s) here', 'domain'); ?>" />
<button type="submit" class="btn btn-red"><?php _e('Search', 'domain'); ?></button>
</form>
</div>
/* Страничка вывода результатов (search.php): */
...
<div class="col-md-8 col-sm-12 ajaxload" data-action="search">
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="blog-post">
<?php echo get_template_part_data('template_parts/ajax-post_teaser'); ?> // это просто обертка для locate_template();
</div>
<?php endwhile; ?>
<?php else : ?>
<p><?php _e('Sorry, Nothing Found', 'domain'); ?></p>
<?php endif; ?>
</div>
...
/* Шаблон отдельного результата (ajax-post_teaser): */
<div class="blog-post">
<a href="<?php the_permalink(); ?>">
<?php echo kama_thumb_img("w=745 &h=420 &class=img-responsive"); ?>
</a>
<div class="row">
<div class="col-md-5 col-sm-12">
<h6><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h6>
</div>
<div class="col-md-7 col-sm-12">
<div class="blog-post-date">
<?php echo get_the_date(); ?>
</div>
<p>
<?php echo wp_trim_words( get_the_content(), 50, '...' ); ?>
<a class="color-red more-link" href="<?php the_permalink(); ?>"><?php _e('Read more', 'domain'); ?></a>
</p>
</div>
</div>
</div>
/* Скрипт формирующий ajax запрос и вызывающий обработчик: */
var $container = $('.ajaxload');
var $window = $(window);
if ($container.length) {
$(window).scroll(function() {
var length_from_top = $container.offset().top + $container.height();
var scroll_from_top = $window.scrollTop() + $window.height();
if((scroll_from_top > length_from_top) && !$container.hasClass('loading')) {
var data = {
action: 'more_'+ $container.data('action'),
nonce : params.nonce,
per_page: 3,
offset: $container.find('.blog-post').length,
};
$.ajax({
url: params.ajax_url,
data: data,
type: 'POST',
beforeSend: function(xhr){
$container.addClass('loading');
$container.append('<img class="loader" src="'+params.images_url+'/loading.gif"/>');
},
success: function(response){
// тут просто красоту навожу
if(response) {
$container.append(response.replace(/^blog-post$/g, 'blog-post added'));
$container.find('.added').each(function(i, el){
$(el).css({'opacity':0});
setTimeout(function(){
$(el).animate({'opacity':1.0}, 450);
}, (i*500));
}).removeClass('added');
$container.removeClass('loading');
}
},
complete: function() {
$container.find('img.loader').remove();
}
});
}
});
}
/* Подключаю скрипт и передаю в него всякое нужное: */
add_action( 'wp_enqueue_scripts', 'my_scripts' );
function my_scripts() {
wp_enqueue_script( 'my-commonjs', get_template_directory_uri() . '/js/common.js', array('jquery'), null, true );
wp_localize_script( 'my-commonjs', 'params', array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'images_url' => get_template_directory_uri().'/images',
'nonce' => wp_create_nonce('my-nonce')
));
}
/* Искать только посты и только в заданных категориях. Вывести первые три из найденных */
add_action( 'pre_get_posts', 'search_filter' );
function search_filter($query) {
if ( ! is_admin() && $query->is_main_query() ) {
if ($query->is_search) {
$query->set('post_type', 'post');
$query->set('category_name', 'press, blog');
$query->set( 'posts_per_page', 3 );
$_SESSION['search_query'] = $_POST['s'];
}
return $query;
}
}
/* Собственно сам обработчик: */
add_action( 'wp_ajax_more_search', 'my_more_search', 10, 2 );
add_action( 'wp_ajax_nopriv_more_search', 'my_more_search', 10, 2 );
function my_more_search($per_page, $ajax=true) {
$nonce = $_POST['nonce'];
$offset = ($_POST[ 'offset' ]) ? (int) $_POST['offset'] : 0;
$perpage = (!$per_page) ? (int) $_POST['per_page'] : $per_page;
if($ajax && !wp_verify_nonce($nonce, 'ivan-nonce')) die('Security error!');
$q = new WP_Query(array(
'post_type' => 'post',
'category_name' => 'blog, press',
'post_status' => 'publish',
'posts_per_page' => $perpage,
'offset' => $offset,
's' => $_SESSION['search_query']
));
while ($q->have_posts()) {
$q->the_post();
get_template_part('template_parts/ajax', 'post_teaser');
}
wp_reset_postdata();
if($ajax) die();
}
Проблема в том, что не могу передать в обработчик критерий поиска. Почему-то до его вызова сессионная переменная доступна и выводится на страничке с результатами, а внутри него в 's' ничего не попадает.
Все, разобрался. При создании и обращении к сессионной переменной, надо было сессию продолжать.
if(!session_id()) { session_start(); $search_query = $_SESSION['search_query']; }