上次WooCommerce更新后,订单详细信息不再显示在Thank You页面上。从那时起,我使用WooCommerce Storefront主题开发了一个子主题。无论我做了什么,我看到的都是感谢页面上的"谢谢"信息。
我已经试过了:
- 对整个过程进行故障排除,以发现任何可能出错的地方。这包括以下内容:
- 检查wc模板函数是否调用order-details模板及其相关的动作钩子(两者都存在)
- 确保我的子主题的WooCommerce目录结构正确。其他一切都正常工作,包括我的自定义模板片段和它们的钩子。
- 仔细注意语法错误,包括那些可能静默失败的语法错误。
- 将WooCommerce目录从插件复制到子主题。这产生了相同的结果——感谢页面上没有订单细节。
- 取消WordPress感谢页面,使用默认的WooCommerce端点('order-received')。注意:由于这种方式影响布局和显示,我恢复到我原来的WooCommerce目录结构,这是相同的WooCommerce模板目录,减去一些子目录。(更新:我实际上仍然使用复制的WooCommerce目录)
- 在子主题的functions.php文件中编写了一个带有action hook的自定义函数,输出没有变化。
- 在thankyou.php中,创建了一个动作钩子,并编写了一个函数,使用wc_get_template调用order-details,但是它不起作用(无声失败)
-
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插件调用旧版本的jquery (v1.11.3),而Spider Player调用旧版本的jQueryUI。停用两个插件,仍然是相同的结果。这就好像WooCommerce只是忽略了thank .php模板中间的订单细节。
有什么想法吗?我现在真的很茫然。我可以修复禁用插件中的jquery问题,但这并不能解决我在感谢页面上的紧迫问题。
任何帮助都将是非常感激的:)
更新:经过更多的工作,我已经确定WooCommerce使用的是子主题thank .php。进一步的故障排除还显示$order为false。这就是为什么我没有在感谢页面上看到订单细节的原因。下一个:计算为什么$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
我认为罪魁祸首可能是在stacktrace #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设置中提供关闭选项。
问题是客户未登录,order/order-details.php
中的$show_customer_details
设置为false
我修改了order-details.php的主题副本中的客户检查,以检查订单键(post密码)是否与作为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());