仅显示列入白名单的子页的列表页面

时间:2014-10-17 作者:Dragon54

在我的自定义主题中,我想显示所有父页面,但对于其中一些父页面,我不想显示它们的子页面。

我知道您可以将所有这些子页面添加到wp\\u list\\u pages函数的“exclude”参数中,但我想确保每当有人添加新的子页面时,也不会显示该子页面。

排除树可能是一种可能性,但它也会忽略父页。

My code:

$subtitle_walker = new Subtitle_Walker();

$args = array(
    \'authors\'      => \'\',
    \'child_of\'     => 0,
    \'date_format\'  => get_option(\'date_format\'),
    \'depth\'        => 2,
    \'echo\'         => 1,
    \'exclude\'      => \'\',
    \'exclude_tree\' => \'\',
    \'include\'      => \'\',
    \'link_after\'   => \'\',
    \'link_before\'  => \'\',
    \'post_type\'    => \'page\',
    \'post_status\'  => \'publish\',
    \'show_date\'    => \'\',
    \'sort_column\'  => \'menu_order\',
    \'title_li\'     => \'\', 
    \'walker\'       => new Subtitle_Walker
);

wp_list_pages($args);

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

最简单的白名单页面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\'.

结论通常,你所面临的任务可以通过多种不同的方式得到解决。最终使用什么取决于您自己,取决于您非常具体的要求。

结束

相关推荐

如何从wp_NAV_MENU Walker中删除拖尾</li>标记

我已经使用了theme二十三a我的基本主题,并尝试使用了https://stackoverflow.com/questions/12159486/wordpress-change-header-navigation-list-items-to-div 当我尝试验证页面时,我得到一个带有无效尾随的错误</li> 标记我正在尝试从walker类创建此结果<div class=\"box1\"> <a href=\"#\"><span class=\"c