在上次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插件正在对旧的jquery版本(v1.11.3)进行google api调用,而Spider Player正在调用旧版本的jQueryUI。取消激活两个插件,并获得相同的结果。 好像WooCommerce只是忽略了thankyou.php模板中间的订单细节。
任何想法或想法?我现在真的很茫然。我可以在已禁用的插件中修复jquery问题,但这不会解决我在感谢您页面上的紧迫问题。
任何帮助都将非常感谢:)
更新:经过更多的工作后,我确定WooCommerce使用的是子主题thankyou.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
我认为罪魁祸首可能在堆栈跟踪#2中:... WC_Shortcode_Checkout :: order_received(NULL)。
Stacktrace#6似乎用 do_shortcode_tag 确认了这一点。第77行指的是对$ order的调用失败的地方,具体在这里:
<strong><? php _e( 'Order Number:', 'woocommerce' ); ?></strong>
我设法显示了这一特定的代码行,但它只显示了&#34; Order&#34;在&#34;订单号&#34;,然后是500内部服务器错误。其余的HTML或订单详细信息变量都不在页面上呈现。
更新:这似乎与WooCommerce代码本身有关。 $ order_id为空,导致$ order返回NULL。这可以防止显示订单详细信息。这应该默认显示,并提供在WooCommerce设置中关闭它的选项。
答案 0 :(得分: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());
它不漂亮但它有效。