停止wordpress搜索,显示自定义帖子类型

时间:2016-10-03 17:04:31

标签: wordpress search

我有一个自定义帖子类型,我用于使用uncode主题构建的页面上的某些文本块。我需要将这些块公开,以便它们显示在页面上,但我想阻止它们出现在搜索结果中。

search.php不像普通的wordpress搜索文件,它是uncode-theme文件,并且没有正常的查询,我不这么认为,所以我在思考我可能需要一个功能吗?

任何人都可以建议如何实现这个目标吗?

CPT是' staticcontent'

谢谢!

3 个答案:

答案 0 :(得分:4)

我认为接受的答案是正确的。 exclude_from_search会阻止所有$query = new WP_Query返回结果。

核心说:

  

...检索任何类型的除了修订版和类型   ' exclude_from_search'设为TRUE)

这是一个常见问题,与前端搜索结果页 v.s.混淆搜索数据库中的帖子。

在前端使用自定义查询展示内容,需要exclude_from_search = false或使用其他方法并直接通过ID获取内容。

您需要过滤搜索前端机制。这是 true 从搜索中排除帖子类型,无需手动重新构建"已知"类型:

function entex_fn_remove_post_type_from_search_results($query){

    /* check is front end main loop content */
    if(is_admin() || !$query->is_main_query()) return;

    /* check is search result query */
    if($query->is_search()){

        $post_type_to_remove = 'staticcontent';
        /* get all searchable post types */
        $searchable_post_types = get_post_types(array('exclude_from_search' => false));

        /* make sure you got the proper results, and that your post type is in the results */
        if(is_array($searchable_post_types) && in_array($post_type_to_remove, $searchable_post_types)){
            /* remove the post type from the array */
            unset( $searchable_post_types[ $post_type_to_remove ] );
            /* set the query to the remaining searchable post types */
            $query->set('post_type', $searchable_post_types);
        }
    }
}
add_action('pre_get_posts', 'entex_fn_remove_post_type_from_search_results');

可以更改评论$post_type_to_remove = 'staticcontent';以适应任何其他帖子类型。

请发表评论如果我在这里遗漏了某些内容,我无法找到另一种方法来阻止此类帖子类型的情况,按查询显示内容隐藏搜索/直接访问给前端用户。

答案 1 :(得分:2)

这里的答案取决于您是通过自己的代码创建CPT,还是其他插件正在创建CPT。有关这两种方法的详细解释,请参阅此链接:

http://www.webtipblog.com/exclude-custom-post-type-search-wordpress/

基本要点是:

如果您要创建自己的CPT,可以在'exclude_from_search' => true

的register_post_type()调用中添加一个参数

如果另一个插件/主题正在创建CPT,您需要稍后设置此exclude_from_search变量,作为CPT过滤器的一部分,如下:

// functions.php

add_action( 'init', 'update_my_custom_type', 99 );

function update_my_custom_type() {
    global $wp_post_types;

    if ( post_type_exists( 'staticcontent' ) ) {

        // exclude from search results
        $wp_post_types['staticcontent']->exclude_from_search = true;
    }
}

答案 2 :(得分:1)

首先,Jonas Lundman 的答案是正确的,应该是公认的答案。

exclude_from_search 参数工作不正常 - 它也从其他查询中排除了帖子类型。

WP 问题跟踪系统上有一张票,但他们已将其关闭为 wontfix,因为他们无法在不破坏向后兼容性的情况下解决此问题。有关详细信息,请参阅 this ticketthis one

我在 Jonas Lundman 提出的解决方案中添加了额外的检查,因为:

  • 在实际设置中,可能有其他插件试图修改搜索查询,因此仅替换 post_type 可能会导致意外结果。
  • 我认为使用一组帖子类型来排除更灵活。
add_action('pre_get_posts', 'remove_my_cpt_from_search_results');

function remove_my_cpt_from_search_results($query) {
    if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
        return $query;
    }

    // can exclude multiple post types, for ex. array('staticcontent', 'cpt2', 'cpt3')
    $post_types_to_exclude = array('staticcontent');

    if ($query->get('post_type')) {
        $query_post_types = $query->get('post_type');

        if (is_string($query_post_types)) {
            $query_post_types = explode(',', $query_post_types);
        }
    } else {
        $query_post_types = get_post_types(array('exclude_from_search' => false));
    }

    if (sizeof(array_intersect($query_post_types, $post_types_to_exclude))) {
        $query->set('post_type', array_diff($query_post_types, $post_types_to_exclude));
    }

    return $query;
}