Создать вторую страницу поиска только для пользовательского типа записи

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

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

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

Я начал с того, что вырезал и вставил свой “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: Создание страницы для поиска пользовательских постов

Теперь, когда ваш пользовательский тип постов исключен из общего поиска, создадим новую страницу (или шаблон) для поиска пользовательских постов. Следуйте интеграции ниже:

  1. Создайте новый файл шаблона в вашей теме, назовите его, например, search-custom-post-type.php.

  2. Добавьте форму поиска в этот файл. Можно использовать следующий код:

<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, чтобы пользователи могли легко находить нужную информацию.

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

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