コメントで Lleo Holmes が述べたように、最善の方法は、カスタムWalker クラスを作成してこの機能を実装することです。私はそれを突き刺し、次のことを思いつきました:
class Depth_Category_Walker extends Walker_Category {
private $allowed_depths;
function __construct( $depths_to_link = array() ) {
$this->allowed_depths = !is_array($depths_to_link) ? array($depths_to_link) : $depths_to_link;
}
function start_el( &$output, $category, $current_depth = 0, $args = array(), $id = 0 ) {
extract($args);
if( in_array( $current_depth, $this->allowed_depths ) ) {
parent::start_el( $output, $category, $current_depth, $args, $id );
} else {
$cat_name = esc_attr( $category->name );
$cat_name = apply_filters( 'list_cats', $cat_name, $category );
if ( !empty($show_count) )
$cat_name .= ' (' . intval($category->count) . ')';
if ( 'list' == $args['style'] ) {
$output .= "\t<li";
$class = 'cat-item cat-item-' . $category->term_id;
if ( !empty($current_category) ) {
$_current_category = get_term( $current_category, $category->taxonomy );
if ( $category->term_id == $current_category )
$class .= ' current-cat';
elseif ( $category->term_id == $_current_category->parent )
$class .= ' current-cat-parent';
}
$output .= ' class="' . $class . '"';
$output .= ">$cat_name\n";
} else {
$output .= "\t$cat_name<br />\n";
}
}
}
}
Walker_Category
これによりクラスが拡張parent::start_el()
され、リンクが適切な深さにある場合に呼び出してリンクを生成できるようになります。コンストラクターは、リンクを表示するレベルを含む深さの配列を受け入れます。その配列の外にある深さは、プレーンテキストとしてレンダリングされます。else
コードは から取られたものWalker_Category::start_el
であるため、基本クラスが変更された場合、将来のリリースでこれが機能しなくなる可能性があることに注意してください。
上記のクラスは、次のwp_list_categories
ように呼び出して使用できます。
<?php
$args = array(
'orderby' => 'menu_order',
'title_li' => 0,
'hide_empty' => 0,
'walker' => new Depth_Category_Walker(2)
);
?>
<ul>
<?php wp_list_categories( $args ); ?>
</ul>