最简单的白名单页面IDwp_list_pages()
是在内部使用自删除/一次性运行筛选器回调get_pages()
, 这是一个从缓存或从数据库的新查询中检索数据的函数。
您有多种选择:
过滤最终的DB结果要过滤返回的页面列表,您可以使用过滤器回调为自己构建一个快速插件,可以在模板中使用:
<?php
/** Plugin Name: WPSE (#165677) Whitelist pages Callback */
function wpse165677_whitelist_pages( $pages, $arguments )
{
if ( empty( $pages ) )
return $pages;
// Remove instantly
remove_filter( current_filter(), __FUNCTION__, 10 );
// whitelist: loop through pages and build your return array of allowed pages
return $pages;
}
然后,在模板中:
add_filter( \'get_pages\', \'wpse165677_whitelist_pages\', 10, 2 );
wp_list_pages( [
// your arguments
] );
这会查询一些不必要的页面,但这是一个快速的解决方案,除非您有数百个页面,否则可能不会影响性能。
忽略标记中未列入白名单的页面
只需构建一个自定义walker,它只为您的列入白名单的页面构建子页面标记。
预取和排除页面
您可以只查询ID
$wpdb->prepare(
"SELECT id
FROM{$wpdb->posts}
WHERE {$wpdb->posts}.post_type = \'page\'
AND {$wpdb->posts}.id IN (%s)",
join( ",", [ /* IDs Array */ ] ),
);
然后将返回值与所有
page
post类型返回ID以构建黑名单。然后在
wp_list_pages_excludes
, 用于填充
exclude
论点您可以使用
wp_parse_id_list()
使创建列表更容易。
add_filter( \'wp_list_pages_excludes\', function( $blacklist )
{
// logic to build blacklist
return $blacklist;
}
在docBlock和Codex中都不传递参数
wp_list_pages()
说明在函数参数传递到之前,没有在其上运行筛选器
get_pages()
. 所以
include
参数也适用于此函数。请记住,此参数不能与一起使用
\'child_of\', \'parent\', \'exclude\', \'meta_key\', \'meta_value\', or \'hierarchical\'.
结论通常,你所面临的任务可以通过多种不同的方式得到解决。最终使用什么取决于您自己,取决于您非常具体的要求。