- Вопрос или проблема
- Ответ или решение
- Как отобразить совпадающие категории на странице поиска в WordPress
- 1. Проблема: Отображение только постов в результате поиска
- 2. Решение: Создание функции для получения категорий
- 3. Встраивание функции на страницу поиска
- 4. Альтернативный подход: Использование кастомных запросов
- Заключение
Вопрос или проблема
Мой текущий поиск показывает только ПОСТЫ в качестве результатов.
http://newslines.org/?s=george
На моем сайте есть категории для Джорджа Клуни, Джорджа Р. Р. Мартина и т. д. Как мне получить список категорий, соответствующих поисковому запросу, чтобы он отображался в верхней части страницы результатов?
Я пробовал это:
<?php
$search_query = get_search_query();
$term = get_term_by( 'name', $search_query, 'category' );
if ( !empty( $terms ) && !is_wp_error( $terms ) ){
echo "<ul>";
foreach ( $terms as $term ) {
echo "<li>" . $term->name . "</li>";
}
echo "</ul>";
}
;?>
Но я не получаю никаких результатов
По сути, вам нужно показать категории, к которым принадлежат текущие запрашиваемые посты. Я опубликую здесь функцию, которая принимает в качестве аргумента таксономию (или массив таксономий) и возвращает все термины в этой (этих) таксономии(ях), которые присвоены всем запрашиваемым постам.
function queried_posts_terms( $taxonomies="category" ) {
global $wp_query, $wpdb;
if ( empty( $wp_query->posts ) ) return FALSE;
$ids = wp_list_pluck( $wp_query->posts, 'ID' );
$taxonomies = array_filter( (array) $taxonomies, function( $tax ) {
if ( is_string( $tax ) ) {
$tax = sanitize_title( $tax );
return taxonomy_exists( $tax ) ? esc_sql( $tax ) : NULL;
}
} );
if ( empty( $taxonomies ) ) return FALSE;
$sql = "SELECT t.name, t.slug, t.term_group, tt.*
FROM {$wpdb->terms} t
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tr.object_id IN (" . implode( ', ', $ids ) . ")
AND tt.taxonomy IN ('" . implode( "', '", $taxonomies ) . "')
GROUP BY t.term_id";
return $wpdb->get_results( $sql );
}
Как только у вас будет эта функция в вашем functions.php
(или в активном плагине) в вашем шаблоне, вероятно search.php
, просто используйте:
if ( is_search() ) {
$cats = queried_posts_terms( 'category' );
echo ! empty( $cats ) ? '<ul>' : '';
foreach( $cats as $cat ) {
printf( '<li><a href="https://wordpress.stackexchange.com/questions/158895/%s">%s</a></li>', get_term_link($cat), esc_html($cat->name) );
}
echo ! empty( $cats ) ? '</ul>' : '';
}
Вы можете отредактировать свой файл search.php, чтобы фактически выполнить несколько циклов поиска, как это…
global $query_string;
$query_args = explode("&", $query_string);
$search_query = array();
foreach($query_args as $key => $string) {
$query_split = explode("=", $string);
$search_query[$query_split[0]] = urldecode($query_split[1]);
} // foreach
$first_args = $search_query;
// настройте свои дополнительные параметры запроса
// я просто использовал пример только для получения определенной категории, но вы поняли идею
$first_args['cat'] = 162;
$first_args['orderby'] = 'date';
$first_search = new WP_Query($first_args);
// Здесь выведите свои результаты цикла
endwhile;
wp_reset_query();
По сути, вы берете строку запроса (поисковую строку) и выполняете пользовательский WP_Query, используя ваши дополнительные параметры. После того как вы выполните первый пользовательский запрос, чтобы получить соответствующие категории, вы можете просто запустить дополнительный запрос, используя исходную $query_string.
Я знаю, что это не совсем то, что вы хотите, но это должно дать вам отправную точку, чтобы это произошло. Я рад помочь, если у вас есть дополнительные вопросы.
Ответ или решение
Как отобразить совпадающие категории на странице поиска в WordPress
Вопрос о том, как интегрировать отображение категорий в результаты поиска, довольно актуален для многих владельцев сайтов на WordPress, стремящихся улучшить пользовательский опыт. В данной статье мы рассмотрим возможные подходы к решению этой задачи, используя пример, приведенный в вашем запросе.
1. Проблема: Отображение только постов в результате поиска
Исходная проблема заключается в том, что текущая версия поиска вашего сайта отображает только посты, не учитывая категории, соответствующие введенному запросу. Заказчики смогут извлечь больше информации и лучше ориентироваться в контенте, если категории также будут показаны.
2. Решение: Создание функции для получения категорий
Для начала вам необходимо создать функцию, которая будет возвращать категории, соответствующие запросу. Мы будем использовать следующие аспекты:
- Использование глобальных переменных
WP_Query
иwpdb
. - Запрос к базе данных для получения всех категорий, связанных с найденными постами.
Вот пример функции, которую необходимо поместить в файл functions.php
вашей темы:
function queried_posts_terms($taxonomies = "category") {
global $wp_query, $wpdb;
if (empty($wp_query->posts)) return FALSE;
$ids = wp_list_pluck($wp_query->posts, 'ID');
$taxonomies = array_filter((array)$taxonomies, function($tax) {
if (is_string($tax)) {
$tax = sanitize_title($tax);
return taxonomy_exists($tax) ? esc_sql($tax) : NULL;
}
});
if (empty($taxonomies)) return FALSE;
$sql = "SELECT t.name, t.slug, t.term_group, tt.*
FROM {$wpdb->terms} t
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tr.object_id IN (" . implode(', ', $ids) . ")
AND tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')
GROUP BY t.term_id";
return $wpdb->get_results($sql);
}
3. Встраивание функции на страницу поиска
Теперь вам нужно интегрировать эту функцию в файл search.php
, чтобы категории отображались на странице результатов поиска.
if (is_search()) {
$cats = queried_posts_terms('category');
if (!empty($cats)) {
echo '<ul>';
foreach ($cats as $cat) {
printf('<li><a href="%s">%s</a></li>', esc_url(get_term_link($cat)), esc_html($cat->name));
}
echo '</ul>';
}
}
4. Альтернативный подход: Использование кастомных запросов
Если вы хотите более гибко управлять запросами и получать как посты, так и категории одновременно, вы можете использовать метод работы с несколькими запросами. Например, написав дополнительный WP_Query
, чтобы извлекать категории на основе оригинального запроса:
global $query_string;
$query_args = explode("&", $query_string);
$search_query = [];
foreach ($query_args as $key => $string) {
$query_split = explode("=", $string);
$search_query[$query_split[0]] = urldecode($query_split[1]);
}
// Выполните дополнительный запрос для категорий
$first_args = $search_query;
$first_args['cat'] = 162; // здесь указать ID определенной категории
$first_args['orderby'] = 'date';
$first_search = new WP_Query($first_args);
// Обработка результатов
Заключение
Используя приведенные выше примеры и подходы, вы сможете значительно улучшить функциональность поиска на своем сайте, добавив категории в результаты. Это, в свою очередь, повысит удовлетворенность пользователей и упростит навигацию. Не забывайте тестировать каждое изменение в безопасной среде, чтобы убедиться в его работоспособности и отсутствии конфликтов с другими элементами вашего сайта.