从菜单获取自定义类别图像

时间:2015-08-06 作者:PUncle

我陷入了一个小小的困境,虽然我离PHP如此之近,但我对PHP的理解让我失望。

我想在菜单中显示与每个类别相关的图像-从答案开始工作over here 在我处理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 如果这些产品类别是嵌套的,那么将返回两个(或更多)slug;因此,在尝试从slug中获取术语id之前,我对其进行了更多的清理。

更换:

$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 个回复
最合适的回答,由SO网友:markmoxx 整理而成

不确定对象返回非对象通知的原因,但可以设置get_term_byOBJECT, ARRAY_A, 或ARRAY_N - 您将要使用ARRAY_A 然后通过访问术语ID$term[\'term_id\'].

SO网友:milicua

我认为这对你有用:

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 );

结束