Тема WooCommerce Storefront: как показать детали заказа на полученной конечной точке заказа?

После последнего обновления WooCommerce детали заказа больше не отображаются на странице «Спасибо». С тех пор я разработал дочернюю тему, используя тему WooCommerce Storefront. Независимо от того, что я попробовал, все, что я вижу, — это сообщение «спасибо» на странице благодарности.

Что я уже пробовал:

  • Устранение неполадок всего процесса, чтобы найти все, что может быть не так.
    Это включало следующее:
  • Проверено на наличие функции шаблона wc, которая вызывает шаблон деталей заказа и связанный с ним хук действия (оба существуют)
  • Убедитесь, что каталог моей дочерней темы WooCommerce был правильно структурирован. Все остальное работает правильно, включая мои собственные фрагменты шаблонов и их хуки.
  • Обращайте особое внимание на синтаксические ошибки, в том числе те, которые могут молча завершаться сбоем
  • Скопировал каталог WooCommerce из плагина в дочернюю тему. Это дало тот же самый точный результат — нет деталей заказа на странице благодарности.
  • Удалена страница с благодарностью WordPress и используется конечная точка WooCommerce по умолчанию («заказ получен»). ПРИМЕЧАНИЕ. Из-за того, как это повлияло на макет и отображение, я вернулся к своей исходной структуре каталогов WooCommerce, которая идентична шаблонной директории WooCommerce, за исключением некоторых подкаталогов. (ОБНОВЛЕНИЕ: я фактически все еще использую скопированный каталог WooCommerce)
  • Написал пользовательскую функцию с хуком действия в файле functions.php дочерней темы, без изменений в выводе.
  • В thankyou.php создали ловушку действия и написали функцию, которая использовала wc_get_template для вызова деталей заказа, но это не сработало (тихий сбой)
  • Обновил WordPress с 4.5 до 4.6.1, обновил тему Storefront и обновил все устаревшие файлы шаблонов WooCommerce в моей дочерней теме.

    Code:
    **storefront-child/woocommerce/wc-template-functions.php**
    
    if ( ! function_exists( 'woocommerce_order_details_table' ) ) {
    
    /**
    * Displays order details in a table.
    *
    * @param mixed $order_id
    * @subpackage  Orders
    */
    function woocommerce_order_details_table( $order_id ) {
    if ( ! $order_id ) return;
    
    wc_get_template( 'order/order-details.php', array(
    'order_id' => $order_id
    ) );
    }
    }**storefront-child/woocommerce/wc-template-hooks.php
    
    /**
    * Order details.
    *
    * @see woocommerce_order_details_table()
    * @see woocommerce_order_again_button()
    */
    add_action( 'woocommerce_view_order', 'woocommerce_order_details_table', 10 );
    add_action( 'woocommerce_thankyou', 'woocommerce_order_details_table', 10 );
    add_action( 'woocommerce_order_details_after_order_table', 'woocommerce_order_again_button' );**storefront-child/woocommerce/checkout/thankyou.php**
    
    if ( ! defined( 'ABSPATH' ) ) {
    exit;
    }
    
    if ( $order ) : ?>
    
    <?php if ( $order->has_status( 'failed' ) ) : ?>
    
    <p class="woocommerce-thankyou-order-failed"><?php _e( 'Unfortunately your order cannot be processed as the originating bank/merchant has declined your transaction. Please attempt your purchase again.', 'woocommerce' ); ?></p>
    
    <p class="woocommerce-thankyou-order-failed-actions">
    <a href="<?php echo esc_url( $order->get_checkout_payment_url() ); ?>" class="button pay"><?php _e( 'Pay', 'woocommerce' ) ?></a>
    <?php if ( is_user_logged_in() ) : ?>
    <a href="<?php echo esc_url( wc_get_page_permalink( 'myaccount' ) ); ?>" class="button pay"><?php _e( 'My Account', 'woocommerce' ); ?></a>
    <?php endif; ?>
    </p>
    
    <?php else : ?>
    
    <p class="woocommerce-thankyou-order-received"><?php echo apply_filters( 'woocommerce_thankyou_order_received_text', __( 'Thank you. Your order has been received.', 'woocommerce' ), $order ); ?></p>
    
    <ul class="woocommerce-thankyou-order-details order_details">
    <li class="order">
    <?php _e( 'Order Number:', 'woocommerce' ); ?>
    <strong><?php echo $order->get_order_number(); ?></strong>
    </li>
    <li class="date">
    <?php _e( 'Date:', 'woocommerce' ); ?>
    <strong><?php echo date_i18n( get_option( 'date_format' ), strtotime( $order->order_date ) ); ?></strong>
    </li>
    <li class="total">
    <?php _e( 'Total:', 'woocommerce' ); ?>
    <strong><?php echo $order->get_formatted_order_total(); ?></strong>
    </li>
    <?php if ( $order->payment_method_title ) : ?>
    <li class="method">
    <?php _e( 'Payment Method:', 'woocommerce' ); ?>
    <strong><?php echo $order->payment_method_title; ?></strong>
    </li>
    <?php endif; ?>
    </ul>
    <div class="clear"></div>
    
    <?php endif; ?>
    
    <?php do_action( 'woocommerce_thankyou_' . $order->payment_method, $order->id ); ?>
    <?php do_action( 'woocommerce_thankyou', $order->id ); ?>
    
    <p class="woocommerce-thankyou-order-received"><?php echo apply_filters( 'woocommerce_thankyou_order_received_text', __( 'Thank you. Your order has been received.', 'woocommerce' ), null ); ?></p>
    
    <?php endif;
    
    ?>**storefront-child/woocommerce/order/order-details.php**
    
    if ( ! defined( 'ABSPATH' ) ) {
    exit;
    }
    
    $order = wc_get_order( $order_id );
    
    $show_purchase_note    = $order->has_status( apply_filters( 'woocommerce_purchase_note_order_statuses', array( 'completed', 'processing' ) ) );
    $show_customer_details = is_user_logged_in() && $order->get_user_id() === get_current_user_id();
    ?>
    <h2><?php _e( 'Order Details', 'woocommerce' ); ?></h2>
    <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 ) {
    $product = apply_filters( 'woocommerce_order_item_product', $order->get_product_from_item( $item ), $item );
    
    wc_get_template( 'order/order-details-item.php', array(
    'order'              => $order,
    'item_id'            => $item_id,
    'item'               => $item,
    'show_purchase_note' => $show_purchase_note,
    'purchase_note'      => $product ? get_post_meta( $product->id, '_purchase_note', true ) : '',
    'product'            => $product,
    ) );
    }
    ?>
    <?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>
    

    <?php if ( $show_customer_details ) : ?>
    <?php wc_get_template( 'order/order-details-customer.php',    array( 'order' =>  $order ) ); ?>
    <?php endif; ?>**Rendered HTML**
    <div class="entry-content">
    <div class="mailmunch-forms-before-post" style="display: none !important;"></div>
    <div class="woocommerce">
    <p class="woocommerce-thankyou-order-received">Thank you. Your order has been received.</p>
    </div>
    
    <!-- This is where the order details should be -->
    
    <p>&nbsp;</p>
    
    <div class="mailmunch-forms-in-post-middle" style="display: none !important;"></div>
    <div class="mailmunch-forms-after-post" style="display: none !important;"></div>
    
    </div>
    

