如何在WooCommerce单一产品页面上显示两个不同的自定义分类术语

时间:2020-07-03 作者:hommealone

我们的WooCommerce产品有两个自定义分类:大小和颜色。

我试图在单个产品页面上显示产品的自定义分类术语。我正在使用woocommerce\\u single\\u product\\u summary操作挂钩。我无法同时显示这两种分类法。

以下是我目前的代码:

<?php
/**
 * display a woocommerce product\'s custom taxonomy terms on single product pages
 */

function display_single_product_sizes_after_summary() { 
    global $post;
    
    $size_terms = get_the_terms( $post->ID , array( \'sizes\') );
    // begin creating html markup
    $size_markup = \'\';
    if(!empty($size_terms)) {
        $size_markup .= "<p>Similar size shades: ";
    }
    // init counter
    $is = 1;
    foreach ( $size_terms as $size_term ) {
        $size_markup .= \'<a href="/shades/size/\' . $size_term->slug . \'">\' . $size_term->name . \'</a>\';
        //  Add comma (except after the last item)
        $size_markup .= ($is < count($size_terms))? ", " : "";
        // Increment counter
        $is++;
        //finish the markup
        if(!empty($size_terms)) {
            $size_markup .= "</p>";
        }
    }
    echo $size_markup;
};

function display_single_product_colors_after_summary() { 
    global $post;
    
    $color_terms = get_the_terms( $post->ID , array( \'colors\') );
    // begin creating html markup
    $color_markup = \'\';
    if(!empty($color_terms)) {
        $color_markup .= "<p>Similar color shades: ";
    }
    // init counter
    $ic = 1;
    foreach ( $color_terms as $color_term ) {
        $color_markup .= \'<a href="/shades/color/\' . $color_term->slug . \'">\' . $color_term->name . \'</a>\';
        //  Add comma (except after the last item)
        $color_markup .= ($ic < count($color_terms))? ", " : "";
        // Increment counter
        $ic++;
        //finish the markup
        if(!empty($color_terms)) {
            $color_markup .= "</p>";
        }
    }
    echo $color_markup;
};

function display_single_product_terms_after_summary() {
    display_single_product_sizes_after_summary();
    display_single_product_colors_after_summary();
};
add_action( \'woocommerce_single_product_summary\', \'display_single_product_terms_after_summary\', 101, 0 );
?>
这将输出以下内容:

相似大小的阴影:小

类似的色调:

如果在总结之后颠倒display\\u single\\u product\\u traits\\u中两个子函数的顺序,则输出更改为:

类似颜色:蓝色

相似大小的阴影:

我尝试在每个子功能结束时使用重置。我尝试过:

    echo $size_markup;
    wp_reset_postdata();
以及:

    echo $color_markup;
    wp_reset_postdata();
这没什么区别。

我也尝试过:

    echo $size_markup;
    rewind_posts();
以及:

    echo $color_markup;
    rewind_posts();
这完全打破了这一页。

这里我的错误是什么?我如何才能从两种分类法中获得要显示的术语?

1 个回复
最合适的回答,由SO网友:hommealone 整理而成

WordPress文档显示,数组是get\\u The\\u terms中可接受的分类参数(https://developer.wordpress.org/reference/functions/get_the_terms/). 如果您试图获取多个分类法,那么数组就可以工作。如果您只想获得一种分类法,它甚至可以工作。但是,按顺序获取两个单独的分类法数组会破坏此代码。

在最初发布的代码中,替换为:

$size_terms = get_the_terms( $post->ID , array( \'sizes\') );
换言之:

$size_terms = get_the_terms( $post->ID , \'sizes\' );
并将其替换为:

$color_terms = get_the_terms( $post->id , array( \'colors\') );
换言之:

$color_terms = get_the_terms( $post->id , \'colors\' );
解决了问题。

另一种可行的方法是一次检索两组分类术语,然后梳理WP\\u Term对象以准确找到所需内容。在大多数情况下,这可能是更好的解决方案。

function display_single_product_taxonomy_terms() {
    global $post;
    
    $tax_terms = get_the_terms( $post->ID , array( \'sizes\',\'colors\') );
    // create the markup variables
    $color_markup = \'\';
    $size_markup = \'\';
    // init counters
    $color_counter = 0;
    $size_counter = 0;
    
    foreach ( $tax_terms as $tax_term ) {
        if( $tax_term->taxonomy == \'colors\' ) {
            // this is a colors term; increment color counter
            $color_counter++;
            // add to color markup
            $color_markup .= ($color_counter > 1)? "; " : "";
            $color_markup .= \'<a href="/shades/color/\' . $tax_term->slug . \'">\' . str_replace(", and,"," and",str_replace("-", ", ", $tax_term->slug)) . \'</a>\';
        } else {
            // this is a sizes term; increment size counter
            $size_counter++;
            // add to size markup
            $size_markup .= ($size_counter > 1)? "; " : "";
            $size_markup .= \'<a href="/shades/size/\' . $tax_term->slug . \'">\' . str_replace("-", " ", $tax_term->slug) . \'</a>\';
        }
    };
    
    echo \'<div class="single-product-taxonomy-terms">\' . PHP_EOL;
    if ( $size_counter > 0 ) {
        echo \'<p>\'. __("Similar size shades: ","bright-side") . $size_markup . \'</p>\' . PHP_EOL;
    };
    if ( $color_counter > 0 ) {
        echo \'<p>\' . __("Similar color shades: ","bright-side") . $color_markup . \'</p>\' . PHP_EOL;
    };
    echo \'</div>\' . PHP_EOL;
};
add_action( \'woocommerce_single_product_summary\', \'display_single_product_taxonomy_terms\', 101, 0 );