在顶级类别上显示父类别名称和子类别链接



我想做的是在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_urlesc_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
  • 三元运算符基本上是一个简洁的,一行,";如果/否则";陈述这使您可以非常容易地在与其他术语相同的声明中检查activeWP_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;
}

最新更新