Я что-то здесь упускаю или что-то происходит с WooCommerce? Любая помощь будет принята с благодарностью 🙂

ОБНОВЛЕНИЕ: Обнаружено, что у меня работают две версии jQuery: v1.11.3 и v1.12.4. Также есть две разные версии загрузки jQueryUI: v1.10.4 и v1.11.4. В настоящее время отключаем плагины WordPress и отмечаем, какие версии jquery загружаются в браузере.

ОБНОВЛЕНИЕ: Найден один плагин с использованием jQueryUI v1.10.4. Все еще ищу других.

ОБНОВЛЕНИЕ: Закончена двойная съемка всех плагинов, кроме WooCommerce (WSOD). MailChimp Плагин MailMunch выполнял вызов Google API для более старой версии jquery (v1.11.3), в то время как Spider Player вызывал старую версию jQueryUI. Деактивировали оба плагина, и ЕЩЕ ОДНО результат.
Как будто WooCommerce просто игнорирует детали заказа в середине шаблона thankyou.php.

Есть мысли или идеи? Я действительно в растерянности сейчас. Я могу исправить проблемы jquery в отключенных плагинах, но это не решит мою насущную проблему со страницей Спасибо.

Любая помощь будет принята с благодарностью 🙂

ОБНОВЛЕНИЕ: После очень большой работы я определил, что WooCommerce IS использует дочернюю тему thankyou.php. Дальнейшее устранение неполадок также показало, что $ order ложный. Вот почему я не вижу деталей заказа на странице благодарности. Далее: рисунок, почему $ order равен false (это экземпляр WC_Order).

