Вопрос или проблема
Я создал пользовательский тип записи, который не будет отображаться нигде на сайте. Однако я хочу получить доступ к данным из формы поиска. Поскольку страниц будет много, мне нужно отключить тип записи от отображения в обычном поиске и создать вторую страницу поиска только для поиска ключевого слова в пользовательских типах записей.
Я прочитал довольно много страниц, и люди дают разные советы, иногда говорят избегать определенных функций, поэтому я не уверен, какой способ является самым актуальным для этого.
Я начал с того, что вырезал и вставил свой “search.php” в 2 частичных шаблона, а затем изменил “search.php” на
<?php
if(isset($_GET['search-type'])) {
$type = $_GET['search-type'];
if($type == 'custom-post-type') {
get_template_part('/partials/search-custom-post-type');
} else{
get_template_part('/partials/search-normal');
}
}
else{
get_template_part('/partials/search-normal');
}
?>
Я прочитал, что я мог бы добавить следующий код, и это позволило бы мне настроить search-custom-post-type.php
$args = array( 'post_type' => 'custom-post-type-name' );
$args = array_merge( $args, $wp_query->query );
query_posts( $args );
Однако это ничего не делает. Поиск по-прежнему такой же.
Для основной страницы поиска вы можете использовать pre_get_posts
с условием:
if($query->is_main_query() && $query->is_search && !is_admin()) {
Таким образом, только если это основной запрос, это поисковый запрос, и вы не находитесь в админке, отрегулируйте запрос. Установите любые типы записей, которые вы хотите индексировать в основном поисковом запросе.
Следующий шаг — настройка пользовательского поиска. В зависимости от того, как вы хотите это настроить, один из вариантов — создать шаблон страницы, который сначала проверяет наличие строки запроса (то есть поданного поиска). Если он находит параметр $_GET['customsearch']
, отобразите результаты поиска, используя пользовательский WP_Query для получения результатов только из вашего CPT. Если нет, то отобразите форму поиска (с customsearch
в качестве имени поля).
Другой вариант — создать виджет, который вы можете разместить в любой боковой панели на сайте, и сделать так, чтобы действие формы было страницей с пользовательским шаблоном страницы, чтобы в случае пустого параметра $_GET['customsearch']
шаблон выполнял wp_redirect
перед выводом заголовка и т.д. (вы можете перенаправить на главную страницу или любую другую страницу, которая наиболее актуальна), но если есть параметр, он отображает результаты поиска (снова с пользовательским WP_Query).
Ответ или решение
Создание второй страницы поиска только для пользовательского типа постов — задача, требующая последовательной разработки и интеграции с имеющейся системой вашего сайта на WordPress. Давайте разберем, как можно эффективно реализовать это решение с помощью практических шагов.
Шаг 1: Исключение пользовательского типа постов из общего поиска
Для начала, чтобы исключить пользовательский тип постов из обычного поиска, необходимо использовать хук pre_get_posts
. Этот хук позволяет изменять запрос перед его выполнением. Добавьте следующий код в файл functions.php
вашей темы:
function exclude_custom_post_type_from_search( $query ) {
if ( $query->is_search() && !is_admin() && $query->is_main_query() ) {
// Исключаем пользовательский тип поста из общего поиска
$query->set( 'post_type', array( 'post', 'page' ) ); // Укажите здесь типы постов, которые хотите оставить
}
}
add_action( 'pre_get_posts', 'exclude_custom_post_type_from_search' );
Шаг 2: Создание страницы для поиска пользовательских постов
Теперь, когда ваш пользовательский тип постов исключен из общего поиска, создадим новую страницу (или шаблон) для поиска пользовательских постов. Следуйте интеграции ниже:
-
Создайте новый файл шаблона в вашей теме, назовите его, например,
search-custom-post-type.php
. -
Добавьте форму поиска в этот файл. Можно использовать следующий код:
<form method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<input type="text" name="s" placeholder="Введите ключевые слова" required>
<input type="hidden" name="search-type" value="custom-post-type">
<button type="submit">Поиск</button>
</form>
Шаг 3: Реализация логики поиска в созданном шаблоне
Теперь вам необходимо обработать запрос на этой странице. В этом же файле search-custom-post-type.php
добавьте следующий код:
if ( isset( $_GET['s'] ) ) {
$args = array(
'post_type' => 'custom-post-type-name', // Замените на имя вашего пользовательского типа поста
's' => sanitize_text_field( $_GET['s'] ),
);
$custom_query = new WP_Query( $args );
if ( $custom_query->have_posts() ) {
while ( $custom_query->have_posts() ) {
$custom_query->the_post();
// Отображение результатов, например:
the_title( '<h2>', '</h2>' );
the_content();
}
} else {
echo '<p>Ничего не найдено.</p>';
}
wp_reset_postdata(); // Сброс глобального объекта поста
}
Шаг 4: Направление на новый шаблон
Теперь необходимо убедиться, что ваш основной шаблон поиска направляет запросы на новый шаблон. Вернитесь в search.php
, и убедитесь, что код соответствует следующему:
<?php
if ( isset( $_GET['search-type'] ) && $_GET['search-type'] == 'custom-post-type' ) {
get_template_part( 'search-custom-post-type' );
} else {
get_template_part( 'partials/search-normal' );
}
?>
Заключение
Эти шаги позволят вам создать отдельную страницу поиска для пользовательского типа постов, исключая его из общего поиска. Такой подход делает ваш сайт более структурированным и удобным для использования, особенно когда количество данных велико. Регулярно обновляйте функцию поиска и настройте шаблоны под современные требования SEO, чтобы пользователи могли легко находить нужную информацию.