AJAX поиск на страницах записей по пользовательскому типу записи
22 авг. 2012 г., 22:58:43
Просмотры: 14.9K
Голосов: 8
У меня проблема с созданием AJAX поиска на страницах отдельных записей. Мне нужно ограничить результаты поиска пользовательскими типами записей "fod_videos" и "post" и категорией 12. Проблема в том, что поиск возвращает все записи под этими фильтрами, не учитывая значение поиска. Думаю, я упускаю что-то очевидное, но не могу понять что. Вот мой код.
<div class="panel">
<h2>Поиск видео</h2>
<div id="my-search">
<form role="search" method="get" id="searchform" action="http://myurl.com/" >
<input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Поиск" />
</form>
</div>
</div>
add_action('wp_ajax_wpa5000_search', 'wpa5000_search');
add_action('wp_ajax_nopriv_wpa5000_search', 'wpa5000_search');
function wpa5000_search(){
global $wp_query;
$search = $_POST['search_val'];
$args = array(
's' => $search,
'posts_per_page' => 10,
'cat' => 12,
'post_type' => array( 'post','fod_videos' )
);
$wp_query = new WP_Query( $args );
get_template_part( 'video-search-results' );
exit;
}
add_action( 'wp_enqueue_scripts', 'wpa56343_scripts', 100 );
function wpa56343_scripts() {
wp_enqueue_script(
'wpa56343_script',
get_template_directory_uri() . '/libs/search.js?ver=1.0',
array( 'jquery' ),
null,
false
);
wp_localize_script(
'wpa56343_script',
'WPaAjax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
)
);
}
// search.php
$(document).ready(function($){
$('#searchsubmit').click(function(e){
var $panel = $(this).closest(".panel");
$panel.empty();
e.preventDefault();
var search_val=$("#s").val();
$.post(
WPaAjax.ajaxurl,
{
action : 'wpa5000_search',
search_val : search_val
},
function( response ) {
$panel.append( response );
}
);
});
});
//video-search-results.php
<?php
while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
//СОДЕРЖИМОЕ
<?php endwhile; ?>

Pollux Khafra
888
Комментарии
Все ответы на вопрос
2
0
JavaScript
Вместо 'cat' => 12
и $wp_query
используйте 'category_name' => slug
и get_posts()
.
Вот базовый пример того, как это работает:
PHP
add_action( 'wp_loaded', array ( 'T5_Ajax_Search', 'init' ) );
/**
* Добавляет AJAX-функционал к форме поиска.
*/
class T5_Ajax_Search
{
/**
* Основной экземпляр. Можно создавать дополнительные экземпляры для unit-тестов.
* @type object
*/
protected static $instance = NULL;
/**
* Имя действия, используемое обработчиками AJAX.
* @type string
*/
protected $action = 't5_ajax_search';
/**
* Обработчик для первоначальной загрузки.
*
* @wp-hook wp_loaded
* @return void
*/
public static function init()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Конструктор. Регистрирует действия.
*
* @wp-hook wp_loaded
* @return object
*/
public function __construct()
{
$callback = array ( $this, 'search' );
add_action( 'wp_ajax_' . $this->action, $callback );
add_action( 'wp_ajax_nopriv_' . $this->action, $callback );
add_action( 'wp_enqueue_scripts', array ( $this, 'register_script' ) );
}
/**
* Обработчик для AJAX-поиска.
*
* @wp-hook wp_ajax_t5_ajax_search
* @wp-hook wp_ajax_nopriv_t5_ajax_search
* @return void
*/
public function search()
{
$args = array ( 's' => $_POST['search_term'] );
$args = apply_filters( 't5_ajax_search_args', $args );
$posts = get_posts( $args );
if ( $posts )
{
$this->render_search_results( $posts );
}
else
{
print '<b>ничего не найдено</b>';
}
exit;
}
/**
* Формирует разметку из массива $posts
*
* @param array $posts Массив объектов постов
* @return void
*/
protected function render_search_results( $posts )
{
print '<ul class="t5-ajax-search-results">';
foreach ( $posts as $post )
{
printf(
'<li><a href="%1$s">%2$s</a></li>',
get_permalink( $post->ID ),
esc_html( $post->post_title )
);
}
print '</ul>';
}
/**
* Регистрирует скрипт и локальные переменные.
*
* @wp-hook wp_enqueue_scripts
* @return void
*/
public function register_script()
{
wp_enqueue_script(
't5-ajax',
#plugins_url( __FILE__ ) . '/search.js',
plugins_url( 'search.js', __FILE__ ),
array ( 'jquery' ),
NULL,
TRUE
);
wp_localize_script(
't5-ajax',
'T5Ajax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'action' => $this->action
)
);
}
}
JavaScript search.js
jQuery( function( $ ) {
// поле поиска
var $s = $( '#s' );
// форма поиска
var $sForm = $s.closest( 'form' );
console.log( $sForm );
$sForm.on( 'submit', function( event) {
event.preventDefault();
$.post(
T5Ajax.ajaxurl,
{
action: T5Ajax.action,
search_term: $s.val()
},
function( response ) {
// просто добавляем результат к форме поиска.
$sForm.append( response );
}
);
});
});
Ограничение поиска
add_filter( 't5_ajax_search_args', 'restrict_t5_search' );
function restrict_t5_search( $args )
{
$args['post_type'] = array ( 'post', 'fod_videos' );
$args['category_name'] = 'category-slug';
return $args;
}
Вместо моего $this->render_search_results( $posts );
вы также можете загрузить шаблон из вашей темы и использовать массив $posts
для более сложного вывода результатов. :)

fuxia
107K
25 авг. 2012 г. 02:49:44
Похожие вопросы