Как передать в 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' ничего не попадает.
Все, разобрался. При создании и обращении к сессионной переменной, надо было сессию продолжать.