当前位置: 首页 > 知识库问答 >
问题:

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

吕骞尧
2023-03-14

我想做的是在我的WooCommerce商店的侧边栏上显示一个菜单,上面有当前产品类别名称和当前类别的子项。如果产品类别没有子类,那么它应该显示父类别和父类别子类。

这是层次结构的样子:商店

当你在“准备好的食物”页面上时,你应该看到。

制备食品

  • 苦味
  • Charcuterie
  • 食品

当你在食品页面上时,你应该看到

制备食品

  • 苦味
  • Charcuterie
  • 食品

现在,我已经让它在您处于顶级类别时显示父类别链接,但我还没有让它在您处于顶级类别时显示父类别名称。以下是我目前掌握的代码:

<?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

共有2个答案

翟迪
2023-03-14

您可以使用以下代码获取类别和子类别。你需要根据你的需要调用下面的函数,传递参数。

/**
 * 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;
}
路伟
2023-03-14

在此过程中,我已经自由地清理了一些事情(比如删除一些不必要的打开/关闭PHP标记)和一些澄清的事情——我希望您不会介意!检查现有代码:

> >p>您不必在查询对象上检查<代码> iSub()/代码>(也可以考虑使用<代码>实例> <代码>,因为它是一个语言构造而不是一个函数:<代码>($QueIdId的WPY术语的对象实例){} /代码>。但是,您不必检查它,因为<代码> iSuffTytTyCype()运行 is_tax()函数,该函数将为您处理该问题。

您似乎有一个未使用的$taxonomy声明

它在WordPress提供的函数中不太重要,但是养成在属性字段中使用esc\u urlesc\u attr的习惯是很好的。

您在获取$术语集时遇到了一些冗余问题。似乎您也可以/应该将它们向上移动到您的外部if语句中,因为您已经在检查它是否是一个WP_Term对象,所以您不必担心没有设置或重新定义其中的值。此外,您的$术语$termid声明有点混合,似乎它们被翻转了($术语是ID,$termid是实际对象)

您似乎在创建两个独立的循环参数数组(以及后续循环),除了更改变量名之外,没有任何真正的原因,这只是基于它是否是顶级术语(parent_id)

你添加了一个条件

您似乎没有

我对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>';
        }
    }
?>

几点注意事项

>

  • 第一个参数是要使用的字符串

三元运算符基本上是一个简洁的单行“if/else”语句。这使您可以很容易地在与其他术语相同的声明中检查activeWP\u术语。

这里有几个链接向您展示它的工作原理(滚动到页面底部):

  • 食品储藏室(或预备食品)
  • 咖啡

 类似资料:
  • 我试图在WooCommerce的子类别页面中查找父类别名称,即我有4个主要类别。 父母1 子1 子2 子3等 父母2 子1 子2 子3等 等等。 如果我在Sub2的列表页上,Sub2是Parent1的子级,我想知道Parent1类别的名称。

  • 我正在研究一个场景,其中有多个父类别,每个父类别都有多个子类别。 我已经设置了父类别来显示子类别,而不是产品。 下面是我当前的层次结构: 父类别1 子类别1 子类别2 子类别3 父类别2 子类别4 一切都很好,但我想做一件额外的事情,显示所有子类别的描述,当它们显示在父类别下。 我知道子类别的标题在查看父类别时默认显示,但是,我找不到一种方法来覆盖默认循环以显示父类别中子类别的描述。 任何帮助都将

  • 我需要一些关于Woocommerce类别显示选项的帮助。在Wordpress仪表板中,我按照以下链接全局设置类别显示选项<外观- 有三种显示选项可用。 展示产品 目前,选择了第三个选项,它显示子类别以及父类别和子类别下的所有产品。但是,我想排除子类别下的所有产品。换句话说,我只想在父类别下显示子类别和产品。 我在几个教程网站上找到了以下片段。代码完全按照我想要的方式工作,但它也禁用了管理产品搜索和

  • 我是初学者(PHP) 我显示这个日期在PHP嵌套'ul'喜欢(代码)- 一切都很好,没有问题。。。。我的问题,如果点击主分类得到我在这个类别中还没有主题。。。。我需要代码来选择用户是否在主类别中选择了主类别回显子类别——如果选择了子类别,则只显示子类别中的数据,或者用户是否在主类别示例中选择了主类别回显主题::我有类别Photosession和子类别- > 通知- 这是我选择帖子的代码 我认为我的

  • 我正试图通过WoodPress主题中的一个函数从woocommerce获取产品类别,我已经做到了: 这将按层次列出所有顶级类别及其下的子类别,但我有子类别(子类别)的子类别,因此如何列出这些子类别。

  • 我的类别表设计如下 我有三个级别的类别 < li >父项 < li >孩子 < li >子系 如何以下列方式显示它们? (SELECT*From类别):我得到以下数组,如下所示