Поиск по тегам, категориям и авторам без плагина

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

Я создаю веб-сайт с функцией поиска. Я хочу понять, что мне нужно сделать, чтобы поисковая строка работала как search everything. Поисковый запрос, введенный посетителем, может совпадать с именем тега поста, категорией поста, содержимым поста или заголовком поста. Если в посте есть слово, совпадающее с поисковым запросом, результат будет показан. Я не собираюсь использовать плагин или добавлять радиокнопки в свою поисковую форму. Я искал информацию, но не нашел. Есть ли какие-либо предложения и решения?

<!DOCTYPE html>
<html>
<?php get_header(); ?>
<body>

<?php $q1 = get_posts(array(
    'post_status' => 'publish',
    'posts_per_page' => '5',
    's' => get_search_query()
    )
);

$q2 = get_posts(array(
    'post_status' => 'publish',
    'posts_per_page' => '5',
    'tax_query' => array(
            //ваш запрос
        )
    )
);

$merged = array_merge($q1, $q2);

?>

<?php echo wp_specialchars($s); ?><br/>
<?php the_search_query(); ?><br/>
<?php the_search_query(); ?>
<br/>
<article>
<p>Вы искали "<?php echo wp_specialchars($s); ?>". Мы нашли <?php /* Счетчик поиска */ 
    $allsearch = &new WP_Query("s=$s&showposts=-1"); 
    $key = wp_specialchars($s, 1); 
    $count = $allsearch->post_count; 
    $text="<span class="resultsFounds">";
if ( $allsearch->found_posts <= 0 ) {
    $text .= sprintf(__( 'нет компаний' ), $count );
}

elseif ( $allsearch->found_posts <= 1 ) {
    $text .= sprintf(__( 'найдена %d связанная компания' ), $count );
} 

else {
    $text .= sprintf(__( 'найдены %d связанных компаний' ), $count );
}       
$text .= '</span>'; 
echo $text;
?> с ключевым словом, по которому вы искали. Если результаты не соответствуют вашим ожиданиям, мы рекомендуем попробовать другие ключевые слова, связанные с компанией.</p>
<?php if (have_posts()) : ?>
<h2>Ключевые слова : <?php echo wp_specialchars($s); ?><?php 
    /* Счетчик поиска */
    $count = $wp_query->found_posts; 
    $text="<span class="resultsFound">";
if ( $count  <= 0 ) {
    $text .= sprintf(__( '( нет компаний )' ), $count );
}

elseif ( $count <= 1 ) {
    $text .= sprintf(__( '( %d компания )' ), $count );
} 

else {
    $text .= sprintf(__( '( %d компаний )' ), $count );
}       
$text .= '</span>'; 
echo $text;
?></h2>

<?php include("adsRandom.php"); ?>
<?php include("boostBiz/bizAds.php"); ?>

