Поддержка Проблемы и решения Поиск по кастомным постам и страницам

  • Всем привет. Столкнулся с проблемой организации поиска «по нескольким типам постов» и по «страницам». Как это сделать? Стандартный поиск в стиле

    while ( have_posts() ) : the_post(); ..

    выводит все записи что есть.. ищет то правильно в плане фразы поисковой.. но все записи не нужны.
    Пробовал такой вариант..

    
    

    <?php

    $args = array(
        'post_type'      => 'page',
        //'post_type'      => 'events',
        //'post_type'      => 'events,org,newsv,smi_about,actions',
        //'post_type'      => 'post',
        //'post_type'      => 'page',
        'posts_per_page' => 9,
        'paged'          => $current,
    );
    
    $my_query = new WP_Query( $args );
    
    if ( $my_query->have_posts() ) {
        ?>
        <header class="page-header">
            <h1 class="page-title">
                <?php
                printf( esc_html__( 'Результат поиска для: %s', 'msb' ), '<span>"' . get_search_query() . '"</span>' );
                ?>
            </h1>
        </header>
        <?php
    
        while ( $my_query->have_posts() ) {
            $my_query->the_post(); ?>
    
            <?php
            get_template_part( 'template-parts/content', 'search' );
        }
    
        wp_reset_postdata();
        ?>
    
        <?php
    } else {
    
        get_template_part( 'templates/content', 'none' );
    }

    `
    но он выводит вообще не то..

    в данном коде указал «страницу» как «тип постов», хотя нужна и она и кастомные типы постов), а выводятся и посты и страницы

    Как такой вопрос можно решить?

    • Тема изменена 2 года, 2 месяца назад пользователем shiva2019.
Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Модератор Yuri

    (@yube)

    Как это сделать?

    Home

    $query->set('post_type', ['post', 'page', 'custom_post_type_1', 'custom_post_type_2']);
    

    имеется в виду что через хуки можно поставить фильтр на отображение?

    По вышеприведенной ссылке посмотрев нашел get_post_type и вот такой вариант сделал:

    <?php if ( have_posts() ) : ?>
    
    			<header class="page-header">
    				<h1 class="page-title">
    					<?php
    
    					printf( esc_html__( 'Search Results for: %s', 'msb' ), '<span>' . get_search_query() . '</span>' );
    					?>
    				</h1>
    			</header>
    
    			<?php
    
    			while ( have_posts() ) :
                {
                        $p = get_post_type();
                        if ($p === 'events' || $p === 'org' || $p === 'newsv' || $p === 'smi_about' || $p === 'actions' || $p === 'page' ){
                            the_post();
                        }
                }
    
               		get_template_part( 'template-parts/content', 'search' );
    
                endwhile;
                //wp_pagenavi();
    			the_posts_navigation();
    
    		else :
    
    			get_template_part( 'template-parts/content', 'none' );
    
    		endif;
    		?>

    но плохо то что в итоге выбираются ВСЕ записи, а уж в алгоритме анализируется что выводить.. по хорошему надо что бы исходный SQL запрос шел только по определенным типа постов..

    А тот код что я 1-м привел.. он вообще помоему не учитывает что искал..
    Модифицированный алгоритм что в этом сообщении ищет что запросил.

    • Ответ изменён 2 года, 2 месяца назад пользователем shiva2019.

    Попробовал в functions.php вписать:

    function search_filter($query) {
        if ( ! is_admin() && $query->is_main_query() ) {
            if ( $query->is_search ) {
                $query->set( 'post_type', ['page','events','org','newsv','smi_about','actions'] );
            }
        }
    }
    add_action( 'pre_get_posts', 'search_filter' );

    а код в search.php вернуть на исходный.

    Тоже ищет вроде правильно. А SQL-запрос в этом случае выбирает все записи или же в соответствии с POST_TYPE?

    И еще вопрос, как сделать что бы «фото» из результата поиска убрать?

    Модератор Yuri

    (@yube)

    А SQL-запрос в этом случае выбирает все записи или же в соответствии с POST_TYPE?

    Вот эта строка

     $query->set( 'post_type', ['page','events','org','newsv','smi_about','actions'] );
    

    для формируемого запроса уточняет, какие значения post_type будут использоваться в запросе.

    Если интересно, что именно формируется, можно поставить плагин query_monitor и посмотреть все SQL-запросы. И не только их.

    как сделать что бы «фото» из результата поиска убрать?

    Смотря что такое «Фото»

    И да, плагины управления поиском и аналогичного назначения функционал темы могут иметь свое мнение о том, как нужно делать выборку.

    Т.е. можно в functions.php сделать так:

    function search_filter($query) {
        $query->set( 'post_type', ['page','events','org','newsv','smi_about','actions'] );
    }
    add_action( 'pre_get_posts', 'search_filter' );

    вместо кода выше.

    На тему «плагинов», хотел без них сделать по возможности.

    А по поводу фото в результатах поиска, нашел в template-functions.php

    function msb_post_thumbnail() {
    		if ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) {
    			return;
    		}
    
    		if ( is_singular() ) :
    			?>
    
    			<div class="post-thumbnail">
    				<?php the_post_thumbnail(); ?>
    			</div><!-- .post-thumbnail -->
    
    		<?php else : ?>
    
    			<a class="post-thumbnail" href="<?php the_permalink(); ?>" aria-hidden="true" tabindex="-1">
    				<?php
    					the_post_thumbnail(
    						'post-thumbnail',
    						array(
    							'alt' => the_title_attribute(
    								array(
    									'echo' => false,
    								)
    							),
    						)
    					);
    				?>
    			</a>
    
    			<?php
    		endif; // End is_singular().
    	}

    Вот если в ней закоментировать код, фото в результатах поиска не отображается.. правда тогда вообще с постов фото не отображается.. что не вариант

    • Ответ изменён 2 года, 2 месяца назад пользователем shiva2019.
    • Ответ изменён 2 года, 2 месяца назад пользователем shiva2019.
    Модератор Yuri

    (@yube)

    Т.е. можно в functions.php сделать так:

    Так фильтр будет добавляться ко всем выборкам, а не только к главной на фронт-энде. Те два условия не просто так в примеры добавили.

    А по поводу фото в результатах поиска, нашел в template-functions.php

    Вы нашли вывод миниатюры записи в шаблоне. Если под «фото» из результата поиска убрать Вы имели в виду «убрать из вывода», то это не к выборке, а к шаблону (обычно search.php). Это разные этапы выполнения скрипта.

    Плагины я упомянул потому, что они могут мешать работать добавляемому коду, подставляя свои условия. Если их нет, и выборка работает правильно, то не обращайте внимания.

    В общем решил вопрос. Не знаю насколько правильно.. но вроде ничего не ломает:

    в template-tags.php как понял есть код, который используется для «вывода миниатюр постов«. Сделал проверку: если не «страница с результатами поиска» содержимое функции отображения миниатюры отрабатывает.

    if ( ! function_exists( 'msb_post_thumbnail' ) ) :
    
    	function msb_post_thumbnail() {
    
            if (!is_search()){
                if ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) {
                    return;
                }
    
                if ( is_singular() ) :
                    ?>
    
                    <div class="post-thumbnail">
                        <?php the_post_thumbnail(); ?>
                    </div><!-- .post-thumbnail -->
    
                <?php else : ?>
    
                    <a class="post-thumbnail" href="<?php the_permalink(); ?>" aria-hidden="true" tabindex="-1">
                        <?php
                        the_post_thumbnail(
                            'post-thumbnail',
                            array(
                                'alt' => the_title_attribute(
                                    array(
                                        'echo' => false,
                                    )
                                ),
                            )
                        );
                        ?>
                    </a>
    
                <?php
                endif;
            }
    	}
    endif;
    • Ответ изменён 2 года, 2 месяца назад пользователем shiva2019.
Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Поиск по кастомным постам и страницам» закрыта для новых ответов.