カスタムの 'productcategory'分類法でカテゴリを表示するスーパーフィッシュスクリプトを使用した垂直メニューがあります。このメニューには複数のレベルがあり、階層構造になっています。ツリーの各ブランチの下部には、クライアントが表示する製品の範囲を表す終了カテゴリがあります。notメニュー。
このコードを使って表示しています。
<ul class="frontcatlist sf-menu">
<?php
$a = array(
'title_li' => '',
'taxonomy' => 'productcategory',
'depth' => 2
);
wp_list_categories( $a );
?>
</ul>
これは私が現在見せているものと何が存在しないかという点で私が持っているものです。主なカテゴリーが残っていて、各行はその子供たちに一歩下がっています。
赤い部分はメニューに表示されていないカテゴリです。
これは私のクライアントが必要としているものではありません。ネイティブのWordpress 3メニューを使用して要件に合ったメニューを作成することはできますが、手動の介入が必要になりますが、使い勝手の観点からもクライアントの希望からも、望ましくない介入が必要になります。
いくつかの主要なカテゴリは表示されるべきサブカテゴリを持っていてはいけないので、depthパラメータは十分ではないでしょう。代わりに、これは私が必要としているもので、トップレベルのカテゴリは常に表示されます。
私はこれを行う方法がわからない、そして私が持っている唯一の手がかりは私が欲しいと思わないものを除外することができるかもしれないカスタムのHTMLを出力することができるかもしれない子供はいません)。しかし、私は主題に関する十分な例や記事を見ることができませんでした、そして私はむしろクラスとワードプレスが提供するマークアップを失うべきではありません
誰かが何か考えを持っている、またはチュートリアルフォーラムの投稿や使用の記事を知っているなら、私はそれを大いに感謝します=)
私はwalkerクラスに基づいていくつかの進歩を遂げましたが、wordpressは子のものと同じように分類木のルートノードを処理するようには見えないので、必要に応じてうまく動かなかった。
その結果、終了メニュー項目は整理されますが、そのノードの親がルートレベルのノードである場合は、ノードが整理されて空のul要素<ul></ul>
が残ります。子ノードでこの問題を解決するコードはルートノードでは機能しないため、サブメニューなしで構造全体が平坦化されます。
class Post_Category_Walker extends Walker_Category {
private $term_ids = array();
function __construct( /*$post_id,*/ $taxonomy ) {
// fetch the list of term ids for the given post
$this->taxterms = get_terms( $taxonomy);
$this->noshow = array();
}
function isdisplayable( $element, &$children_elements, $args ){
$id = $element->term_id;
if(in_array($element->term_id, $this->noshow)){
return false;
}
$display = true;
if($element->parent != 0){
$display = false;
if ( isset( $children_elements[ $id ] ) ) {
$display = true;
}
}
if($depth == 0){
$display = true;
}
return $display;
}
function hasChildren( $element/*, &$children_elements*/){
foreach($this->taxterms as $term){
if($term->parent == $element->term_id){
return true;
}
}
return false;//(isset($children_elements[$element->term_id]));
}
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
$display = $this->isdisplayable( $element, $children_elements, $args );
$id = $element->term_id;
if($element->parent != 0){
if($this->hasChildren($element)){ //isset( $children_elements[ $id ] ) ) {
$endnode = true;
//print_r($children_elements[ $id ]);
foreach($this->taxterms as $child){
if($child->parent == $element->term_id){
if($this->hasChildren($child)){
$endnode = false;
break;
}
}
}
if($endnode == true){
//$children_elements = NULL;
unset( $children_elements[ $id ] );
$newlevel = false;
$args[0]['has_children'] = 0;
}
}
}else{
// Wordpress separates out the terms into top level and child terms,
// making the top level terms very costly as it passes in an empty
// array as the children_elements unlike the other terms
//if($this->hasChildren($element)){
foreach($this->taxterms as $term){
if($term->parent == $element->term_id){
if(!$this->hasChildren($term)){
$this->noshow[] = $term->term_id;
unset($newlevel);
$args[0]['has_children'] = 0;
}
}
}
//}
}
if ( $display )
parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
}
$a = array(
'title_li' => '',
'taxonomy' => 'productcategory',
'walker' => new Post_Category_Walker('productcategory')
);
wp_list_categories( $a );
一時的な回避策は、次のjqueryスニペットを介してそれらを削除することです。
$("ul").each(
function() {
var elem = $(this);
if (elem.children().length == 0) {
elem.remove();
}
}
);