UPDATE: I did a stacktrace:

#0 /home/onyour6test/www/wp-content/plugins/woocommerce/includes/wc-core-functions.php(203): include()

#1 /home/onyour6test/www/wp-content/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-checkout.php(212): wc_get_template('checkout/thanky...', Array)

#2 /home/onyour6test/www/wp-content/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-checkout.php(59): WC_Shortcode_Checkout::order_received(NULL)

#3 /home/onyour6test/www/wp-content/plugins/woocommerce/includes/class-wc-shortcodes.php(71): WC_Shortcode_Checkout::output('')

#4 /home/onyour6test/www/wp-content/plugins/woocommerce/includes/class-wc-shortcodes.php(138): WC_Shortcodes::shortcode_wrapper(Array, '')

#5 /home/onyour6test/www/wp-includes/shortcodes.php(326): WC_Shortcodes::checkout('', '', 'woocommerce_che...')

#6 [internal function]: do_shortcode_tag(Arr in /home/onyour6test/www/wp-content/themes/storefront-child/woocommerce/checkout/thankyou.php on line 77

Я думаю, что виновник может быть в следе # 2 стека: … WC_Shortcode_Checkout :: order_received (NULL).

Stacktrace # 6, кажется, подтверждает это, с do_shortcode_tag. Строка 77 относится к тому, где происходит сбой вызова $ order, в частности, здесь:

<strong><? php _e( 'Order Number:', 'woocommerce' ); ?></strong>

Мне удалось получить эту конкретную строку кода для отображения, но она показала только «Порядок» в «Номер заказа», после чего произошла внутренняя ошибка сервера 500. Ни одна из оставшихся переменных HTML или порядка детализации, отображаемых на странице.

ОБНОВЛЕНИЕ: Это, кажется, что-то с самим кодом WooCommerce. $ order_id пуст, в результате чего $ order возвращает NULL. Это предотвращает отображение деталей заказа. Это должно отображаться по умолчанию, с возможностью отключить его в настройках WooCommerce.

0

Решение

Проблема в $show_customer_details в order/order-details.php установлен в false если клиент не залогинен.

Я изменил проверку клиента в своей копии темы order-details.php, чтобы также проверить, соответствует ли ключ заказа (почтовый пароль) ключу, указанному в качестве параметра URL. Это та же самая проверка, которую выполняет WooCommerce при разработке, если все в порядке, чтобы показать информацию о заказе на странице благодарности:

$order_key             = apply_filters( 'woocommerce_thankyou_order_key', empty( $_GET['key'] ) ? '' : wc_clean( $_GET['key'] ) );
$show_customer_details = $order_key == $order->get_order_key() || (is_user_logged_in() && $order->get_user_id() === get_current_user_id());

Это не красиво, но это работает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]