我在评论中开始了这一点,但我想我会为您扩展它,因为我确实喜欢这个问题;)
我可能会用当前页面ID向搜索表单添加一个隐藏字段,然后使用pre_get_posts
筛选以修改搜索查询,使其仅返回具有匹配父级的页面。
However: 我不认为我们可以用这种方式处理额外级别的子页面,只是第一级。我知道这个答案并不能完全回答你的问题,但这只是一个开始,如果我能弄清楚这一点,我会补充一点(同时,希望其他人能以此作为自己答案的基础)
1. Adding the hidden field
在主题中,您需要创建
searchform.php
如果还没有,则可以修改输出的默认表单。如果您是从头开始创建此表单,则可以获取现有表单
from this page.
然后,我们将在<form></form>
标记,打印出当前页的ID,如果我们不在顶层,则打印出其父页的ID:
<?php if(is_page()){ ?>
<input type="hidden" name="current_page_id" value="<?php echo $post->post_parent == 0 ? $post->ID : $post->post_parent; ?>" />
<?php } ?>
2. Hooking into pre_get_posts
在您的主题中
functions.php
, 我们需要加入Wordpress
pre_get_posts action 修改查询以排除不在所需层次结构中的页面。当然,我们希望确保我们只在搜索时这样做:
add_action("pre_get_posts", "wpse_226092_search_by_page_parent");
function wpse_226092_search_by_page_parent($query){
if(!is_admin() && $query->is_main_query() && is_search() && isset($_GET["current_page_id"])){
$query->set("post_parent", $_GET["current_page_id"]);
}
}
代码中还有一些其他条件,以确保我们不会影响
the admin panel 或
other queries on the page (例如菜单查询),当然还要确保在尝试使用自定义值之前实际设置了自定义值。
我还没有测试过这个,但相当肯定它会工作!