Получите пользовательские таксономии Woocommerce на боковой панели, используя короткий код - PullRequest
1 голос
/ 18 марта 2019

Я нашел этот код, который добавляет размеры продукта в цикл продукта:

add_action( 'woocommerce_after_shop_loop_item', 'show_product_dimensions_loop', 100 );

function show_product_dimensions_loop() {
    global $product;

    $dimensions = $product->get_dimensions();

    if ( ! empty( $dimensions ) ) {
        echo '<div class="dimensions"><b>Height:</b> ' . $product->get_height() . get_option( 'woocommerce_dimension_unit' );
        echo '<br><b>Width:</b> ' . $product->get_width() . get_option( 'woocommerce_dimension_unit' );
        echo '<br><b>Length:</b> ' . $product->get_length() . get_option( 'woocommerce_dimension_unit' );
        echo '</div>';
    }
}

Как мне преобразовать его в шорткод? Мне также нужно отображать пользовательские атрибуты и таксономии в виде цветов. Как этого достичь?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Попробуйте следующий шорткод на основе single-product/product-attributes.php шаблона Woocommerce, который будет отображать вес товара, размеры и атрибуты товара.Вы можете указать идентификатор продукта с помощью атрибута id:

[product_taxonomies id="37"]

или использовать в коде php:

echo do_shortcode("[product_taxonomies id='37']");

или без указания идентификатора продукта (принимает текущийID сообщения) :

[product_taxonomies]

Код:

add_shortcode( 'product_taxonomies', 'product_taxonomies_shortcode' );
function product_taxonomies_shortcode( $atts ){
    // Shortcode Attributes
    $atts = shortcode_atts( array(
        'id' => '',
    ), $atts, 'product_taxonomies' );

    $product_id = ! empty($atts['id']) ? $atts['id'] : 0;

    if( $product_id > 0 ) {
        $product = wc_get_product( $product_id );
    } else {
        global $product;
    }

    if( ! is_a($product, 'WC_Product' ) ) {
        $product = wc_get_product( get_the_id() );
    }

    if ( is_a($product, 'WC_Product' ) ) {

        ob_start();

        // Weight
        if ( $product->has_weight() ) {
            $weight_unit = get_option('woocommerce_weight_unit');
            $weight_html = '<strong>'.__("Weight").':</strong> ' . $value . $weight_unit;
            echo '<div class="dimensions">' . $weight_html . '</div>';
        }

        // Dimensions
        if ( $product->has_dimensions() ) {
            $dimension_unit = get_option('woocommerce_dimension_unit');
            $dimensions     = array();
            foreach( $product->get_dimensions( false ) as $key => $value ) {
                if( ! empty($value) )
                    $dimensions[] = '<strong>'.ucfirst($key).':</strong> ' . $value . $dimension_unit;
            }
            echo '<div class="dimensions">' . implode('<br>', $dimensions) . '</div>';
        }

        // Product attributes (visible)
        if ( $attributes = array_filter( $product->get_attributes(), 'wc_attributes_array_filter_visible' ) ) {
            foreach ( $attributes as $attribute ) {
                $attribute_label_name = '<strong>'.wc_attribute_label( $attribute->get_name() ).':</strong> ';

                $values = array();

                if ( $attribute->is_taxonomy() ) {
                    $attribute_taxonomy = $attribute->get_taxonomy_object();
                    $attribute_values = wc_get_product_terms( $product->get_id(), $attribute->get_name(), array( 'fields' => 'all' ) );

                    foreach ( $attribute_values as $attribute_value ) {
                        $value_name = esc_html( $attribute_value->name );

                        if ( $attribute_taxonomy->attribute_public ) {
                            $values[] = '<a href="' . esc_url( get_term_link( $attribute_value->term_id, $attribute->get_name() ) ) . '" rel="tag">' . $value_name . '</a>';
                        } else {
                            $values[] = $value_name;
                        }
                    }
                } else {
                    $values = $attribute->get_options();

                    foreach ( $values as &$value ) {
                        $value = make_clickable( esc_html( $value ) );
                    }
                }
                echo '<div class="'.$attribute->get_name().'">' . $attribute_label_name . implode( ', ', $values ) . '</div>';
            }
        }
        return ob_get_clean();
    }
}

Этот код находится в файле function.php вашей активной дочерней темы (или активной темы).Проверено и работает

0 голосов
/ 18 марта 2019

Этого можно добиться, вызвав хук woocommerce внутри функции шорткода. Но он вызовет все функции, подключенные внутри 'woocommerce_after_shop_loop_item'.

Я не уверен в вашем сценарии. Но лучшим способом является вызов хука напрямую без вызова шорткода.

add_shortcode( 'your-shortcode', 'shortcode-fn' );

function shortcode-fn($atts){
 ob_start();
        do_action('woocommerce_after_shop_loop_item');
    ob_end_clean();


}

add_action( 'woocommerce_after_shop_loop_item', 'show_product_dimensions_loop', 100 );

function show_product_dimensions_loop() {
    global $product;

    $dimensions = $product->get_dimensions();

    if ( ! empty( $dimensions ) ) {
        echo '<div class="dimensions"><b>Height:</b> ' . $product->get_height() . get_option( 'woocommerce_dimension_unit' );
        echo '<br><b>Width:</b> ' . $product->get_width() . get_option( 'woocommerce_dimension_unit' );
        echo '<br><b>Length:</b> ' . $product->get_length() . get_option( 'woocommerce_dimension_unit' );
        echo '</div>';
    }
}

Я не проверял Кодекс. Поэтому постарайтесь получить эту идею и сделать свои твики.

...