Woocommerce-在Frontend中显示带有短代码的单个产品属性 [英] Woocommerce - Display single product attribute(s) with shortcodes in Frontend

查看:61
本文介绍了Woocommerce-在Frontend中显示带有短代码的单个产品属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近几天我在这里阅读了许多问答,但是不幸的是,没有一个人解决了我的问题.

i've read many Q/A's here during the last few days, but unfortunately none of them solved my issue.

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

I'm trying to fetch product attributes and display them on the frontend with a shortcode. I have managed to display ALL available attributes and display them in a list, but i need to select only one or two of them in different locations (thats why using shortcodes). For example like [shortcode_attribute name="brand"].

我们非常感谢您的帮助!

Any help is highly appreciated!

到目前为止我的代码:

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');

推荐答案

虽然我仍不是100%清楚您要寻找的内容,但我要创建的是一个简码,可创建所有术语的列表属性.为了更加灵活,我将添加对shortcode参数的支持,以便您可以创建特定属性术语的列表.

While I am still not 100% clear what you're after, what I'm going to create is a shortcode that creates a list of all terms in all attributes. To make it more flexible I'll add support for a shortcode parameter so you can create a list of specific attribute terms.

您需要从代码中更改的一件主要事情是,短代码需要返回一个字符串,而不是将HTML回显.回退简码可能会导致意外的怪异现象.

One major thing you need to alter from your code, is that shortcodes need to RETURN a string and not ECHO out html. Echoing out shortcodes can result in unexpected weirdness.

/**
 * 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.
                // Updated for WC3.0 to use getters instead of directly accessing property.
                $html .= get_the_term_list( $product->get_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种方式之一使用.

Usage: This would be used in 1 of 2 ways.

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

First, to display specific attributes use:

[display_attributes attributes="color|material"]

第二,要显示所有属性,请使用:

Second, to display all attributes use:

[display_attributes]

修改

这里总是一个单一的显示版本:

Here's an always single display edition:

/**
 * 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.
            // Updated for WC3.0 to use getters instead of directly accessing property.
            $html .= get_the_term_list( $product->get_id(), $taxonomy, $attribute_label . ': ' , ', ', '' );   
        }

    }

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

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

This removes all HTML markup, and so you'd need to provide your own... which would happen if you are making a custom list.

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

编辑:可以将此代码添加到主题的functions.php中,但最好在

EDIT: This code can be added to your theme's functions.php, but preferably either in a site-specific plugin or via the Code Snippets plugin.

这篇关于Woocommerce-在Frontend中显示带有短代码的单个产品属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