如何从wordpress搜索结果中隐藏特定父级下的子页面


How to hide child pages under specific parent from wordpress search result

我一直在寻找一种方法来调整我的wordpress搜索结果。

这就是我想要的:

在我的网站上,我有帖子,页面和自定义帖子类型。现在,在其他页面的子页面中存在某些页面。例如,假设有一个名为 Services 的父页面,其下有 5 个子页面名为 ABC ServiceXYZ Service等。

现在我只想在wordpress搜索结果中返回以下内容:

  • 所有帖子

  • 页面
  • (不是服务页面及其下的任何子页面)。因此,除了Services页面和所有将父页面设置为Services的5个子页面外,所有页面都将显示在搜索中。

  • 其他自定义帖子类型

这是我所做的:

首先,我创建了一个小函数来检查子页面:

function ism_is_subpage() {
    $post = get_post();
    if ( is_page() && $post->post_parent ) {
        return $post->post_parent;
    } else {
            return false;
    }
}

在此之后,我创建了一个 WordPress pre_get_posts过滤器调用来传递它。喜欢这个:

add_filter('pre_get_posts', function( $query ) {
    if (!$query->is_admin && $query->is_search) {
        $query->set('post_type', array('post', 'page', 'other-post-type1'));
    }
    return $query;
});

但问题是,无论我如何称呼ism_is_subpage(),我都没有得到我想要的结果。

你们中有人可以帮忙吗?

如果你知道页面ID,你可以做这样的事情:

add_filter('pre_get_posts', function( $query ) {
    if (!$query->is_admin && $query->is_search) {
        $query->set('post_type', array('post', 'page', 'other-post-type1')); //this line to specify post types as it is already in your question
        $query->set('post_parent__not_in', array($post_id));
        $query->set('post__not_in', array($post_id));
    }
    return $query;
});

检查帖子和页面参数,并记住pre_get_posts钩子是在创建查询变量对象之后但在运行实际查询之前调用的。

编辑

问题中的第一$query->set(.....)行会进行帖子类型过滤,您必须添加要搜索的所有帖子类型,并且不要忘记默认的帖子类型,例如"nav_menu_item"等。您必须输入帖子 ID(父页面的 ID),例如 44。