Сохранять и отображать значение настраиваемого поля продукта на страницах заказа администратора WooCommerce

Я создал код для отображения наличия на складе >> заказов woocommerce. см. картинки (специальные пометки).

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

Например: один клиент подтвердил заказ на продукт в январе 2021 года, в котором текст настраиваемого поля был «Продукт будет доступен в марте 2021 года». Второй клиент подтвердил тот же заказ продукта в марте 2021 года, в котором новый текст настраиваемого поля - «Продукт будет доступен в мае 2021 года».

В обоих заказах отображается текст последнего настраиваемого поля «Продукт будет доступен в мае 2021 года».

Я хочу отобразить старый порядок со старым текстом настраиваемого поля и новый порядок с новым текстом настраиваемого поля. Если кто-то может решить эту проблему или дать мне какое-то представление, это поможет мне полностью.

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_order_data_in_admin' );
function display_order_data_in_admin( $order ){
    ?>
    <h4><?php _e( 'Speciellnotering', 'woocommerce' ); ?></h4>
    <?php

    foreach ( $order->get_items() as $item_id => $item ) {
        //fetch text from custom_field
        $product = $item->get_product();
        $availability = $product->get_availability();
        $quantity = $item->get_quantity();

        $product_id = $item->get_product_id();
        $variation_id = $item->get_variation_id();
        $sku = get_post_meta( $variation_id, '_sku', true );
        $custom_text_message = get_post_meta( $variation_id, 'custom_field', true );

        if ($product->is_type('variable')){
            if ($custom_text_message && $quantity<=-1){
                $availability['availability'] = $custom_text_message;
            }elseif (!$custom_text_message && $quantity<=-1){
                $availability['availability'] = __('Right now is not available', 'woocommerce');
            }else{
                $availability['availability'] =__('Finns i lager', 'woocommerce');
            }
            ?>
            <?php  echo __( 'Artnr' ).' ('.$sku.')' .': '.$availability['availability'].'<br>';

        //for simple product
        }else{
            $product = $item->get_product();
            $sku=$product->get_sku();
            $availability = $product->get_availability();
            $custom_stock_message=get_post_meta( $product_id, 'custom_stock_message', true );
            $quantity = $item->get_quantity();

            if ($product->is_type('simple')){
                if ($custom_stock_message && $quantity<=0){
                    $availability['availability'] = $custom_stock_message;
                }elseif (!$custom_stock_message && $quantity<=0){
                    $availability['availability'] = __('Right now is not available', 'woocommerce');
                }else{
                    $availability['availability'] =__('Finns i lager', 'woocommerce');
                }
            }
            ?>
            <?php echo __( 'Artnr' ).' ('.$sku.')' .': '.$availability['availability'].'<br>';
        }
    }?>
    <?php
}

Сохранять и отображать значение настраиваемого поля продукта на страницах заказа администратора WooCommerce

Вы сохраняете этот пользовательский текст на продукте или вариации продукта, так что же тогда произошло с ожидать? Если вы хотите что-то конкретное для определенного элемента в определенном порядке - тогда сохраните это на для этого элемента.

CBroe 30.03.2021 16:17

как я могу сохранить собственный текст на продукте или в конкретном элементе? Можете ли вы написать образец кода, тогда мне будет легко понять.

Eyahya Khan 30.03.2021 16:45

В вашем коде вы используете $quantity = $item->get_quantity();, значение которого всегда равно до 1 (больше нуля), поэтому $quantity<=-1 или $quantity<=0 всегда будут ложными ... Это означает, что в ваших операторах IF / ELSE вы всегда будете попадать в часть ELSE.

LoicTheAztec 30.03.2021 17:23

Привет, LoicTheAztec, проблема не в логике if else .... логика работает хорошо и дает ожидаемый результат. Но уже описанная проблема заключается в том, что я при необходимости меняю текст настраиваемого поля, и это влияет на все (новые + старые) заказы.

Eyahya Khan 30.03.2021 17:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
46
1

Ответы 1

Обновлено

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

Я упростил и оптимизировал ваш исходный код. Также значение $item->get_quantity() всегда больше нуля. Поэтому в приведенном ниже коде вместо этого я использую количество товара на складе:

// Save product custom availiability text as custom hidden order item meta data
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_image_id_to_order_item', 10, 4 );
function save_custom_image_id_to_order_item( $item, $cart_item_key, $values, $order ) {
    $product = $item->get_product();

    // Product variation type
    if ( $item->get_variation_id() > 0 ) {
        $availability = $product->get_meta('custom_field');
    }
    // Other product types
    else {
        $availability = $product->get_meta('custom_stock_message');
    }

    if ( empty($availability) ) {
        // save as hidden order item meta data
        $item->update_meta_data('_availability', array($availability) );
    }
}

// Display order item availability in admin orders
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_order_item_availability_in_admin_orders' );
function display_order_item_availability_in_admin_orders( $order ){
    echo '<h4>' . __( 'Speciellnotering', 'woocommerce' ) . '</h4>';

    foreach ( $order->get_items() as $item ) {
        $product      = $item->get_product();
        $quantity     = $item->get_quantity();

        $stock_qty    = $product->get_stock_quantity();
        $sku          = $product->get_sku();

        $availability = $item->get_meta('_availability'); // Get order item custom field
        $availability = reset($availability); // Convert array to string

        if ( $stock_qty < 0 ) {
            if ( empty($availability) ) {
                $availability = __('Inte tillgänglig just nu', 'woocommerce');
            }
        } else {
            $availability = __('Finns i lager', 'woocommerce');
        }
        echo __('Artnr', 'woocommerce') . ' (' . $sku . ')' . ': ' . $availability . '<br>';
    }
}

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

Спасибо LoicTheAztec, но я изменяю настраиваемое поле / настраиваемое сообщение о запасе, а затем все равно показываю новый текст со всем порядком. У меня нет проблем с условиями «Inte tillgänglig just nu» и «Finns i lager». У меня проблема с настраиваемым полем (переменный товар) и настраиваемым сообщением о наличии товара (простой товар). Я всегда изменяю эти 2 поля в соответствии с информацией поставщиков. когда я изменяю текст в марте 2021 года, это влияет на все заказы, сделанные до марта. Я хочу, чтобы измененный текст повлиял на все заказы, которые будут сделаны после марта, и все заказы, сделанные до марта, останутся без изменений. заранее спасибо

Eyahya Khan 31.03.2021 12:42

@EyahyaKhan В моей второй функции произошла ошибка: неправильный $availability = $product->get_meta('_availability'); был заменен правильным $availability = $item->get_meta('_availability'); ... Теперь мой код - это просто пример, основанный на вашем коде вопроса, который показывает вам правильный способ сохранить значения настраиваемых полей вашего продукта в качестве метаданных элемента настраиваемого заказа. , и использовать это значение в функции, которая отображает текст «Artnr» на страницах с одним порядком. Если этот ответ отвечает на ваш первоначальный вопрос, пожалуйста, ответьте принимать, Спасибо.

LoicTheAztec 31.03.2021 14:11

Другие вопросы по теме