Получить изображение пользовательской категории из меню
Я попал в небольшую передрягу, и хотя я так близок к этому, мое понимание PHP подводит меня.
Я хочу отобразить изображение, связанное с каждой категорией в меню - работа с ответом здесь Мне нужно было заставить этот код работать с пользовательской таксономией, поскольку я работаю с категориями продуктов woocommerce. Я должен добавить, что мой вариант использования довольно узкий, поэтому я убрал большую часть первоначального ответа, чтобы сосредоточиться на этом продукте изображение категории.
Сначала я добавляю все это в меню.
<?php add_filter('wp_nav_menu_args', 'add_filter_to_menus');
function add_filter_to_menus($args) {
add_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
return $args;
} ?>
Следующий бит - это проблематичный материал...
<?php
function filter_menu_items($item) {
// if the menu item is taxonomy
if( $item->type == 'taxonomy') {
// explicitly set the category for now
$cat_base = 'product-category';
// strip away everything except the term path
$cat_path = str_replace(home_url().'/'.$cat_base.'/', '', $item->url);
// get the term object by using the slug
$term = get_term_by('slug', $cat_path, 'product_cat');
// get the term id from the object
$term_id = $term->term_id;
// $term_array = get_object_vars($term);
// echo '<pre>'; var_dump( $term ); echo '</pre>';
$thumbnail_id = get_woocommerce_term_meta( $term_id, 'thumbnail_id', false );
$image = wp_get_attachment_url( $thumbnail_id );
if( !empty($image) ) {
$item->title = $item->title . '<span class="menu-image"><img src="' . $image . '" alt=""></span>';
}
}
} ?>
У меня возникла проблема с получением $term_id
из объекта $term
. Я получаю уведомление Trying to get property of non-object
. Но когда я делаю var_dump
на $term
, я получаю следующее:
<pre>object(stdClass)#4511 (10) {
["term_id"]=>
int(21)
["name"]=>
string(9) "Furniture"
["slug"]=>
string(9) "furniture"
["term_group"]=>
int(0)
["term_taxonomy_id"]=>
int(21)
["taxonomy"]=>
string(11) "product_cat"
["description"]=>
string(0) ""
["parent"]=>
int(0)
["count"]=>
int(0)
["filter"]=>
string(3) "raw"
}
</pre>
Мне кажется, что $term
- это объект, так почему же не-объектное уведомление и полный провал? Вы также можете увидеть комментарий о том, что я пытался превратить этот объект в массив, но это не сработало, поэтому тоже хорошо...
Приношу извинения за мои навыки PHP здесь - я явно не понимаю чего-то довольно простого, но я действительно хотел решить это сам, но я должен признать поражение!
Большое спасибо за чтение.
ИЗМЕНИТЬ:
Как указано в ответе Марка ниже, значение по умолчанию get_term_by()
возвращает объект. Я не знаю, почему мой код зациклился на том, является ли это или не является объектом, я не знаю. Однако использование $term = get_term_by('slug', $cat_path, 'product_cat', ARRAY_A);
сделало свое дело, наряду с использованием массива, а не чем синтаксис объекта, чтобы выбрать значение, которое я хотел.
Кроме того, я понял, что вышеприведенное вернет false
, если бы эти категории продуктов были вложенными, так как возвращалось бы два (или более) слизней; поэтому я немного больше очистил слизней, прежде чем пытаться получить идентификатор термина из него.
Замена:
$cat_path = str_replace(home_url().'/'.$cat_base.'/', '', $item->url);
С помощью:
$path = parse_url($item->url, PHP_URL_PATH);
$path_trimmed = trim($path, '/');
$parts = explode('/', $path_trimmed);
$cat_path = end($parts);
2 answers
Не уверен, почему ваш объект возвращает уведомление, не относящееся к объекту, но вы можете установить вывод get_term_by
равным OBJECT
, ARRAY_A
, или ARRAY_N
- Вы захотите использовать ARRAY_A
, а затем получить доступ к идентификатору термина через $term['term_id']
.
Я думаю, что это сработает для вас:
function wpa_category_nav_class( $classes, $item ){
if( 'product_cat' == $item->object ){
$classes[] = 'menu-category-' . $item->object_id;
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'wpa_category_nav_class', 10, 2 );