作为当前页面的子级的搜索页面

时间:2016-05-09 作者:Sam

我正在开发自己的Wordpress主题,我想知道是否可以修改搜索查询,使其只返回实际页面的子页面。

我之所以要这样做,是因为我们的网站越来越大,用户应该能够导航到父页面,然后搜索此主题中的页面。

我给你举个例子。我们的网站是关于化学研究的,并有以下形式的页面树:

主页(&L);《有机化学与合成》实践课程

  • 我为所有的答案和想法感到高兴。你好,Chwebo

  • 1 个回复
    SO网友:Tim Malone

    我在评论中开始了这一点,但我想我会为您扩展它,因为我确实喜欢这个问题;)

    我可能会用当前页面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, 我们需要加入Wordpresspre_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 panelother queries on the page (例如菜单查询),当然还要确保在尝试使用自定义值之前实际设置了自定义值。

    我还没有测试过这个,但相当肯定它会工作!

    相关推荐

    Hiding menu on specific pages

    我在某些页面上隐藏顶部菜单时遇到问题。以下是我试图隐藏菜单的网站https://domain.com/cookies-statement/ https://domain.com/privacy-policy/ 看来,来自其他线程的解决方案对我不起作用(或者我做错了什么),请告诉我这是否可能与我的主题一起实现谢谢