我想做的是在Wooccommerce商店的侧边栏中显示一个菜单,其中包含当前产品类别名称和当前类别子项。如果产品类别没有子类别,则应显示父类别和父类别子类别。
层次结构如下所示:选购>预制食品>食品
当您在PREPARED FOODS页面上时,您应该会看到。
预制食品
- 苦味
- 熟食店
- 食品
当你在FOODSTUFF页面上时,你应该会看到
预制食品
- 苦味
- 熟食店
- 食品
现在我已经让它在您处于顶级类别时显示父类别链接,但在您处于高级类别时我还没有让它显示父类别名称。这是我迄今为止的代码:
<?php
$queried_object = get_queried_object();
if ( is_product_category() && is_a($queried_object, 'WP_Term') ) {
$taxonomy = $queried_object->taxonomy;
echo '<h2 class="shop__sidebar-heading">
<a href="' . get_term_link( $queried_object ) . '">' . $queried_object->name . '</a>
</h2>';
}
?>
<?php
$term = get_queried_object()->term_id;
$termid = get_term($term, 'product_cat' );
if($termid->parent > 0)
{
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
'child_of' => $termid->parent,
);
$siblingproducts = get_terms( 'product_cat', $args);
foreach ($siblingproducts as $siblingproduct) {
if ($siblingproduct->term_id == $term ) { ?>
<li>
<?php } else { ?>
<li>
<?php } ?>
<a href="<?php
echo get_term_link( $siblingproduct ); ?>"><?php echo $siblingproduct->name; ?><?php
echo "<span class='count'>" . $siblingproduct->count . "</span>"; ?></a></li>
<?php }
} else {
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
'child_of' => $term
);
$subproducts = get_terms( 'product_cat', $args);
foreach ($subproducts as $subproduct) { ?>
<li> <a href="<?php echo get_term_link( $subproduct ); ?>"><?php echo $subproduct->name; ?><?php echo "<span class='count'>" . "</span>"; ?></a></li>
<?php }
}
?>
在Food52网站的侧边栏中可以看到我正在努力实现的一个例子https://food52.com/shop/pantry
我在这一过程中自由地清理了一些东西(比如删除了一些不必要的打开/关闭PHP标签(和一些澄清的东西——我希望你不要介意!浏览您现有的代码:
-
您不应该在查询对象上检查
is_a()
(此外,请考虑使用instanceof
,因为它是一个语言结构,而不是函数:if($queried_object instanceof WP_Term){}
,所以开销较低。不过,您不应该检查它,因为is_product_category()
运行的是is_tax()
函数,它应该为您处理此问题。 -
您似乎有一个未使用的
$taxonomy
声明 -
它在WordPress提供的函数中不那么重要,但养成在属性字段中使用
esc_url
和esc_attr
的习惯是很好的。 -
在获取
$term
集合时,您遇到了一些冗余问题。似乎你也可以/应该将这些向上移动到你的外部if
语句中,因为你已经在检查它是否是WP_Term
对象,所以你不必担心没有设置或重新定义它的值。此外,你的$term
和$termid
声明有点混合,看起来它们是翻转的($term
是ID,$termid
是实际对象( -
您创建两个单独的循环参数数组(以及随后的循环(似乎没有真正的原因,只是根据变量名是否是顶级术语(parent_id>0(来更改变量名
-
您添加了一个条件
<li>
,如果它是正在查询的当前WP_Term
,则它不会利用条件检查;你是想在里面加一个active
类还是什么的? -
您似乎没有包含
<li>
元素的<ul>
。我根据get_terms
的子项/兄弟项循环的结果有条件地在中添加了它。
我熟悉WooCommerce,但目前我的垃圾场上还没有安装它,但我已经从中重新创建了类别(product_cat
(结构,并使用了此代码(只是更改了分类法(,它似乎做到了你所要求的:
<?php
if( is_product_category() ){
$queried_object = get_queried_object();
$child_terms = get_term_children( $queried_object->term_id, 'product_cat' );
$based_term = (is_wp_error($child_terms) || empty($child_terms)) ? get_term( $queried_object->parent, 'product_cat' ) : $queried_object;
printf( '<h2 class="shop__sidebar-heading">
<a href="%s?so64231449=true">%s</a>
</h2>', esc_url(get_term_link($based_term->term_id)), $based_term->name );
$display_terms = get_terms( 'product_cat', array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
'parent' => $based_term->term_id,
) );
if( !empty($display_terms) && !is_wp_error($display_terms) ){
echo '<ul>';
foreach( $display_terms as $display_term ){
printf(
'<li%s><a href="%s">%s <span class="count">%s</span></a></li>',
($display_term->term_id == $queried_object->term_id) ? ' class="active"' : '',
esc_url(get_term_link($display_term->term_id)),
$display_term->name,
number_format($display_term->count)
);
}
echo '</ul>';
}
}
?>
几个注意事项:
我已经用
printf()
替换了很多echo
。它看起来可能有点令人生畏,但它消除了对PHP Escapes和字符串串联的混合需求。它还使传递函数和三元运算符变得更容易- 第一个参数是要使用的字符串
- 每个后续变量按顺序用该值替换每个
%s
三元运算符基本上是一个简洁的,一行,";如果/否则";陈述这使您可以非常容易地在与其他术语相同的声明中检查
active
WP_Term。
这里有几个链接可以显示它正在工作(滚动到页面底部(:
- 食品储藏室(或准备好的食品(
- 咖啡&茶(或食品(
- 商店(或顶部级别(
- 车库(与储藏室同级,但也是底层期限(
您可以使用以下代码获取类别和子类别。您需要根据需要调用以下函数并传递参数。
/**
* Get Category
* @param $taxonomy
* @param string $order
* @return array
*/
function getPostTermCategory($taxonomy, $order = 'asc')
{
$term_query = new WP_Term_Query([
'taxonomy' => $taxonomy,
'order' => $order,
'hide_empty' => false,
'parent' => 0
]);
$categories = [];
foreach ($term_query->terms as $term) {
$categories[] = $term;
}
return $categories;
}
/**
* Get Child Categories of Parent
* @param $taxonomy
* @param $parentId
* @param string $order
* @return array
*/
function getPostTermChildCategory($taxonomy, $parentId, $order = 'asc')
{
$term_query = new WP_Term_Query([
'taxonomy' => $taxonomy,
'order' => $order,
'hide_empty' => false,
'parent' => $parentId
]);
$categories = [];
foreach ($term_query->terms as $term) {
$categories[] = $term;
}
return $categories;
}