Перечислите все категории, но только якорные внуки (Wordpress)
В настоящее время я использую это, чтобы перечислить все категории:
<?php
$args = array (
'menu' => 'secondary-navigation',
'sort_column' => 'menu_order',
'container' => 'false',
'title_li' => 0,
'hide_empty' => 0
);
wp_list_categories($args);
?>
Это просто перечислит все категории в иерархии и с каждым привязанным элементом.
Мои категории на самом деле настроены так:
Parent
-> Child
-> Grandchild
-> Great Grandchild
Моя проблема в том, что я хочу, чтобы только у Великих Внуков были якоря. Я не хочу, чтобы у Родителя, Ребенка или Внука были якоря.
Мы ценим любые предложения.
3 ответа
Вы можете просто отключить ссылки, используя чистый CSS, не меняя никакого php-кода вообще. Проверьте следующий код, он изменит курсор мыши, отключит функцию связывания и скроет стиль подчеркивания:
.cat-item a, .cat-item .cat-item .cat-item .cat-item a {
cursor: default;
pointer-events: none;
text-decoration: none;
}
.cat-item .cat-item .cat-item a {
cursor: pointer;
pointer-events: auto;
text-decoration: underline;
/* also add here any special style for grandchildren categories */
}
Результат будет точно таким, как вам требуется, только привязанная категория внука.
Надеюсь это ответит на твой вопрос
Как упомянул Ллео Холмс в комментариях, лучший подход - создать собственный класс Уокера для реализации этой функциональности. Я попробовал и сделал следующее:
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>
Пожалуйста, используйте этот код
$categories = get_categories(array(
'child_of' => 9,
'hide_empty' => false
));
foreach($categories as $cat){
echo $cat->name;
echo '<br />';
}
этот код проверен только для двухуровневой категории.
Замените 9 идентификатором своей категории, например, идентификатором категрии "Grandchild". Этот код не проверен, но это работа
Надеюсь, что это полезно для вас