AJAX живой поиск по заголовкам записей
Я создаю AJAX живой поиск для фильтрации заголовков записей в моей WordPress теме. Когда я что-то пишу в поле ввода, оно показывает все записи в результате, не фильтруя их для получения пользовательских записей.
Как реализовать живой поиск и найти запись с помощью AJAX?
Function.php
<?php
// Добавляем действия для авторизованных и неавторизованных пользователей
add_action('wp_ajax_my_action' , 'data_fetch');
add_action('wp_ajax_nopriv_my_action','data_fetch');
function data_fetch(){
$the_query = new WP_Query(array('post_per_page'=>5));
if( $the_query->have_posts() ) :
while( $the_query->have_posts() ): $the_query->the_post(); ?>
<h2><a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a></h2>
<?php endwhile;
wp_reset_postdata();
endif;
die();
}?>
Скрипт:
<script>
function fetch(){
// Отправляем AJAX запрос
$.post('<?php echo admin_url('admin-ajax.php'); ?>',{'action':'my_action'},
function(response){
$('#datafetch').append(response);
console.log(result);
});
}
</script>
HTML:
<input type="text" onkeyup="fetch()"></input>
<div id="datafetch">
</div>
Вот рабочее решение (протестировано как есть)
HTML (может быть частью содержимого страницы)
<input type="text" name="keyword" id="keyword" onkeyup="fetch()"></input>
<div id="datafetch">Здесь появятся результаты поиска</div>
JavaScript (добавляется в functions.php вашей темы)
// добавляем JS для AJAX-запроса
add_action( 'wp_footer', 'ajax_fetch' );
function ajax_fetch() {
?>
<script type="text/javascript">
function fetch(){
jQuery.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'post',
data: { action: 'data_fetch', keyword: jQuery('#keyword').val() },
success: function(data) {
jQuery('#datafetch').html( data );
}
});
}
</script>
<?php
}
И наконец, AJAX-вызов добавляется в functions.php вашей темы
// функция для AJAX
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){
$the_query = new WP_Query( array( 'posts_per_page' => -1, 's' => esc_attr( $_POST['keyword'] ), 'post_type' => 'post' ) );
if( $the_query->have_posts() ) :
while( $the_query->have_posts() ): $the_query->the_post(); ?>
<h2><a href="<?php echo esc_url( get_permalink() ); ?>"><?php the_title();?></a></h2>
<?php endwhile;
wp_reset_postdata();
endif;
die();
}
Дополнение: Вот как я сделал свою AJAX-функцию для точного поиска:
// функция для AJAX
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){
$the_query = new WP_Query(
array(
'posts_per_page' => -1,
's' => esc_attr( $_POST['keyword'] ),
'post_type' => 'post'
)
);
if( $the_query->have_posts() ) :
while( $the_query->have_posts() ): $the_query->the_post();
$myquery = esc_attr( $_POST['keyword'] );
$a = $myquery;
$search = get_the_title();
if( stripos("/{$search}/", $a) !== false) {?>
<h4><a href="<?php echo esc_url( get_permalink() ); ?>"><?php the_title();?></a></h4>
<?php
}
endwhile;
wp_reset_postdata();
endif;
die();
}

Знаете ли вы способ искать ключевое слово только в заголовке или только в описании?

возможно, используя только фильтр posts_where
вместо 's'
, как в https://wordpress.stackexchange.com/questions/298888/wp-query-where-title-begins-with-a-specific-letter)

Мне нужно, чтобы посты отображались вместо текста "здесь появятся результаты поиска", а затем при поиске просто фильтровались результаты. Возможно ли это с этим методом? У меня сейчас это реализовано и работает, но до начала поиска страница пустая.

