我不希望使用任何插件来完成这个任务,因为我最近经历了一个类似的项目,打破了一个网站的冲突。所以我希望从基础开始创建这个功能。
我需要在产品类别页面上有一个下拉列表,以便按品牌选择产品。下拉列表将显示所有品牌。当您选择一个时,网站只显示分配给该品牌的那些产品。我们不需要使用内置的下拉菜单,可以按新鲜度、价格、受欢迎程度等进行查看。
使用WooCommerce 'Brands
分类法,我已经建立了我的品牌,并为每个产品分配了一个品牌。
我可以用下面的代码查看所有品牌及其属性的数组:
$brands = get_terms('brand');
print_r($brands);
输出如下:
阵列(
[0] =比;WP_Term Object ([term_id] =>[name] =>Imari Sometsuke[蛞蝓]=>Imari-sometsuke [term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>1 [filter] =>生)
[1] =比;WP_Term Object ([term_id] =>[name] =>库塔尼[蛞蝓]=>库塔尼[term_group] =>0 [term_taxonomy_id] =>[分类]=>品牌[description] =>(父)=比;0 [count] =>2 [filter] =>生)
[2] =比;WP_Term Object ([term_id] =>[name] =>谷谷Shoza[蛞蝓]=>Kutani-shoza [term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>4 [filter] =>生)
[3] =比;WP_Term Object ([term_id] =>[name] =>谷谷德栗[蛞蝓]=>Kutani-tokkuri [term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>2 [filter] =>生)
[5] =比;WP_Term Object ([term_id] =>[name] =>西川Sukenobu [slug] =>nishiawa -sukenobu [term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>1 [filter] =>生)
[6] =比;WP_Term Object ([term_id] =>[name] =>伊藤新绥[蛞蝓]=>Shinsui-ito [term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>2 [filter] =>生)
[7] =比;WP_Term Object ([term_id] =>[name] =>浅野武二[蛞蝓]=>浅野武[term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>2 [filter] =>生)
[8] =比;WP_Term Object ([term_id] =>[name] =>田家斋[鼻涕虫]=>Toshusai-sharaku [term_group] =>0 [term_taxonomy_id] =>[分类法]=>品牌[description] =>(父)=比;0 [count] =>3 [filter] =>生)
)
如何构建下拉(选择)列表来创建这个?我想象它的框架是这样的,我已经开始了:
<?php
$brands = get_terms('brand');
//print_r($brands);
?>
<select name="orderby" class="orderby">
<?php foreach ( $brands as ??? ) : ?>
<option value="<?php echo esc_attr( $??? ); ?>" <?php selected( $orderby, $??? ); ?>><?php echo esc_html( $??? ); ?></option>
<?php endforeach; ?>
</select>
可以看到,它是一个术语对象数组(WP_Term Object),并且必须在循环中对该术语的每个属性使用对象语法,如下所示:
<?php
$brands = get_terms( 'brand', array(
'orderby' => 'name' // orderby arguments ('name', 'slug','term_group', 'term_id', 'id', 'description')
) );
//print_r($brands);
?>
<select name="orderby" class="orderby">
<?php
foreach ( $brands as $key => $brand ) :
$brand_id = $brand->term_id;
$brand_name = $brand->name;
$brand_slug = $brand->slug;
$brand_term_group = $brand->term_group;
$brand_term_taxonomy = $brand->term_taxonomy_id;
$brand_taxonomy = $brand->taxonomy;
$brand_description = $brand->description;
$brand_parent = $brand->parent;
$brand_count = $brand->count;
$brand_filter = $brand->filter;
$number = $key+1;
$option = 'option-' . $number;
?>
<option value="<?php echo $option; ?>"><?php echo $brand->name; ?></option>
<?php endforeach; ?>
</select>
这段代码经过测试,可以正常工作
在新版本的WooCommerce中,
所取代terms
的前缀为pa_,因此brand已被pa_brand
最新版本的工作代码将是
<?php $brands = get_terms('pa_brand', ['orderby' => 'name']); ?>
<select name="orderby" class="orderby">
<?php
if (!empty($brands) && !is_wp_error($brands)):
foreach ($brands as $brand) :
?>
<option value="<?= $brand->term_id; ?>">
<?= $brand->name; ?>
</option>
<?php
endforeach;
endif;
?>
</select>
参考:https://developer.wordpress.org/reference/functions/get_terms/