Вопрос или проблема
Я знаю, что этот вопрос задаётся миллион раз, и я нашёл решение. Оно кажется довольно простым, но по какой-то причине не работает. Интересно, связано ли это с тем, что я выполняю поиск с помощью этого плагина: https://wordpress.org/plugins/search-filter/, но у меня есть сомнения. Я надеялся, что кто-то сможет пролить свет на это, возможно, я что-то упускаю. Для справки, вот мой код:
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( $wp_query->is_search && $post_type == 'product' )
{
return locate_template('archive-products.php');
} else {
$args = array_merge( $wp_query->query, array( 'post_type' => 'post' ) );
query_posts( $args );
}
return $template;
}
add_filter('template_include', 'template_chooser');
Я использую это с WooCommerce, плагин поиска и фильтрации предназначен для выбора продуктов по категории, атрибуту и по имени. Поиск работает, но он не загружает пользовательский шаблон. Я пытаюсь создать страницу результатов, чтобы отображать продукты так же, как они отображаются на странице категории WooCommerce. По какой-то причине, если вы выполняете поиск, не выбрав ничего, используется стандартный шаблон результатов, который используется для постов, страниц и т.д., а не шаблон продукта WooCommerce. Если вы выбираете категорию или атрибут, то он отображает шаблон продукта WooCommerce, как и должно быть.
Любая помощь будет очень ценна. Спасибо.
Попробуйте также добавить возврат в else{}
, вот так:
function template_chooser($template)
{
global $wp_query;
$post_type = get_query_var('post_type');
if( $wp_query->is_search && $post_type == 'product' )
{
return locate_template('archive-products.php');
} else {
$args = array_merge( $wp_query->query, array( 'post_type' => 'post' ) );
query_posts( $args );
return locate_template('archive-products.php');
}
return $template;
}
add_filter('template_include', 'template_chooser');
Не тестировал.
Ответ или решение
Чтобы создать отдельный шаблон поиска для пользовательских типов записей, таких как продукты WooCommerce, и решить вашу проблему с использованием плагина "Search & Filter", вам следует внести некоторые изменения в ваш код. Основная причина, по которой ваш текущий код не работает, может заключаться в том, что вы не возвращаете соответствующий шаблон в блоке else
, а также в том, что ваша логика может не совсем правильно обрабатывать запросы.
Вот окончательное решение вашей проблемы:
function template_chooser($template) {
global $wp_query;
// Проверяем, что это поисковой запрос
if ($wp_query->is_search) {
// Получаем тип поста из запроса
$post_type = get_query_var('post_type');
// Если тип поста 'product', возвращаем пользовательский шаблон
if ($post_type == 'product') {
return locate_template('archive-products.php');
} else {
// Если тип поста не 'product', можем использовать стандартный шаблон
// Для других типов записей, можно также вернуть шаблон для постов, если хотите
return locate_template('archive.php'); // или используйте нужный шаблон
}
}
return $template; // Возвращаем оригинальный шаблон, если не поисковый запрос
}
add_filter('template_include', 'template_chooser');
Объяснение:
-
Проверка на поисковый запрос: Используется переменная
$wp_query->is_search
для проверки, является ли текущий запрос поисковым. -
Получение типа поста: Используем
get_query_var('post_type')
для получения типа поста в запросе. Это позволяет определить, является ли Запрос запросом на продукт или другим типом записи. -
Возврат шаблона: Если тип поста —
product
, мы возвращаемarchive-products.php
. Если это другой тип (например, стандартные посты), вы можете вернуть другой шаблон, такой какarchive.php
. -
Логическое завершение: Возвращает оригинальный шаблон, если запрос не является поисковым.
Таким образом, вы обеспечите, что шаблон для продуктов будет загружаться только тогда, когда вы ищете продукты, и привычное поведение будет поддерживаться для других типов постов.
Дополнительно, если у вас возникают проблемы с плагином "Search & Filter", убедитесь, что он корректно обрабатывает параметры запроса и перенаправляет их на соответствующие типы постов. Вы также можете обратиться к документации плагина для получения помощи, если возникнут специфические проблемы с его настройками. Надеюсь, это поможет вам решить вашу задачу.