2016-09-08 2 views
0

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

То, что я пытался до сих пор:

  • Устранение весь процесс, чтобы найти что-нибудь, что может быть не так. Это включало следующее:
  • Проверен на туалет шаблонной функции, которая вызывает шаблон Порядково детали и его связанный крючок действия (как есть)
  • Удостоверяясь каталог WooCommerce моего ребенка тематического был правильно структурирован. Все остальное работает правильно, включая мои пользовательские фрагменты шаблона и их крючки.
  • Обращаем особое внимание на синтаксические ошибки, в том числе те, которые могут бесшумно терпеть неудачу.
  • Скопировал каталог WooCommerce из плагина в дочернюю тему. Это дало тот же точный результат - никаких деталей заказа на странице благодарности.
  • Удалена страница WordPress Thank you и используется конечная точка WooCommerce по умолчанию ('order-received'). ПРИМЕЧАНИЕ. Из-за того, как это повлияло на макет и отображение, я вернулся к своей исходной структуре каталога WooCommerce, которая идентична каталогу шаблона WooCommerce, за вычетом некоторых подкаталогов. (UPDATE: Я на самом деле все еще использую скопированный каталог WooCommerce)
  • Написал пользовательскую функцию с помощью action hook в файле 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? Любая помощь будет принята с благодарностью :)

UPDATE: У меня две версии 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 go для старой версии jQuery (v1.11.3), в то время как Spider Player вызывал более старую версию jQueryUI. Деактивирует оба плагина, а STILL - тот же результат. Как будто WooCommerce просто игнорирует детали заказа в середине шаблона thankyou.php.

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

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

UPDATE: После того, как много больше работы, я определил, что WooCommerce использует ребенка темы thankyou.php. Дальнейшее устранение неполадок также показало, что $ order false. Вот почему я не вижу детали заказа на странице благодарности. Далее: Рисунок, почему $ order является ложным (это экземпляр 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 

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

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

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

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

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

+0

Если вы отключили шаблон, дисплей работает правильно? Вы можете временно отключить шаблоны, включив режим отладки шаблона в настройках WooCommerce. Если это так, вам нужно обновить свои шаблоны в соответствии с новыми основными шаблонами и заново создать свои изменения. – helgatheviking

+0

Я пробовал это только с родительской темой, с тем же результатом. Даже тема Twentysixteen сделала то же самое. Однако я снова попробую родительскую тему, так как вчера я обновил все, включая устаревшие шаблоны woocommerce для дочерней темы. –

+0

UPDATE: переключился на родительскую тему (Storefront) и получил тот же результат - спасибо сообщение, но никаких деталей заказа. –

ответ

0

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

Я изменил проверку клиента в моей теме копию заказа-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()); 

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

Смежные вопросы