我陷入了一个小小的困境,虽然我离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);