Вопрос или проблема
Я создаю веб-сайт с функцией поиска. Я хочу понять, что мне нужно сделать, чтобы поисковая строка работала как 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
для анализа производительности ваших запросов.
Заключение
Реализация поиска по тегам, категориям и авторам без использования плагинов создает возможность гибкости и настройки, но требует внимательного подхода к структуре запросов и вывода информации. С правильным подходом вы можете значительно повысить качество поиска на своем сайте, одновременно улучшая пользовательский опыт согласно современным стандартам.