php - 过滤默认查询以在 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' );
解决方案
如果我们获取所有页面并计算出每个页面所在的级别,然后使用“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;
}
}
}
}
推荐阅读
- excel - VSTO vb.NET - 获取现有工作表控件的名称
- php - 数据库数据以单行显示
- python - 如何有条件地对 Pandas 数据框求和
- android - 我正在使用 FirebaseUi 多重登录方法,但如何授予每个人登录应用程序的权限..?
- node.js - 在angular8应用程序中成功登录后打印用户名
- c# - Ubuntu MATE ARM32 上的 Azure 语音 SDK 意图识别错误
- javascript - 作为参数的函数:练习
- resharper - 我可以在本地函数中专门为参数设置命名样式吗?
- android - ImageView 在 Android 中脱离布局
- python - 在 python if 语句中使用列表