Получить изображение пользовательской категории из меню


Я попал в небольшую передрягу, и хотя я так близок к этому, мое понимание 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);
Author: Community, 2015-08-06

2 answers

Не уверен, почему ваш объект возвращает уведомление, не относящееся к объекту, но вы можете установить вывод get_term_by равным OBJECT, ARRAY_A, или ARRAY_N - Вы захотите использовать ARRAY_A, а затем получить доступ к идентификатору термина через $term['term_id'].

 1
Author: markmoxx, 2015-08-06 10:17:04

Я думаю, что это сработает для вас:

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 );
 0
Author: milicua, 2016-08-05 14:28:28