首页 > 解决方案 > 过滤默认查询以在 wordpress 中仅显示选定级别的子页面

问题描述

我正在开发一个页面结构相当大的网站,其中有几级深度 - 在某些部分有很多页面。

因此,如果用户在选择框级别 1 上进行选择,我希望具有功能,那么只有级别 1 中的页面才会显示在下面的页面列表中。
如果他选择 2 级,那么只有 2 级页面,同样转到 3 级 4 级 5 级 6。

当我设置query_vars['post_parent'] = 0;时,它适用于顶级父页面 并且我希望具有相同的功能来显示 1 级子页面、2 级子页面的列表等等......

我坚持下去。如果有人能帮助我,我会很高兴的。谢谢
看截图链接
https://i.stack.imgur.com/EKpy6.png

function level_page_admin_posts_filter( $query ) {
  global $pagenow;
  if ( is_admin() && $pagenow == 'edit.php' && !empty($_GET['lavel_pages'])) {
      $level = $_GET['lavel_pages'];
      if($level == 'parent'){
        $query->query_vars['post_parent'] = 0;
      }else 
      if($level == 1){

      }else
      if($level == 2){

      }
  }
}
add_filter( 'parse_query', 'level_page_admin_posts_filter' );

function admin_page_filter_level_pages() {
  global $wpdb;
  if (isset($_GET['post_type']) && $_GET['post_type'] == 'page') {
  
  $select = '
    <select name="lavel_pages">
      <option value="parent">Parent Pages</option>
      <option value="1">Level 1</option>
      <option value="2">Level 2</option>
      <option value="3">Level 3</option>
      <option value="4">Level 4</option>
      ';
  
  $select .= ' </select>';
  echo $select;
} else {
  return;
}
}
add_action( 'restrict_manage_posts', 'admin_page_filter_level_pages' );

标签: phpwordpresscustomization

解决方案


如果我们获取所有页面并计算出每个页面所在的级别,然后使用“post__in”过滤查询,这是可能的。尝试以下操作:

//recursive function to get page level, function returns when parent page is zero
function level_page_admin_get_level($parentIds, $pageId, $level)
{
  $parentId = $parentIds[$pageId];
  if($parentId>0)
  {
    $level++;
    return level_page_admin_get_level($parentIds, $parentId, $level);
  }
  return $level;
}

function level_page_admin_posts_filter($query)
{
  global $pagenow;
  if(is_admin() && $pagenow == 'edit.php' && !empty($_GET['lavel_pages']))
  {
    $level = $_GET['lavel_pages'];
    if($level == 'parent')
    {
      $query->query_vars['post_parent'] = 0;
    }
    else
    {
      //get all the pages
      $pages = get_pages();

      //loop all the pages and store the parent id
      $parentIds = array();
      foreach($pages as $page)
      {
        $parentIds[$page->ID] = $page->post_parent;
      }

      //second time loop through all the pages this time call recursive function to get level
      foreach($pages as $page)
      {
        if($page->post_parent>0)
        {
          $pageLevels[$page->ID] = level_page_admin_get_level($parentIds, $page->ID, 0);
        }
      }

      //build array of only page ids on level
      $pageIds = array();
      foreach($pageLevels as $pageId => $pageLevel)
      {
        if($pageLevel==$level)
        {
          $pageIds[] = $pageId;
        }
      }

      if(!empty($pageIds))
      {
        //limit query to those page ids
        $query->query_vars['post__in'] = $pageIds;
      }
    }
  }
}

推荐阅读