Изменить текст «добавить в корзину», когда товара нет на складе в WooCommerce

#php #jquery #wordpress #woocommerce #stock

#php #jquery #wordpress #woocommerce #на складе

Вопрос:

В Woocommerce я пытаюсь изменить текст «Добавить в корзину» с «Добавить в корзину» на «Нет в наличии» на отдельных страницах продукта, когда товара нет в наличии, для простых продуктов и вариантов продукта для переменных продуктов.

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

Есть ли какой-либо возможный способ добиться этого?

Ответ №1:

Для всех продуктов, кроме переменных продуктов, довольно просто… Но для переменных продуктов и их вариаций требуется еще немного кода и использование javascript / jQuery.

Таким образом, следующий код изменит текст «добавить в корзину» на «Нет в наличии», когда текущего товара нет в наличии, даже для выбранных вариантов продукта на разных продуктах:

 // For all products except variable product
add_filter( 'woocommerce_product_single_add_to_cart_text', 'product_single_add_to_cart_text_filter_callback', 20, 2 );
function product_single_add_to_cart_text_filter_callback( $button_text, $product ) {
    if( ! $product->is_in_stock() amp;amp; ! $product->is_type('variable') ) {
        $button_text = __("Out of stock", "woocommerce");
    }
    return $button_text;
}

// For all product variations (on a variable product)
add_action( 'woocommerce_after_add_to_cart_button', 'after_add_to_cart_button_action_callback', 0 );
function after_add_to_cart_button_action_callback() {
    global $product;

    if( $product->is_type('variable') ) :

    $data = [];

    // Loop through variation Ids
    foreach( $product->get_visible_children() as $variation_id ){
        $variation = wc_get_product( $variation_id );
        $data[$variation_id] = $variation->is_in_stock();
    }

    $outofstock_text = __("Out of Stock", "woocommerce");
    ?>
    <script type="text/javascript">
    jQuery(function($){
        var b = 'button.single_add_to_cart_button',
            t = $(b).text();

        $('form.variations_form').on('show_variation hide_variation found_variation', function(){
            $.each(<?php echo json_encode($data); ?>, function(j, r){
                var i = $('input[name="variation_id"]').val();
                if(j == i amp;amp; i != 0 amp;amp; !r ) {
                    $(b).html('<?php echo $outofstock_text; ?>');
                    return false;
                } else {
                    $(b).html(t);
                }
            });
        });
    });
    </script>
    <?php
    endif;
}
  

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

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

1. Спасибо за код, но, похоже, он не работает для меня. Я вставил этот код в function.php Но кнопка «Добавить в корзину» выделена серым цветом, а текст не изменен. Я забыл упомянуть, что я использую пользовательские страницы товаров, созданные с помощью Elementor. Возможно, именно поэтому этот код не работает для меня

2. @AwaisAhmed Так что это не сработает для вас… Задавая вопрос, всегда указывайте все необходимые детали, чтобы никто не терял время и энергию. Я не использую Elementor и не собираюсь отвечать на пользовательскую страницу в теме Elementor.

Ответ №2:

Пытался написать как комментарий, но, похоже, форматирование кода не работает, поэтому пишу как ответ.

Для одного варианта добавления в корзину шорткода этот хак поможет.

 // For variation product
    add_filter( 'woocommerce_product_add_to_cart_text', 'product_variation_add_to_cart_text_filter_callback', 20, 2 );
    function product_variation_add_to_cart_text_filter_callback( $button_text, $product ) {
        if ( ! $product->is_in_stock() amp;amp; $product->is_type( 'variation' ) ) {
            $button_text = __( "Out of stock", "woocommerce" );
        }

        return $button_text;
    }