在 Woocommerce 中移动结账运送选项

awo*_*zal 3 php ajax wordpress woocommerce

我正在尝试将 woocommerce 结帐中的运输选项从 review-order.php 移至 form-checkout.php

我已经拿了代码

<?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>
    <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>
    <?php wc_cart_totals_shipping_html(); ?>
    <?php do_action( 'woocommerce_review_order_after_shipping' ); ?>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

并将其移至我的主题 form-checkout.php ,问题是,当我输入或更改地址时,它现在不会更新运费。这已被接受为在线解决方案,但我认为 woocommerce 从那时起已经更新了。

我认为问题在于,当调用 update_checkout Ajax 时,运输选项现在不会更新,但我不确定如何更改它。

谢谢


编辑:我想我知道如何做到这一点。我创建了一个模板 checkout/shipping-options.php

    <?php
defined( 'ABSPATH' ) || exit;
?>
<div class="card card-shipping mb-3 woocommerce-checkout-shipping-table">
                    <div class="card-header">
                        Select Shipping
                    </div>
                    <div class="card-body ">
                        <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>
                        <?php wc_cart_totals_shipping_html(); ?>
                        <?php do_action( 'woocommerce_review_order_after_shipping' ); ?>
                    </div>
</div>  
Run Code Online (Sandbox Code Playgroud)

然后在我的functions.php中我添加了

    function woocommerce_checkout_shipping_options( $deprecated = false ) {
        wc_get_template(
            'checkout/shipping-options.php',
            array(
                'checkout' => WC()->checkout(),
            )
        );
    }
add_action( 'woocommerce_checkout_shipping_option', 'woocommerce_checkout_shipping_options', 10 );
Run Code Online (Sandbox Code Playgroud)

然后添加

<?php do_action( 'woocommerce_checkout_shipping_option' ); ?>
Run Code Online (Sandbox Code Playgroud)

进入 form-checkout.php

并更新了 woocommerce/includes/class-wc-ajax.php update_order_review 函数以包括

// Get order review fragment.
ob_start();
woocommerce_order_review();
$woocommerce_order_review = ob_get_clean();

// Get checkout payment fragment.
ob_start();
woocommerce_checkout_payment();
$woocommerce_checkout_payment = ob_get_clean();

// Get checkout shipping fragment.
ob_start();
woocommerce_checkout_shipping_options();
$woocommerce_checkout_shipping_options = ob_get_clean();

// Get messages if reload checkout is not true.
$reload_checkout = isset( WC()->session->reload_checkout );
if ( ! $reload_checkout ) {
    $messages = wc_print_notices( true );
} else {
    $messages = '';
}

unset( WC()->session->refresh_totals, WC()->session->reload_checkout );

wp_send_json(
    array(
        'result'    => empty( $messages ) ? 'success' : 'failure',
        'messages'  => $messages,
        'reload'    => $reload_checkout,
        'fragments' => apply_filters(
            'woocommerce_update_order_review_fragments',
            array(
                '.woocommerce-checkout-review-order-table' => $woocommerce_order_review,
                '.woocommerce-checkout-payment' => $woocommerce_checkout_payment,
                '.woocommerce-checkout-shipping-table' => $woocommerce_checkout_shipping_options,
            )
        ),
    )
);
Run Code Online (Sandbox Code Playgroud)

我现在需要解决的是如何在不编辑核心文件的情况下更新 update_order_review ajax。

小智 5

我遇到了完全相同的问题并找到了解决方案。

步骤1:复制并删除review-order.php中的以下代码

<?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>
    <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>
    <?php wc_cart_totals_shipping_html(); ?>
    <?php do_action( 'woocommerce_review_order_after_shipping' ); ?>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

第 2 步:将其插入到 form-checkout.php 中的任何位置,并在其周围添加一个 div

<?php if ( WC()->cart->needs_shipping() && WC()->cart->show_shipping() ) : ?>
    <?php do_action( 'woocommerce_review_order_before_shipping' ); ?>
    <div class="my-custom-shipping-table">
        <?php wc_cart_totals_shipping_html(); ?>
    </div>
    <?php do_action( 'woocommerce_review_order_after_shipping' ); ?>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

步骤3:打开子主题的functions.php并添加以下代码

function my_custom_shipping_table_update( $fragments ) {
    ob_start();
    ?>
    <div class="my-custom-shipping-table">
        <?php wc_cart_totals_shipping_html(); ?>
    </div>
    <?php
    $woocommerce_shipping_methods = ob_get_clean();
    $fragments['.my-custom-shipping-table'] = $woocommerce_shipping_methods;
    return $fragments;
}
add_filter( 'woocommerce_update_order_review_fragments', 'my_custom_shipping_table_update');
Run Code Online (Sandbox Code Playgroud)

这就是一个包装。

在这里找到解决方案:https ://www.ibenic.com/customize-woocommerce-checkout-pages/