AJAX живой поиск по заголовкам записей

22 сент. 2016 г., 01:18:54
Просмотры: 48.7K
Голосов: 5

Я создаю 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>
2
Комментарии

Значит, вы хотите, чтобы запрос искал в заголовках записей (и ключевое слово из заголовка передается через input в вашей html-форме)?

Ahmed Fouad Ahmed Fouad
22 сент. 2016 г. 01:21:39

@AhmedElmahdy ДА

FRQ6692 FRQ6692
22 сент. 2016 г. 01:23:10
Все ответы на вопрос 4
4
22

Вот рабочее решение (протестировано как есть)

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();
}
22 сент. 2016 г. 01:46:05
Комментарии

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

Fanky Fanky
13 февр. 2020 г. 20:06:19

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

Fanky Fanky
13 февр. 2020 г. 20:17:51

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

Amir Khadem Amir Khadem
14 июл. 2021 г. 03:03:37

Отличный ответ. Я только заменил post_permalink() (устаревшая) на get_permalink()

User User
12 янв. 2022 г. 04:09:27
0

Вы забыли вызвать его как 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>, и вы увидите живой поиск в вашей форме поиска.

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

7 окт. 2019 г. 08:48:44
0
/* Заполнение в профиле администратора */
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(); 
}
28 янв. 2019 г. 11:29:07
1
-2

Я использую этот плагин:

ajax-search-pro-for-wordpress-live-search-plugin

Это лучший плагин

И вы можете сделать это за 5 секунд с его помощью.

Я использовал этот плагин во многих своих проектах.

22 сент. 2016 г. 02:17:29
Комментарии

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

Charles Charles
23 сент. 2016 г. 13:52:12