<?php while (have_posts()) : the_post(); ?>
<div class="ncc <?php the_ID(); ?><?php if( date('U') - get_the_time('U', $post->ID) < 24*60*60 ) : ?> новое<?php endif; ?><?php if (is_sticky()) { ?> спонсируется<?php } ?>" <?php if (is_sticky()) { ?>title="Наш рекламодатель"<?php } ?>>
<h3 class="excerpt"><a href="https://wordpress.stackexchange.com/questions/255625/<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php search_title_highlight(); ?></a></h3>
<?php search_excerpt_highlight(); ?>
<p class="excerptInfo"><?php printf( __( 'Указано в %2$s', 'NCC' ), 'entry-utility-prep entry-utility-prep-cat-links', get_the_category_list( ', ' ) ); ?> |<?php
$tags_list = get_the_tag_list( '', ', ' );
if ( $tags_list );
?>
<?php printf( __( ' Расположено в: %2$s', 'NCC' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list ); ?><?php if( date('U') - get_the_time('U', $post->ID) < 24*60*60 ) : ?> | Опубликовано <?php echo get_the_date(); ?><?php endif; ?></p>
</div><!--ncc <?php the_ID(); ?>-->

<?php endwhile; ?>
<?php if(function_exists('wp_page_numbers')) { wp_page_numbers(); } ?>

<?php else : ?>

<h2><?php _e('Ключевые слова : ','NCC'); ?><?php echo wp_specialchars($s); ?><?php /* Счетчик поиска */ 
    $allsearch = &new WP_Query("s=$s&showposts=-1"); 
    $key = wp_specialchars($s, 1); 
    $count = $allsearch->post_count; 
    $text="<span class="resultsFound">";
if ( $allsearch->found_posts <= 0 ) {
    $text .= sprintf(__( '( Ничего не найдено )' ), $count );
}

elseif ( $allsearch->found_posts <= 1 ) {
    $text .= sprintf(__( '( Мы нашли %d компанию )' ), $count );
} 

else {
    $text .= sprintf(__( '( Мы нашли %d компаний )' ), $count );
}       
$text .= '</span>'; 
echo $text;
?></h2>

<article class="nccSingle">
<p>Ваш поиск - "<b><?php echo wp_specialchars($s); ?></b>" - не совпал ни с одним документом. Возможно, ни одна компания не указана с этим ключевым словом. Или, введенное ключевое слово было написано с ошибкой?</p>
<p><b>Предложения:</b></p>
<ул>
  <li>Убедитесь, что все слова написаны правильно.</li>
  <li>Попробуйте другие ключевые слова.</li>
  <li>Попробуйте более общие ключевые слова.</li>
</ул>
</article>
<?php endif; ?>
</body>
</html>

Я могу предложить два варианта:

<ол>

  • Несколько WP_Queries, каждая для обычного поиска, таксономий и метаданных. И объединить результаты, которые вы получите от каждой.
  • ИЛИ

    <ол start="2">

  • Запрос WPDB, с join между _post, _postmeta, _terms(и все таблицы, связанные с terms).
  • Хотя я предпочту первый метод, это ваш выбор, с чем вам удобнее работать и какой производительности вы ожидаете в терминах ресурсов и скорости.

    Редактировать:

    $q1 = get_posts(array(
        'post_status' => 'publish',
        'posts_per_page' => '-1',
        's' => get_search_query()
        )
    );
    
    $q2 = get_posts(array(
        'post_status' => 'publish',
        'posts_per_page' => '-1',
        'tax_query' => array(
                //ваш запрос
            )
        )
    );
    
    $merged = array_merge($q1, $q2);
    

    Это не точный запрос, а просто для ознакомления. Пожалуйста, проверьте наличие синтаксических ошибок, так как я не тестировал это.

    $query = new WP_Query( array(<br/>
    'post_type' => 'post',<br/>
    'author' => 'author-id or user_nicename',<br/>
    'tax_query' => array(<br/>
            'relation' => 'OR',<br/>
            array(<br/>
                'taxonomy' => 'category',<br/>
                'field'    => 'slug',<br/>
                'terms'    => array( 'edge-case-1', 'edge-case-2' ),<br/>
            ),<br/>
            array(<br/>
                'taxonomy' => 'post_tag',<br/>
                'field'    => 'term_id',<br/>
                'terms'    => array( 66, 67 ),<br/>
            ),<br/>
        ),<br/>
    
     ) );<br/>
    if ( $query->have_posts() ) {<br/>
        while ( $query->have_posts() ) {<br/>
            $query->the_post();<br/>
    
            the_title();
    <br/>
            the_content();
    <br/>
        }<br/>
        wp_reset_postdata();
    <br/>
    }<br/>
    

    Для автора вы можете передать либо идентификатор автора, либо user_nicename автора. А в параметре tax_query для ‘field’ вы можете использовать либо ‘term_id’, либо ‘slug’, а ‘terms’ зависит от того, что вы передаете в параметре ‘field’, как показано выше. В ‘terms’ можно передать массив или отдельную переменную.enter code here

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

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

    Шаги для реализации функции поиска по тегам, категориям и авторам

    1. Используйте WP_Query для поиска

    Основной метод для выполнения поиска в WordPress заключается в использовании класса WP_Query. Это позволяет сделать выборку постов на основе различных критериев — таких как мета-данные, таксономии (например, теги и категории) и авторство.

    Вот пример кода, который объединяет поиск по содержимому поста, тегам, категориям и авторам:

    // Получите запрос поиска
    $search_term = get_search_query();
    
    $args = array(
        'post_type'      => 'post', // или другой тип поста, если требуется
        'post_status'    => 'publish',
        's'              => $search_term, // Поиск по содержимому и заголовкам
        'tax_query' => array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => explode( ' ', $search_term ), // Ищем по категориям
            ),
            array(
                'taxonomy' => 'post_tag',
                'field'    => 'slug',
                'terms'    => explode( ' ', $search_term ), // Ищем по тегам
            ),
        ),
    );
    
    $query = new WP_Query( $args );
    
    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
    
            // Отображаем заголовок и контент
            echo '<h2>' . get_the_title() . '</h2>';
            echo '<div>' . get_the_excerpt() . '</div>';
        }
        wp_reset_postdata();
    } else {
        // Сообщение, если посты не найдены
        echo 'По вашему запросу ничего не найдено.';
    }

    2. Оброботка результатов поиска

    Вам нужно будет выводить результаты поиска с учетом различных элементов, таких как:

    • Заголовок поста.
    • Содержимое (или отрывок) поста.
    • Таксономии (теги и категории), чтобы пользователи могли видеть, к каким категориям и тегам относится найденный пост.

    3. SEO-оптимизация

    Чтобы ваш сайт был более видим в поисковых системах, убедитесь, что:

    • Заголовки постов являются описательными и содержат ключевые слова.
    • Использованы мета-теги, которые соответствуют содержанию, включая описания для улучшения кликабельности в поисковых системах.
    • Вложенные теги в HTML (такие как заголовки, списки и параграфы) верно структурированы.

    4. Профилирование и тестирование

    Не забывайте тестировать запросы, особенно если база данных постов обширна, чтобы убедиться в отсутствии значительных задержек. WP_Query может генерировать сложные запросы, поэтому вы можете использовать внутренняя функция query_monitor для анализа производительности ваших запросов.

    Заключение

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

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

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