Запретить доступ к оформлению заказа без способа доставки в WooCommerce - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь удалить кнопку «Перейти к оформлению заказа» и ограничить доступ к странице оформления заказа до тех пор, пока покупатель не заполнит опцию «Рассчитать доставку» на странице корзины.

Я создал локальный способ доставки, который ограничен на несколько почтовых / почтовых индексов. Затем я добавил это к своим функциям. php file.

function disable_checkout_button_no_shipping() {
  $package_counts = array();

  // get shipping packages and their rate counts
  $packages = WC()->shipping->get_packages();
  foreach( $packages as $key => $pkg )
      $package_counts[ $key ] = count( $pkg[ 'rates' ] );

  // remove button if any packages are missing shipping options
  if( in_array( 0, $package_counts ) )
      remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
}
add_action( 'woocommerce_proceed_to_checkout', 'disable_checkout_button_no_shipping', 1 );

Однако, когда я тестирую сайт в разных браузерах и в режимах инкогнито, появляется кнопка «Перейти к оформлению заказа».

Если я нажму на ссылку «Рассчитать доставку» и не заполню форму, а обновлю ее, кнопка исчезнет. Обычно я хочу, чтобы кнопка появлялась, когда клиент заполняет форму «Рассчитать доставку» на странице корзины (и у меня есть один из почтовых индексов в моем методе доставки), прежде чем он сможет перейти на страницу оформления заказа.

1 Ответ

2 голосов
/ 06 апреля 2020

Вам лучше попробовать "Выбранный способ доставки" из сеанса WooCommerce, например:

function disable_checkout_button_no_shipping() {

    $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );

    // remove button if there is no chosen shipping method
    if( empty( $chosen_shipping_methods ) ) {
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
    }
}
add_action( 'woocommerce_proceed_to_checkout', 'disable_checkout_button_no_shipping', 1 );

Или другим способом, используя woocommerce_check_cart_items action hook:

add_action( 'woocommerce_check_cart_items', 'required_chosen_shipping_methods' );
function required_chosen_shipping_methods() {
    $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );

    if( is_array( $chosen_shipping_methods ) && count( $chosen_shipping_methods ) > 0 ) {
        // Display an error message
        wc_add_notice( __("A shipping method is required in order to proceed to checkout."), 'error' );
    }
}

It должен лучше работать.

...