Как осуществлять поиск с помощью ajax по точной фразе или словам в поле ввода?

Вопрос или проблема

Я следил за этим, и это работает почти идеально, но оно находит не только заголовки постов с теми же словами, что мы вводим в поле ввода, а находит ВСЕ посты независимо от этого.

HTML

<input name="usp-title" id="usp-title" type="text" value="" data-required="true" required="required" maxlength="99" placeholder="Введите здесь..." class="usp-input usp-input-title form-control">

AJAX

add_action( 'wp_footer', 'ajax_fetch' );
function ajax_fetch() {
?>

<script type="text/javascript">

function fetch(){
console.log(jQuery('#usp-title').val());
        jQuery.ajax({
            url: '<?php echo admin_url('admin-ajax.php'); ?>',
            type: 'post',
            data: { action: 'data_fetch', exactwords:  jQuery('#usp-title').val() },
            success: function(data) {
            var text1;
            var text1B;
            var text2;
            var text2B;
                    jQuery("#datafetch").html(data).promise().done(function(){
                        text1 = jQuery("#datafetch").find("h2").find("a").html();
                        text1B = text1.toLowerCase();
                text2 = jQuery('#usp-title').val();
                        text2B = text2.toLowerCase();
                console.log(text1B);
                console.log(text2B);
                        if (text1B != text2B) {
                            jQuery("#componi").removeAttr("disabled", "disabled").show();
                            jQuery("#fatto").hide();
                            //jQuery('#datafetch').empty();
                        } else if (text1B == text2B) {
                            jQuery("#componi").attr("disabled", "disabled").hide();
                        }
            });
            }
        });
}
</script>

PHP

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['usp-title'] ), 'post_type' => 'post' ) );
    if( $the_query->have_posts() ) : ?> 
       <div class="jumbotron">
        <h4>Мы уже нашли занятия с тем же заголовком,<br>используйте одно из них или напишите другой заголовок.</h4>
    </div>
       <ul class="list-unstyled margin-top-80">
        <?php while( $the_query->have_posts() ): $the_query->the_post(); ?>
           <li>
        <?php $time = usp_get_meta(false, 'usp-custom-10'); ?>
        <?php $space = usp_get_meta(false, 'usp-custom-3'); ?>
        <?php $spaceB = usp_get_meta(false, 'usp-custom-7'); ?>
            <h2><a target="_blank" href="https://wordpress.stackexchange.com/questions/263028/<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a></h2>
            <p><strong>Пространство:</strong> <?php echo $space;?> <?php echo $spaceB; ?></p>
         <p><strong>Время:</strong> <?php echo $time; ?></p>
         <?php the_excerpt(); ?>
           </li>
        <?php endwhile;
        wp_reset_postdata(); ?>
      </ul>
    <?php endif;

    die();
}

Как я могу ограничить результаты только теми, у кого тот же заголовок, что и в текстовом поле ввода?

Это больше похоже на хак, но я не мог найти другого способа, пробовал exact= "true" и sentence="true" в качестве параметров в запросе, но все равно получал все результаты, а не только точно совпадающие. Поэтому, так как у меня были результаты в виде списка, я делаю проверку в DOM и удаляю всё, что не совпадает точно с .val()

function searchAjax(){
  jQuery.ajax({
    url: '<?php echo admin_url('admin-ajax.php'); ?>',
    type: 'post',
    data: { action: 'data_fetch', exactwords:  jQuery('#usp-title').val() },
    success: function(data) {
      var text2;
      var text2B;
      text2 = jQuery('#usp-title').val();
      text2B = text2.toLowerCase();
      jQuery("#datafetch").html(data).promise().done(function(){
        jQuery("#datafetch ul li h2 a").each(function() {
          var $this = jQuery(this);
          if ($this.text().toLowerCase() !== text2B) {
            $this.parent().parent().remove();
            jQuery(".jumbotron").remove();
            jQuery("#componi").removeAttr("disabled", "disabled").show();
          } else if ($this.text().toLowerCase() == text2B) {
            jQuery("#componi").attr("disabled", "disabled").hide();
          }
        });
      });
    }
  });
}

.

Ответ или решение

Чтобы реализовать поиск с использованием AJAX, который будет находит только те посты, заголовки которых точно совпадают с введённым текстом, выполним следующие шаги, как в JavaScript, так и в PHP. После прочтения вашего кода, я вижу, что вам нужно внести изменения в ваше PHP-запрос, а также немного улучшить логику JavaScript.

Шаг 1: Изменение PHP-кода

Ваш текущий код использует стандартный поиск WordPress, но не проверяет на точное совпадение заголовков постов. Для того чтобы добиться этого, можно использовать WP_Query с post_title__in или фильтровать результаты после получения.

Вот пример, как это сделать:

add_action('wp_ajax_data_fetch', 'data_fetch');
add_action('wp_ajax_nopriv_data_fetch', 'data_fetch');

function data_fetch() {
    $search_title = esc_attr(trim($_POST['exactwords'])); // Получаем текст из Ajax запроса
    $the_query = new WP_Query(array(
        'posts_per_page' => -1, // Получить все посты
        'post_type'      => 'post',
        's'              => $search_title, // Стандартный поиск по содержимому
    ));

    // Обрабатываем результаты
    if ($the_query->have_posts()) : ?>
        <div class="jumbotron">
            <h4>Мы нашли посты, совпадающие с заголовком "<?php echo $search_title; ?>".</h4>
        </div>
        <ul class="list-unstyled margin-top-80">
        <?php while ($the_query->have_posts()) : $the_query->the_post();
            if (stripos(get_the_title(), $search_title) !== false): // Проверяем совпадение заголовка
                ?>
                <li>
                    <h2><a target="_blank" href="<?php echo esc_url(post_permalink()); ?>"><?php the_title(); ?></a></h2>
                    <p><?php the_excerpt(); ?></p>
                </li>
                <?php
            endif;
        endwhile; ?>
        </ul>
    <?php else : ?>
        <h4>Не найдено постов с заголовком "<?php echo $search_title; ?>".</h4>
    <?php endif;

    wp_reset_postdata(); // Сбрасываем посты
    die();
}

Шаг 2: Улучшение JavaScript

Теперь вы можете несколько улучшить ваш JavaScript-код, чтобы обрабатывать полученные и фильтровать результат по заголовкам. Вам не нужно будет повторно проверять совпадение в DOM:

function fetch() {
    const inputValue = jQuery('#usp-title').val().trim(); // Получаем значение инпута
    jQuery.ajax({
        url: '<?php echo admin_url('admin-ajax.php'); ?>',
        type: 'post',
        data: { action: 'data_fetch', exactwords: inputValue },
        success: function(data) {
            jQuery("#datafetch").html(data).promise().done(function(){
                // Настройка элементов на основе полученных данных
                const results = jQuery("#datafetch ul li");
                if (results.length === 0) {
                    jQuery("#componi").removeAttr("disabled").show();
                } else {
                    jQuery("#componi").attr("disabled", "disabled").hide();
                }
            });
        }
    });
}

Заключение

Данная доработка позволит вашему AJAX-поиску находить только те посты, заголовки которых точно соответствуют введённому тексту в поле ввода. Убедитесь, что вы защищаете ваш сайт от запросов и используете механизмы кэширования, если это необходимо.

Следуя этим рекомендациям, вы значительно улучшите функциональность своего AJAX-поиска и создадите более удобный и интуитивный пользовательский опыт.

Оцените материал
Добавить комментарий

Капча загружается...