Вы забыли вызвать его как searchinput, вы можете вставить следующий код в functions.php
// функция для ajax
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){
$the_query = new WP_Query( array( 'posts_per_page' => 5, 's' => esc_attr( $_POST['keyword'] ), 'post_type' => 'post' ) );
if( $the_query->have_posts() ) :
while( $the_query->have_posts() ): $the_query->the_post(); ?>
<a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a>
<?php endwhile;
wp_reset_postdata();
else:
echo '<h3>Результатов не найдено</h3>';
endif;
die();
}
// добавление js для ajax запроса
add_action( 'wp_footer', 'ajax_fetch' );
function ajax_fetch() {
?>
<script type="text/javascript">
function fetchResults(){
var keyword = jQuery('#searchInput').val();
if(keyword == ""){
jQuery('#datafetch').html("");
} else {
jQuery.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'post',
data: { action: 'data_fetch', keyword: keyword },
success: function(data) {
jQuery('#datafetch').html( data );
}
});
}
}
</script>
<?php
}
После этого найдите и откройте searchform.php. Теперь вам нужно заменить элемент id на указанный выше (searchInput) и добавить этот код
onkeyup="fetchResults()"
Рядом с элементом id, так что итоговый код будет выглядеть так:
<form method="get" class="td-search-form-widget" action="<?php echo esc_url(home_url( '/' )); ?>">
<div role="search">
<input class="td-widget-search-input" type="text" value="<?php echo get_search_query(); ?>" name="s" id="searchInput" onkeyup="fetchResults()" /><input class="wpb_button wpb_btn-inverse btn" type="submit" id="searchsubmit" value="<?php _etd('Поиск', TD_THEME_NAME)?>" />
</div>
</form>
Убедитесь, что вы вносите изменения в дочернюю тему.
Последний шаг: добавьте <div id="datafetch"></div>
прямо перед </form>, и вы увидите живой поиск в вашей форме поиска.
Вы также можете сделать это с помощью плагина для живого поиска, это самый простой способ, если вы не знаете, как кодить. Надеюсь, это поможет.

/* Заполнение в профиле администратора */
add_action( 'show_user_profile', 'extra_user_profile_fields' );
add_action( 'edit_user_profile', 'extra_user_profile_fields' );
function extra_user_profile_fields( $user ) { ?>
<h3><?php _e("Дополнительная информация профиля", "blank"); ?></h3>
<table class="form-table">
<tr>
<th><label for="address"><?php _e("Адрес"); ?></label></th>
<td>
<input type="text" name="postSearch" id="postSearch" value="<?php echo esc_attr( get_the_author_meta( 'postSearch', $user->ID ) ); ?>" class="regular-text" /><br />
<span class="description"><?php _e("Пожалуйста, введите ваш адрес."); ?></span>
<div id="datafetch"></div>
</td>
</tr>
</table>
<?php }
// jQuery Ajax запрос
add_action( 'admin_footer', 'ajax_fetch' );
function ajax_fetch() {
?>
<script type="text/javascript">
(function($){
var searchRequest = null;
jQuery(function () {
var minlength = 3;
jQuery("#postSearch").keyup(function () {
var that = this,
value = jQuery(this).val();
if (value.length >= minlength ) {
if (searchRequest != null)
searchRequest.abort();
searchRequest = jQuery.ajax({
type: "POST",
url: "<?php echo admin_url('admin-ajax.php'); ?>",
data: {
action: 'data_fetch',
search_keyword : value
},
dataType: "html",
success: function(data){
//проверяем совпадение значения
if (value==jQuery(that).val()) {
jQuery('#datafetch').html(data);
}
}
});
}
});
});
}(jQuery));
</script>
<?php
}
// Ajax функция
add_action('wp_ajax_data_fetch' , 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch','data_fetch');
function data_fetch(){
$the_query = new WP_Query( array( 'posts_per_page' => -1, 's' => esc_attr( $_POST['search_keyword'] ), 'post_type' => 'post' ) );
if( $the_query->have_posts() ) :
while( $the_query->have_posts() ): $the_query->the_post(); ?>
<h2><a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a></h2>
<?php endwhile;
wp_reset_postdata();
endif;
die();
}

Извините, что упоминаю (и, пожалуйста, не принимайте это на свой счет), но, пожалуйста, не предлагайте плагины в ответе! Я знаю, что пользователи здесь на wpse не могут оставлять комментарии, пока не наберут определенное количество очков репутации. Также общеизвестно, что wpse предназначен для помощи с кодом, а не для поиска плагинов, для чего существует репозиторий на WordPress.org. Еще хуже, что ваш совет касается стороннего коммерческого плагина. По моему скромному мнению, это неприемлемо, и я помечу этот ответ.
