Woocommerce - 在前端显示包含短代码的单个产品属性

时间:2016-09-08 14:53:19

标签: woocommerce attributes

我在过去的几天里读过很多Q / A,但不幸的是他们都没有解决我的问题。

我正在尝试获取产品属性并使用短代码在前端显示它们。我已设法显示所有可用属性并将其显示在列表中,但我需要在不同位置仅选择其中一个或两个(这就是为什么使用短代码)。例如[shortcode_attribute name =“brand”]。

非常感谢任何帮助!

到目前为止我的代码:

function tutsplus_list_attributes( $product ) {

global $product;
global $post;

$attributes = $product->get_attributes();

if ( ! $attributes ) {

return;

}

foreach ( $attributes as $attribute ) {

// Get the taxonomy.
$terms = wp_get_post_terms( $product->id, $attribute[ 'name' ], 'all' );
$taxonomy = $terms[ 0 ]->taxonomy;

// Get the taxonomy object.
$taxonomy_object = get_taxonomy( $taxonomy );

// Get the attribute label.
$attribute_label = $taxonomy_object->labels->name;

// Display the label followed by a clickable list of terms.
echo get_the_term_list( $post->ID, $attribute[ 'name' ] , '<div><li class="bullet-arrow">' . $attribute_label . ': ' , ', ', '</li></div>' );

}

}

add_action( 'woocommerce_product_meta_end', 'tutsplus_list_attributes' );
add_shortcode('display_attributes', 'tutsplus_list_attributes');

3 个答案:

答案 0 :(得分:2)

虽然我仍然没有100%清楚你所追求的是什么,但我要创建的是一个短代码,它会创建所有属性中所有术语的列表。为了使其更加灵活,我将添加对短代码参数的支持,以便您可以创建特定属性术语的列表。

您需要从代码中改变的一件主要事情是,短代码需要RETURN一个字符串而不是ECHO输出html。回应短码会导致意想不到的怪异。

/**
 * Attributes shortcode callback.
 */
function so_39394127_attributes_shortcode( $atts ) {

    global $product;

    if( ! is_object( $product ) || ! $product->has_attributes() ){
        return;
    }

    // parse the shortcode attributes
    $args = shortcode_atts( array(
        'attributes' => array_keys( $product->get_attributes() ), // by default show all attributes
    ), $atts );

    // is pass an attributes param, turn into array
    if( is_string( $args['attributes'] ) ){
        $args['attributes'] = array_map( 'trim', explode( '|' , $args['attributes'] ) );
    }

    // start with a null string because shortcodes need to return not echo a value
    $html = '';

    if( ! empty( $args['attributes'] ) ){

        foreach ( $args['attributes'] as $attribute ) {

            // get the WC-standard attribute taxonomy name
            $taxonomy = strpos( $attribute, 'pa_' ) === false ? wc_attribute_taxonomy_name( $attribute ) : $attribute;

            if( taxonomy_is_product_attribute( $taxonomy ) ){

                // Get the attribute label.
                $attribute_label = wc_attribute_label( $taxonomy );

                // Build the html string with the label followed by a clickable list of terms.
                // heads up that in WC2.7 $product->id needs to be $product->get_id()
                $html .= get_the_term_list( $product->id, $taxonomy, '<li class="bullet-arrow">' . $attribute_label . ': ' , ', ', '</li>' );   
            }

        }

        // if we have anything to display, wrap it in a <ul> for proper markup
        // OR: delete these lines if you only wish to return the <li> elements
        if( $html ){
            $html = '<ul class="product-attributes">' . $html . '</ul>';
        }

    }

    return $html;
}
add_shortcode( 'display_attributes', 'so_39394127_attributes_shortcode' );

用法:这将以2种方式中的1种使用。

首先,要显示特定属性,请使用:

[display_attributes attributes="color|material"]

其次,要显示所有属性,请使用:

[display_attributes]

修改

这是一个永远的单一显示版本:

/**
 * Attribute shortcode callback.
 */
function so_39394127_singular_attribute_shortcode( $atts ) {

    global $product;

    if( ! is_object( $product ) || ! $product->has_attributes() ){
        return;
    }

    // parse the shortcode attributes
    $args = shortcode_atts( array(
        'attribute' => ''
    ), $atts );

    // start with a null string because shortcodes need to return not echo a value
    $html = '';

    if( $args['attribute'] ){

        // get the WC-standard attribute taxonomy name
        $taxonomy = strpos( $args['attribute'], 'pa_' ) === false ? wc_attribute_taxonomy_name( $args['attribute'] ) : $args['attribute'];

        if( taxonomy_is_product_attribute( $taxonomy ) ){

            // Get the attribute label.
            $attribute_label = wc_attribute_label( $taxonomy );

            // Build the html string with the label followed by a clickable list of terms.
            // heads up that in WC2.7 $product->id needs to be $product->get_id()
            $html .= get_the_term_list( $product->id, $taxonomy, $attribute_label . ': ' , ', ', '' );   
        }

    }

    return $html;
}
add_shortcode( 'display_attribute', 'so_39394127_singular_attribute_shortcode' );

这会删除所有HTML标记,因此您需要提供自己的...如果您要制作自定义列表,就会发生这种情况。

<ul>
    <li class="arrow">Static List Item</li>
    <li class="arrow">[display_attribute attribute="color"]</li>
<ul>

编辑:此代码位于主题的functions.php或主题特定的插件中。

答案 1 :(得分:0)

如果其他任何人只想简单地将属性值输出为文本,则将$ html。=行替换为:

$html .= strip_tags(get_the_term_list($product->get_id(), $taxonomy));

@helgatheviking必须有比这更优雅的方法! :)

答案 2 :(得分:0)

最近需要这个 - 找到 https://wordpress.org/plugins/wcpas-product-attributes-shortcode/ 可以解决问题。

使用此插件,您可以设置“属性”参数以匹配您已设置的产品属性之一。

例如,如果您有一个品牌属性,您可以使用:

[wcpas_product_attributes attribute="brand"]

这将输出一个包含所有品牌的 <ul> 列表。

您还可以在属性旁边使用许多参数,包括:

  • orderby(按 orderby 值对列表进行排序)
  • order(按 asc、desc、rand 等排序)
  • hide_empty(隐藏空词)
  • show_counts(显示该品牌的产品总数)
  • archive_links(使用基于存档的 URL 而不是基于过滤器的 URL)
  • min_price(当使用 archive_links = 0 时,您可以使用基于 URL 的最低价格过滤器)
  • max_price(当使用 archive_links = 0 时,您可以基于 URL 过滤最高价格)