当前位置: 首页 > 知识库问答 >
问题:

WooCommerce店面主题:如何在订单接收endpoint上显示订单详细信息?

严恩
2023-03-14

上次WooCommerce更新后,订单详细信息不再显示在感谢页面上。从那时起,我使用WooCommerce Storefront主题开发了一个儿童主题。不管我做了什么,我看到的只是感谢页面上的“谢谢”信息。

到目前为止我所尝试的:

>

  • 对整个进程进行故障排除,以查找任何可能出错的问题。这包括以下内容:
  • 检查了调用order-details模板和it相关操作挂钩的wc模板函数(均存在)
  • 确保我的Child-Theme的WooCommerce目录结构正确。其他的一切都正常工作,包括我的自html" target="_blank">定义模板片段和它们的钩子。
  • 要仔细注意语法错误,包括那些可能以静默方式失败的语法错误。
  • 将WooCommerce目录从插件复制到子主题中。这产生了同样的结果--“谢谢”页面上没有订单详细信息。
  • 删除了WordPress感谢页面,并使用默认的WooCommerceendpoint(“Order-Received”)。注意:由于这种方式影响了布局和显示,我恢复到原始的WooCommerce目录结构,它与WooCommerce模板目录相同,减去了一些子目录。(更新:我实际上仍在使用复制的WooCommerce目录)
  • 在子主题的functions.php文件中编写了一个带有动作钩子的自定义函数,输出不变。
  • 在thankyou.php中,创建了一个操作钩子,并编写了一个使用wc_get_template调用订单详细信息的函数,但它不起作用(静默失败)
  • 将WordPress从4.5更新到4.6.1,更新了Storefront主题,并更新了my child主题中任何过时的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>
    

    null

    <?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>
    

    是我错过了什么,还是有什么东西在木业商业?如有任何帮助,我们将不胜感激:)

    更新:发现我有两个版本的jQuery正在运行:V1.11.3和V1.12.4。jQueryUI加载还有两个不同的版本:V1.10.4和V1.11.4。目前正在禁用WordPress插件,并注意浏览器中正在加载哪些jquery版本。

    更新:找到一个使用jQueryUI V1.10.4的插件。还在找其他人。

    更新:完成了所有插件的toubleshooting,除了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
    

    我认为罪魁祸首可能在stacktrace#2:..wc_shortcode_checkout::order_received(NULL)。

    Stacktrace#6似乎用do_shortcode_tag证实了这一点。第77行指的是调用$order失败的地方,特别是在这里:

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

    我设法使这一行代码显示出来,但它只显示了“订单号”中的“订单”,然后是500内部服务器错误。其余的HTML或order-detail变量都不会呈现在页面上。

    更新:这似乎与WooCommerce代码本身有关。$ORDER_ID为空,导致$ORDER返回NULL。这将阻止显示订单详细信息。默认情况下,这应该会显示,在WooCommerce设置中有一个关闭它的选项。

  • 共有1个答案

    隗轶
    2023-03-14

    问题是,如果客户未登录,则order/order-details.php中的$show_customer_details被设置为false

    我修改了order-details.php主题副本中的customer检查,以检查order键(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());
    

    它不漂亮但很管用。

     类似资料:
    • 我正在搜索和尝试它2天没有成功,请帮助。 我想筛选woocommerce订单,以便根据产品属性将其他详细信息从db添加到订单详细信息页面,但我找不到适合此任务的woocommerce操作/筛选器挂钩。这里假设变量; 如果,那么我需要将自定义数据从数据库添加到订单详细信息页面。 注意:我不想添加额外的元框,而是想更改订单明细表: 将默认产品映像替换为存储在数据库和中的映像, 在产品名称下面添加包含自

    • 问题内容: 在WooCommerce中,从以下代码行: 如何从订单ID获取WooCommerce订单详细信息? 问题答案: 3.0版以上的WOOCOMMERCE订单 自Woocommerce大型主要更新3.0+以来,事情已经发生了很多变化: 对于 对象,无法像以前一样直接访问属性,并且会引发一些错误。 现在,对象实例需要使用new 以及 getter和setter方法。 此外,还有一些用于订购商品

    • 我使用以下代码在WooCommerce管理订单详细信息页面的订单项表中显示自定义产品元: 它显示“前缀tempiconsegna”,这是自定义图元,如: 可在3天内提供 我的问题是,如果我改变了产品的可用性,它也改变了以前的订单。 当我更新产品的可用性时,如何在不改变的情况下显示订单时的值?

    • 我正在Laravel4上使用lib PayPal PHP SDK 我对显示订单细节有意见。我按照贝宝网络结账的步骤操作,它没有向我显示订单细节。 这是当我得到支付链接的方法:

    • 我正在使用一个自定义的结帐字段,在我的woocommerce商店的结帐页面上为我的客户提供一个“发送到业务地址”选项。大部分代码工作正常,但我无法显示他们是否选中了后端管理订单详细信息中的复选框。 我已经添加了一个自定义结账字段到我的WooCommerce商店,并将数据保存到订单元: 这里是我试图在管理命令部分显示这些数据的地方。我已经尽可能地关注了前面关于这方面的话题,但没有任何效果。 这个问题

    • 对于Woocommerce分组产品,我使用以下代码在购物车和结帐页面中显示父产品名称: 代码来源于此:将父产品名称添加到WooCommerce中的每个购物车项目名称中 现在,我想在订单详细信息和后端也显示此父产品名称。 我将感谢任何对此的帮助。