После последнего обновления WooCommerce детали заказа больше не отображаются на странице «Спасибо». С тех пор я разработал дочернюю тему, используя тему WooCommerce Storefront. Независимо от того, что я попробовал, все, что я вижу, — это сообщение «спасибо» на странице благодарности.
Что я уже пробовал:
Обновил 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> </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.
Проблема в $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());
Это не красиво, но это работает.
Других решений пока нет …