Управление списками категорий таксономии для скрытия и отображения специфики
У меня есть вертикальное меню, использующее скрипт superfish, который показывает категории в пользовательской таксономии "категория продукта". Это меню имеет несколько уровней и является иерархическим.В нижней части каждой ветви дерева у нас есть конечная категория, которая представляет ассортимент товаров, которые клиент не хочет показывать в этом меню.
Я использую этот код для его отображения:
<ul class="frontcatlist sf-menu">
<?php
$a = array(
'title_li' => '',
'taxonomy' => 'productcategory',
'depth' => 2
);
wp_list_categories( $a );
?>
</ul>
Это то, что у меня сейчас есть с точки зрения того, что показывает, а что нет. слева - основные категории, и каждая строка на 1 шаг ниже своих дочерних элементов:
Красным цветом отмечены категории, которые не отображаются в меню,
Однако это не то, что нужно моему клиенту. Хотя я мог бы создать меню, соответствующее требованиям, используя собственные меню Wordpress 3, для этого потребовалось бы ручное вмешательство, вмешательство, которое нежелательно, как с точки зрения удобства использования, так и с точки зрения пожеланий клиентов.
Поскольку некоторые основные категории имеют подкатегории, которые должны быть показаны, а некоторые нет, параметра глубины будет недостаточно. Вместо этого это то, что мне нужно, с категориями верхнего уровня, всегда отображающими:
Я не уверен, как это сделать, и единственная подсказка, которая у меня есть, - это пользовательский класс walker для вывода пользовательского html, во время которого я мог бы отфильтровать те, которые мне не нужны (любые категории с родителем, у которого нет детей). Но я не смог увидеть достаточных примеров или статей по тема, и я бы предпочел не терять классы и разметку, которые предоставляет wordpress
Если у кого-нибудь есть какие-либо мысли или он знает о сообщениях на форуме или статьях об использовании, я был бы очень признателен =)
1 answers
Я добился некоторого прогресса на основе классов walker, но не смог заставить ti работать так, как нужно, потому что 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();
}
}
);