Динамическое настраиваемое отображение на основе данных об изменениях продуктов Woocommerce

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

Пока я получил это:

function load_variation_settings_fields( $variation_data, $product, $variation ) {

    // Display shipping delay text when stock quantity exist
    if( $variation->get_stock_quantity() > 0 )
        $variation_data['text_field'] = __('<p class="stock in-stock">Stock: <span>På lager</span><br>Delivery: <span>2-12 hverdage</span></p>'); 
    else $variation_data['text_field'] = __('<p class="stock in-stock">Stock: <span>Out of stock</span><br>Delivery: <span>4-6 weeks</span></p>');

    return $variation_data;
}

Он работает и отображает сообщение в зависимости от количества каждого варианта, но мне нужно, чтобы это работало только для одного типа состояния запаса (пользовательского). Мне нужно отобразить другое сообщение для другого состояния запаса варианта. Вот что я попробовал:

function load_variation_settings_fields( $variation_data, $product, $variation ) {

    // Display shipping delay text when stock quantity exist
    if( $variation->get_stock_quantity() > 0 && ($stockstatus == 'customstatus'))
        $variation_data['text_field'] = __('<p class="stock in-stock">Stock: <span>In stock</span><br>Delivery: <span>2-12 days</span></p>'); 
    elseif ( ($stockstatus == 'customstatus') )
    $variation_data['text_field'] = __('<p class="stock in-stock">Stock: <span>Out of stock</span><br>Delivery: <span>4-6 weeks</span></p>');

    return $variation_data;
}

Это отображается вместе с этим в файле var.php:

<div class="woocommerce-variation-custom-text-field">{{{ data.variation.text_field }}}</div>

Любая помощь или указать в правильном направлении приветствуется.

РЕДАКТИРОВАТЬ: Это моя последняя попытка, так как мой пользовательский статус запаса хранится в мета-значении _stock_status. Все еще не работает, хотя

    function load_variation_settings_fields( $variation_data, $product, $variation ) {
    $stockstatus = $product->get_attribute( '_stock_status' );
if( ($stockstatus == 'bestillingsvare') ) {
        // Display shipping delay text when stock quantity exist
        if( $variation->get_stock_quantity() > 0 )
            $variation_data['text_field'] = __('<p class="stock in-stock">Stock: <span>På lager</span><br>Delivery: <span>2-12 hverdage</span></p>'); 
        else $variation_data['text_field'] = __('<p class="stock in-stock">Stock: <span>Out of stock</span><br>Delivery: <span>4-6 weeks</span></p>');
  }
        return $variation_data;
    }

2 ответа

Решение

Поскольку мы на самом деле не знаем, как установить свой пользовательский статус "bestillingsvare", воспроизвести проблему невозможно. В следующий раз это должно быть necessary добавить весь связанный код в ваш вопрос.

Итак, вот аналогичное рабочее решение с дополнительными пользовательскими настройками в вашем продукте, которое работает по-настоящему.

Во-первых, вам нужно добавить следующую строку в /single-product/add-to-cart/variation.php файл шаблона:

<div class="woocommerce-variation-delivery">{{{ data.variation.delivery_html }}}</div>

Затем вернемся к полному коду:

// Add variation custom checkbox setting option field
add_action( 'woocommerce_variation_options', 'add_variation_delivery_status_option', 20, 3 );
function add_variation_delivery_status_option ( $loop, $variation_data, $post_object ) {
    $checked = get_post_meta( $post_object->ID, '_delivery_option', true ) ? true : false;
    ?>
    <label class="tips" data-tip="<?php _e( 'Enable', 'woocommerce' ); ?>">
    <?php _e( 'Delivery?', 'woocommerce' ); ?>
        <input type="checkbox" class="checkbox variation_delivery_option" name="delivery_option_<?php
        echo $loop; ?>" <?php checked( $checked, true ); ?> />
    </label>
    <?php
}

// Save variation custom checkbox setting option field value
add_action( 'woocommerce_save_product_variation', 'save_variation_delivery_status_option', 20, 2 );
function save_variation_delivery_status_option( $variation_id, $i ) {
    $value = isset( $_POST['delivery_option_'.$i] ) ? true : false;
    update_post_meta( $variation_id, '_delivery_option', $value );
}

// Display in front end the delivery info
add_filter( 'woocommerce_available_variation', 'display_variation_delivery_status_option', 20, 3 );
function display_variation_delivery_status_option( $variation_data, $product, $variation ) {
    if( get_post_meta( $variation->get_id(), '_delivery_option', true ) ) {
        $stock_qty      = $variation->get_stock_quantity();

        $stock_class    = $stock_qty > 0 ? 'stock in-stock' : 'stock out-of-stock';
        $stock_label    = $stock_qty > 0 ? __('På lager') : __('Out of stock');
        $delivery_delay = $stock_qty > 0 ? __('2-12 hverdage') : __('4-6 weeks');

        // Display a shipping delay text when stock quantity exist
        $variation_data['delivery_html'] = sprintf(
            '<p class="%s">' . __('Stock') . ': <span>%s</span><br>
            ' . __('Delivery') . ': <span>%s</span></p>',
            $stock_class, $stock_label, $delivery_delay
        );
    }
    return $variation_data;
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Он должен работать.

В настройках варианта бэкэнда (включив опцию доставки):

Опция Front-end активируется, когда "В наличии":

Опция Front-end активируется, когда "Нет в наличии":

Но, как вы видите, чтобы избежать дублирования информации, вы можете использовать существующие availability_html изменить отображаемые данные, добавив в них информацию о доставке.

В этом случае вы не будете переопределять шаблон /single-product/add-to-cart/variation.php, так как он больше не нужен, и вы замените его в последней функции

$variation_data['delivery_html']

от

$variation_data['availability_html']

Внесение необходимых других изменений в код, чтобы получить желаемое отображение.

Вы можете получить код состояния лжи:

// Compatibility for WC versions from 2.5.x to 3.0+
if ( method_exists( $product, 'get_stock_status' ) ) {
     $stockstatus = $product->get_stock_status(); // For version 3.0+
} else {
     $stockstatus = $product->stock_status; // Older than version 3.0
}
Другие вопросы по тегам