WordPress как на ладони
WordPress темы и плагины за 250 рублей wordpress jino

Как передать в 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' ничего не попадает.

Заметки к вопросу:
_tango 4 месяца назад

Все, разобрался. При создании и обращении к сессионной переменной, надо было сессию продолжать.

    if(!session_id()) {
		session_start();
		$search_query = $_SESSION['search_query'];
	}
0
4 месяца назад

Нет ответов на этот вопрос.

    На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация