Исключить детей с пользовательским типом записи из поиска - PullRequest
0 голосов
/ 28 июня 2018

У меня есть собственный тип поста 'location'. Затем у меня есть дочерние страницы для каждой из страниц для этого cpt. так что это выглядит примерно так: «www.example.com/location/location-name/child-page/», каждая дочерняя страница использует шаблон поста «location-product-services.php». Поэтому я пытаюсь исключить из этого поиска детей этого cpt.

Я пытаюсь сделать это, проверив метаданные, чтобы увидеть, использует ли он этот шаблон. Я просто не могу заставить его работать. Любая помощь будет отличной.

Это то, что у меня сейчас есть -

// Exclude local product and services pages from search result.
function location_subpages_exclude_search( $query ) {
    if ( is_search() && !is_admin()) {
        $query->set('meta_query',
            array(
                'key' => '_wp_page_template',
                'value' => 'location-product-services.php',
                'compare' => '!='
            )
        );
    }
}

add_action('pre_get_posts', 'location_subpages_exclude_search');

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я понял это. Сначала я получил все родительские страницы своего типа поста, использовал get_pages (), захватил их все.

Перебрал все родительские страницы и запустил еще один get_pages () для потомков этого родителя.

function SearchFilter($query) {

    if ($query->is_search) {

        $args = array(
            'hierarchical' => 0,
            'post_type' => 'location',
            'parent' => 0, //returns all top level pages 
            'post_per_page' => -1
        ); 

        $parents = get_pages($args);
        $excludes = array();

        foreach($parents as $parent) : 
            $args = array(
                'post_type' => 'location',
                'child_of' => $parent->ID,
                'post_per_page' => -1
            ); 
            $children = get_pages($args); 
            foreach($children as $child): 
                array_push($excludes, $child->ID);
            endforeach;
        endforeach;

        $query->set('post__not_in', $excludes);
    }
    return $query;
 }
 add_filter('pre_get_posts','SearchFilter');
0 голосов
/ 28 июня 2018

Во-первых, я использую плагин Relevanssi в любое время, когда хочу изменить поиск. Но для программного поиска, я думаю, что вы ищете:

$taxonomy = 'location';
$terms = get_terms($taxonomy, array( 'parent' => 0, 'search' => $query ) );

if ( $terms && !is_wp_error( $terms ) ) :
?>
    <ul>
        <?php foreach ( $terms as $term ) { ?>
            <li><a href="<?php echo get_term_link($term->slug, $taxonomy); ?>"><?php echo $term->name; ?></a></li>
        <?php } ?>
    </ul>
<?php endif;?>

Используйте функцию get_terms для поиска в вашем CPT, 'search' - это ваш $ запрос (вы можете обернуть строку поиска в подстановочный знак SQL '%'), а 'parent' => 0 возвращает только верхний уровень.

...