Вопрос или проблема
Я пытаюсь реализовать обход категорий с помощью wp_list_categories
, чтобы изменить классы списка. Мне нужно получить идентификатор термина в методе start_lvl
. Я пробовал использовать $category->term_id
, но возникли ошибки. Сейчас я просто хочу получить идентификатор термина внутри метода start_lvl
, чтобы сопоставить его с тем, который я использовал в выводе start_el
. Пожалуйста, проверьте эту строку в следующем классе:
$output .= "<span id=\"$category->term_id\" class=\"toggle\" onClick=\"toggleMe(this.id);\" style=\"cursor:pointer\">▼</span>";
Я просто скопировал класс Walker_Category
и отредактировал его следующим образом:
<?php
//error_reporting(E_ALL);
/*
Plugin Name: YB Walker Categories List
Plugin URI: https://prosentra.com
Description: Displays a list of categories using walker class
Version: 1.0.0
Author: Mohammad Omar
Author URI: https://prosentra.com
Text Domain: yb-walker-categories-list
License: GPL2
*/
if ( ! class_exists( 'YB_Cats_Walk' ) ) {
class YB_Cats_Walk extends Walker_Category{
public $tree_type="genre";
/**
* Start Level.
*
* @see Walker::start_lvl()
* @since 3.0.0
*
* @access public
* @param mixed $output Passed by reference. Used to append additional content.
* @param int $depth (default: 0) Depth of page. Used for padding.
* @param array $args (default: array()) Arguments.
* @return void
*/
public function start_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat( "\t", $depth );
$output .= "\n$indent<ul id = \"dropdown-$category->term_id\" style=\"display: none;\">\n";
}
public function end_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
/** This filter is documented in wp-includes/category-template.php */
$cat_name = apply_filters(
'list_cats',
esc_attr( $category->name ),
$category
);
// Don't generate an element if the category name is empty.
if ( ! $cat_name ) {
return;
}
$link = '<a href="' . esc_url( get_term_link( $category ) ) . '" ';
if ( $args['use_desc_for_title'] && ! empty( $category->description ) ) {
/**
* Filters the category description for display.
*
* @since 1.2.0
*
* @param string $description Category description.
* @param object $category Category object.
*/
$link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"';
}
$link .= '>';
$link .= $cat_name . '</a>';
if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {
$link .= ' ';
if ( empty( $args['feed_image'] ) ) {
$link .= '(';
}
$link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '"';
if ( empty( $args['feed'] ) ) {
$alt=" alt="" . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
} else {
$alt=" alt="" . $args['feed'] . '"';
$name = $args['feed'];
$link .= empty( $args['title'] ) ? '' : $args['title'];
}
$link .= '>';
if ( empty( $args['feed_image'] ) ) {
$link .= $name;
} else {
$link .= "<img src="" . $args["feed_image'] . "'$alt" . ' />';
}
$link .= '</a>';
if ( empty( $args['feed_image'] ) ) {
$link .= ')';
}
}
if ( ! empty( $args['show_count'] ) ) {
$link .= ' (' . number_format_i18n( $category->count ) . ')';
}
if ( 'list' == $args['style'] ) {
$output .= "\t<li";
if($this->has_children){
$css_classes = array(
'has-children',
'cat-item',
'cat-item-' . $category->term_id,
);
}
$css_classes = array(
'has-children',
'cat-item',
'cat-item-' . $category->term_id,
);
if ( ! empty( $args['current_category'] ) ) {
// 'current_category' can be an array, so we use `get_terms()`.
$_current_terms = get_terms( $category->taxonomy, array(
'include' => $args['current_category'],
'hide_empty' => false,
) );
foreach ( $_current_terms as $_current_term ) {
if ( $category->term_id == $_current_term->term_id ) {
$css_classes[] = 'current-cat';
} elseif ( $category->term_id == $_current_term->parent ) {
$css_classes[] = 'current-cat-parent';
}
while ( $_current_term->parent ) {
if ( $category->term_id == $_current_term->parent ) {
$css_classes[] = 'current-cat-ancestor';
break;
}
$_current_term = get_term( $_current_term->parent, $category->taxonomy );
}
}
}
/**
* Filters the list of CSS classes to include with each category in the list.
*
* @since 4.2.0
*
* @see wp_list_categories()
*
* @param array $css_classes An array of CSS classes to be applied to each list item.
* @param object $category Category data object.
* @param int $depth Depth of page, used for padding.
* @param array $args An array of wp_list_categories() arguments.
*/
$css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) );
$output .= ' class="' . $css_classes . '"';
$output .= ">$link\n";
if($this->has_children){
$output .= "<span id=\"$category->term_id\" class=\"toggle\" onClick=\"toggleMe(this.id);\" style=\"cursor:pointer\">▼</span>";
}
} elseif ( isset( $args['separator'] ) ) {
$output .= "\t$link" . $args['separator'] . "\n";
} else {
$output .= "\t$link<br />\n";
}
}
public function end_el( &$output, $page, $depth = 0, $args = array() ) {
$output .= "</li>\n";
}
}
}
Вы не можете, потому что у вас нет доступа к элементу на этом этапе, но ознакомьтесь с ответом.
.
Ответ или решение
Чтобы получить term_id
внутри метода start_lvl
класса YB_Cats_Walk
, необходимо учитывать, что метод start_lvl
не имеет прямого доступа к информации о текущей категории, так как его целью является создание уровня вложенности, а не работа с отдельными элементами.
Вам потребуется изменить подход, чтобы передать term_id
из метода start_el
в start_lvl
. Одним из способов является использование глобального массива для временного хранения информации. Например:
-
Используйте глобальную переменную для хранения
term_id
:Вначале создайте глобальный массив для хранения
term_id
, например$GLOBALS['term_ids']
.
global $term_ids;
$term_ids = array();
-
Заполните массив в
start_el
:В методе
start_el
, перед тем как закончить, сохранитеterm_id
в глобальный массив$term_ids
, используя глубинуdepth
как ключ для обеспечения уникальности в случае рекурсии.
global $term_ids;
$term_ids[$depth] = $category->term_id;
-
Получите
term_id
вstart_lvl
:Теперь в методе
start_lvl
вы можете получитьterm_id
, используяdepth
в качестве ключа.
global $term_ids;
if (isset($term_ids[$depth])) {
$term_id = $term_ids[$depth];
$output .= "\n$indent<ul id=\"dropdown-$term_id\" style=\"display: none;\">\n";
}
- Оптимизация и публикация:
Убедитесь, что вы корректно документируете эти изменения в вашем коде, чтобы будущие разработчики могли легко понять логику и назначение вашего подхода. Это не только улучшит читаемость, но и упростит поддержку и модификацию кода в будущем.
данный подход позволяет наладить взаимодействие между методами start_el
и start_lvl
для реализации такой задачи, как получение term_id
. Используя глобальный массив в качестве связующего элемента, вы сможете успешно управлять рендерингом вложенных списков категорий в WordPress, создавая более сложные структуры и обеспечивая удобство в работе с интерфейсом.