过滤默认查询以仅显示 wordpress 中选定级别的子页面
filter default query to show just selected level of child pages in wordpress
我在一个网站上工作,该网站的页面结构相当大,深几层 - 在某些部分中有很多页面。
所以我想要功能
如果用户选择 select 框级别 1,则只有级别 1 中的页面会显示在下面的页面列表中。
如果他选择 2 级,那么只有 2 级页面,
同样去到level 3 level 4 level 5 level 6.
当我设置 query_vars['post_parent'] = 0; 并且我希望具有相同的功能来显示列表时,它适用于顶级父页面一级子页面,二级子页面等等...
我卡住了。如果有人可以帮助我,请让我吃饱。谢谢
看截图link
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;
}
}
}
}
我在一个网站上工作,该网站的页面结构相当大,深几层 - 在某些部分中有很多页面。
所以我想要功能
如果用户选择 select 框级别 1,则只有级别 1 中的页面会显示在下面的页面列表中。
如果他选择 2 级,那么只有 2 级页面,
同样去到level 3 level 4 level 5 level 6.
当我设置 query_vars['post_parent'] = 0; 并且我希望具有相同的功能来显示列表时,它适用于顶级父页面一级子页面,二级子页面等等...
我卡住了。如果有人可以帮助我,请让我吃饱。谢谢
看截图link
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;
}
}
}
}