Почему шорткод заказа WooCommerce генерирует уведомление о плагине на пользовательской странице благодарности?

#php #woocommerce #shortcode

#php #woocommerce #Шорткод

Вопрос:

Я создал перенаправление на пользовательскую страницу «Спасибо» ( order-received ) в WooCommerce, используя мою дочернюю тему и functions.php .

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

При вставке моего [order_cost_breakdown] шорткода с использованием Gutenberg на моей Thanks странице и при оформлении заказа я получаю это уведомление:

 Notice: Undefined variable: show_purchase_note in /wp-content/plugins/woocommerce/templates/order/order-details-item.php on line 60
 

Я не уверен, что мне нужно отредактировать в этом шаблоне, чтобы это работало, или что мне нужно изменить в моей функции шорткода, чтобы это работало.

Это функция шорткода:

 function order_cost_breakdown(){

    if ( isset( $_GET['order_id']) amp;amp; $_GET['order_id'] > 0 ) {

        $order_id = (int) esc_attr( $_GET['order_id'] );

        $order = wc_get_order( $order_id );

        $order_data = $order->get_data();

    ob_start();
    
    ?>

        <div class="woocommerce-account woocommerce-page"><div class="woocommerce">

            <table class="shop_table order_details">

                <thead>

                    <tr>
                        <th class="product-name"><?php _e( 'Product', 'woocommerce' ); ?></th>
                        <th class="product-total"><?php _e( 'Total', 'woocommerce' ); ?></th>

                    </tr>

                </thead>

            <tbody>

        <?php foreach ( $order->get_items() as $item_id => $item ) {

        wc_get_template( 'order/order-details-item.php', array (

            'order' => $order,
            'item_id' => $item_id,
            'item' => $item,
            'product' => apply_filters( 'woocommerce_order_item_product', $item->get_product( $item ), $item ) ) );
        }
    ?>

    <?php do_action( 'woocommerce_order_items_table', $order ); ?>

            </tbody>
        
        <tfoot>

    <?php

        foreach ( $order->get_order_item_totals() as $key => $total ){
    ?>

    <tr>
    
        <th scope="row"><?php echo $total['label']; ?></th>
        <td><?php echo $total['value']; ?></td>
    </tr>

        <?php
    }

    ?>
            </tfoot>
    
        </table>
    
    </div>

</div>

<?php

    return ob_get_clean();
    
    }

}
 

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

Ответ №1:

Как видно из исходного кода woocommerce: https://github.com/woocommerce/woocommerce/blob/00e38b51ef9276f0063d9df7796f19b92ca3ff76/templates/order/order-details.php , существует этот уровень заказа $show_purchase_note , который передается в каждое представление товара в цикле прогнозирования. Это определяет, должны ли отображаться заметки о покупке на уровне продукта (если таковые имеются) или нет. Вы должны сделать то же самое:

Определите его значение:

 $show_purchase_note    = $order->has_status( apply_filters( 'woocommerce_purchase_note_order_statuses', array( 'completed', 'processing' ) ) );
 

И отправляйте его в каждое представление элемента в цикле вместе со значением заметки о покупке продукта (обратите внимание на последние два аргумента шаблона):

 
wc_get_template( 'order/order-details-item.php', array (
            'order' => $order,
            'item_id' => $item_id,
            'item' => $item,
            'product' => apply_filters( 'woocommerce_order_item_product', $item->get_product( $item ), $item ),
            'show_purchase_note' => $show_purchase_note,
            'purchase_note'      => $product ? $product->get_purchase_note() : '',
));
 

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

1. К сожалению, это не сработало, поскольку оно просто выдает уведомление для каждого продукта в заказе.

2. Он выдает уведомление о том, что этот продукт не определен.

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