Возможно, я слишком долго смотрел на основные файлы WooCommerce, но я не могу понять, как показать только окончательный выбор доставки на странице оформления заказа.
Вот немного предыстории:
Я пытаюсь упростить процесс оформления заказа. Я хочу, чтобы на странице корзины был выбран способ доставки только . Если это местный пикап, то под примечаниями к заказу появится условное поле для выбора места получения. Но, когда вы дойдете до окончательного рассмотрения заказа на странице Chekcout, Woo позволяет вам повторно выбрать вариант доставки, который добавляет ключ к работе. Я просто хочу повторить их выбор и цену доставки и не позволить им изменить выбор, если они не вернутся на страницу корзины.
Итак, я заглянул в woocommerce / templates / checkout / review-order.php, и он вызывает корзину, чтобы выбрать параметры доставки следующим образом:
<?php wc_cart_totals_shipping_html(); ?>
Эта функция фактически из корзины:
function wc_cart_totals_shipping_html() {
$packages = WC()->shipping->get_packages();
$first = true;
foreach ( $packages as $i => $package ) {
$chosen_method = isset( WC()->session->chosen_shipping_methods[ $i ] ) ? WC()->session->chosen_shipping_methods[ $i ] : '';
$product_names = array();
if ( sizeof( $packages ) > 1 ) {
foreach ( $package['contents'] as $item_id => $values ) {
$product_names[ $item_id ] = $values['data']->get_name() . ' ×' . $values['quantity'];
}
$product_names = apply_filters( 'woocommerce_shipping_package_details_array', $product_names, $package );
}
wc_get_template( 'cart/cart-shipping.php', array(
'package' => $package,
'available_methods' => $package['rates'],
'show_package_details' => sizeof( $packages ) > 1,
'show_shipping_calculator' => is_cart() && $first,
'package_details' => implode( ', ', $product_names ),
// @codingStandardsIgnoreStart
'package_name' => apply_filters( 'woocommerce_shipping_package_name', sprintf( _nx( 'Shipping', 'Shipping %d', ( $i + 1 ), 'shipping packages', 'woocommerce' ), ( $i + 1 ) ), $i, $package ),
// @codingStandardsIgnoreEnd
'index' => $i,
'chosen_method' => $chosen_method,
) );
$first = false;
}
}
Теперь я также заглянул в woocommerce / includes / class-wc-checkout.php и обнаружил:
/**
* Add shipping lines to the order.
*
* @param WC_Order $order Order Instance.
* @param array $chosen_shipping_methods Chosen shipping methods.
* @param array $packages Packages.
*/
public function create_order_shipping_lines( &$order, $chosen_shipping_methods, $packages ) {
foreach ( $packages as $package_key => $package ) {
if ( isset( $chosen_shipping_methods[ $package_key ], $package['rates'][ $chosen_shipping_methods[ $package_key ] ] ) ) {
$shipping_rate = $package['rates'][ $chosen_shipping_methods[ $package_key ] ];
$item = new WC_Order_Item_Shipping();
$item->legacy_package_key = $package_key; // @deprecated For legacy actions.
$item->set_props(
array(
'method_title' => $shipping_rate->label,
'method_id' => $shipping_rate->method_id,
'instance_id' => $shipping_rate->instance_id,
'total' => wc_format_decimal( $shipping_rate->cost ),
'taxes' => array(
'total' => $shipping_rate->taxes,
),
)
);
foreach ( $shipping_rate->get_meta_data() as $key => $value ) {
$item->add_meta_data( $key, $value, true );
}
/**
* Action hook to adjust item before save.
*
* @since 3.0.0
*/
do_action( 'woocommerce_checkout_create_order_shipping_item', $item, $package_key, $package, $order );
// Add item to order and save.
$order->add_item( $item );
}
}
}
Я чувствую, что ловушка действий в конце последнего кода приведет меня туда, но я не могу понять, с какой функцией связываться или что я могу использовать от до , чтобы заменить ее.