筛选默认查询以仅显示WordPress中选定级别的子页面

时间:2020-07-24 作者:Hafiz Shehroz

我在一个网站上工作,这个网站的页面结构相当大,只有几个层次,有些部分有很多页面。

所以我想有功能,如果用户选择框级别1,那么只有级别1中的页面才会显示在下面的页面列表中。如果他选择level 2,则只选择level 2页面,同样转到level 3 level 4 level 5 level 6。

当我设置query_vars[\'post_parent\'] = 0; 我想有同样的功能来显示1级子页面列表,2级子页面列表等等。。。

我被卡住了。如果有人能帮我的话,我会非常饱的。Thanksee屏幕截图链接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\') {
  $sql = "SELECT ID, post_title FROM ".$wpdb->posts." WHERE post_type = \'page\' AND post_parent = 0 AND post_status = \'publish\' ORDER BY post_title";
  $parent_pages = $wpdb->get_results($sql, OBJECT_K);
  $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\' );

1 个回复
SO网友:mozboz

所以看起来get_ancestors() 是你需要的功能,能够找出什么是“级别”的东西。从get\\u祖先返回的结果数与您的“级别”数相对应,0个结果表示父页面。

因此,您的问题是这个数字不能作为查询参数使用。因此,可能最简单的选择是在保存所有页面时将其存储为一个元字段。您可以通过一个简单的挂钩来实现这一点,如:

add_action(\'save_post\', \'hafiz_update_level_number\', 10, 2);
function hafiz_update_level_number($postID, $post) {
   if ($post->type == \'page\') {
        update_post_meta($postID, \'hafiz_level_number\', get_ancestors($postID)) ;
   }
}
现在不需要if ($level == ?) 代码,您只需确保您有一个数字,其中0是“父”,1是级别1,2是级别2,等等。您可以使您的查询工作如下:

$query->query_vars[\'meta_key\'] = \'hafiz_level_number\';
$query->query_vars[\'meta_value\'] = $levelNumber;
对于如何使用这个$查询对象,您可能需要对其进行编辑,但希望您能在这里了解大致情况。

请注意,您有一个明显的问题,即除非已保存或更新帖子,否则不会设置此新值after 您安装了这个钩子,因此您需要手动打开并保存每个页面,或者编写一个快速脚本来运行一次,该脚本在每个页面中循环并为每个页面设置此值。

希望这有帮助。此代码未经测试,但其目的是概述一种编写回答问题所需的完整代码的方法。请回答任何问题