Отображать на складе доступные варианты в кратком описании одного продукта WooCommerce

#php #wordpress #woocommerce #attributes #product-variations

#php #wordpress #woocommerce #атрибуты #варианты продукта

Вопрос:

У меня есть различные продукты со многими вариациями, где на самом деле есть только несколько позиций, в то время как большинство других вариантов «доступны по предварительному заказу»

Я хотел бы иметь возможность отображать краткий список ТОЛЬКО тех товаров, которые есть на складе, в кратком описании продукта на каждой странице продукта, чтобы клиенту не приходилось пробовать все варианты один за другим, чтобы окончательно выяснить, какие из них есть на складе.

Я искал плагины или код, которые могут это сделать, но ничего не нашел.

Самый близкий код, который я нашел, это:

 add_action( 'woocommerce_after_shop_loop_item', 'bb_echo_stock_variations_loop' );
function bb_echo_stock_variations_loop(){
    global $product;

    if ( $product->get_type() == 'variable' ) {
        foreach ( $product->get_available_variations() as $key ) {
            $attr_string = array();

            foreach ( $key['attributes'] as $attr_name => $attr_value ) {
                $attr_string[] = $attr_value;
            }

            if ( $key['max_qty'] > 0 ) { 
              echo '<br/>' . implode( ', ', $attr_string ) . ': ' . $key['max_qty'] . ' in stock'; 
            } else { 
              echo '<br/>' . implode(', ', $attr_string ) . ': out of stock'; 
            }
        }
    }
}
  

Но он отображает доступные варианты «На складе» на странице МАГАЗИНА, и я хочу, чтобы это отображалось в кратком описании одного продукта.

Как я могу отобразить доступные варианты «На складе» в кратком описании одного продукта?

Ответ №1:

Чтобы отобразить список имеющихся на складе вариантов на отдельных страницах продукта в разделе краткое описание, используйте следующее:

 add_filter( 'woocommerce_short_description', 'display_in_stock_variations_to_short_description' );
function display_in_stock_variations_to_short_description( $excerpt ){
    global $product;

    if ( ! is_product() || empty($product) || ! is_a( $product, 'WC_Product' ) ) 
        return $excerpt;

    if( $product->is_type('variable') ) {
        // Loop through visible children
        foreach( $product->get_children() as $variation_id ) {
            $variation = wc_get_product( $variation_id );

            // Hide out of stock variations if 'Hide out of stock items from the catalog' is checked.
            if ( ! $variation || ! $variation->exists() || ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) amp;amp; ! $variation->is_in_stock() ) ) {
                continue;
            }

            // Filter 'woocommerce_hide_invisible_variations' to optionally hide invisible variations (disabled variations and variations with empty price).
            if ( apply_filters( 'woocommerce_hide_invisible_variations', true, $product->get_id(), $variation ) amp;amp; ! $variation->variation_is_visible() ) {
                continue;
            }

            $max_qty    = 0 < $variation->get_max_purchase_quantity() ? $variation->get_max_purchase_quantity() : $variation->get_stock_quantity();
            $term_names = []; // Initializing

            // Loop through variation attributes for current varation
            foreach ( $variation->get_variation_attributes() as $attribute => $term_slug ) {
                // Set the term name in an array
                $term_names[] = ucfirst( str_replace( ['-', '_'],[' ', ' '], $term_slug ) );
            }

            if ( $max_qty > 0 ) {
                $excerpt .= sprintf( '<br/>%s: %s %s',
                    implode(', ', $term_names),
                    $max_qty,
                    __('in stock', 'woocommerce')
                );
            }
        }
    }
    return $excerpt;
}


// Avoid additional content from product short description to be displayed in variation description
add_filter( 'woocommerce_available_variation', 'filter_wc_available_variation_desscription', 10, 3);
function filter_wc_available_variation_desscription( $data, $product, $variation ) {
    $max_qty    = 0 < $variation->get_max_purchase_quantity() ? $variation->get_max_purchase_quantity() : $variation->get_stock_quantity();
    
    if( $max_qty > 0 )
        $data['variation_description'] = get_post_meta( $variation->get_id(), '_variation_description', true );

    return $data;
}
  

Код отправляется в functions.php файл вашей активной дочерней темы (или active theme). Протестировано и работает.

Комментарии:

1. Большое спасибо за публикацию этого кода. К сожалению, после вставки этого кода в краткие описания моего переменного продукта ничего нового не отображается functions.php и очистка всех моих кэшей.

2. Привет, Лоик, спасибо за обновление. Это частично работает, я не вижу вариантов перед «: 1 в наличии», поэтому в основном перед «:» не отображаются переменные

3. Работал отлично, но сломал мою страницу оформления заказа из-за неустранимой ошибки, указывающей на эту строку вашего кода: if($product->is_type(‘variable’)) {

4. @ChristianBulotaKiteBud обновлен, попробуйте еще раз.

5. Информация о наличии на складе отображается дважды: один раз в кратком описании продукта (как мы и хотели), а также снова под выпадающими списками вариантов / над ценой. Я полагаю, что это описание woocommerce-variation-description. есть ли какой-нибудь простой способ скрыть это, чтобы оно не отображалось дважды на одной странице продукта? Спасибо!