Скрыть способы доставки в зависимости от наличия других способов доставки в WooCommerce

#php #wordpress #woocommerce

Вопрос:

Я пытаюсь скрыть методы доставки, основанные на доступности других методов доставки (по их идентификаторам), для несколько сложной настройки доставки.

Основываясь на других фрагментах кода, которые я нашел (для других случаев использования, исключая штаты или показывая только бесплатную доставку, если она доступна), я придумал это:

 function hide_duplicate_shipping_methods ( $rates ) {    foreach ( $rates as $rate_id =gt; $rate ) {    if ( 'flat_rate:10' === $rate-gt;method_id ) {  unset( $rates['flat_rate:28'] );  }  }  return $rates; } add_filter( 'woocommerce_package_rates', 'hide_duplicate_shipping_methods', 100 );  

Однако это ничего не скрывает, и я действительно не могу найти или придумать что-нибудь еще.

Есть какие-нибудь советы?

Ответ №1:

  • $rate-gt;method_id будет равно local_pickup , free_shipping , flat_rate , и т.д..
  • в то время $rate_id как будет равно local_pickup:1 , free_shipping:2 , и т.д..

Так что либо вы используете его вот так:

 function filter_woocommerce_package_rates( $rates, $package ) {   // Loop trough  foreach ( $rates as $rate_id =gt; $rate ) {  // Checks if a value exists in an array, multiple can be added, separated by a comma  if ( in_array( $rate-gt;method_id, array( 'local_pickup', 'free_shipping' ) ) ) {  unset( $rates['flat_rate:28'] );  }  }     return $rates; } add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 10, 2 );  

ИЛИ вот так:

 function filter_woocommerce_package_rates( $rates, $package ) {   // Loop trough  foreach ( $rates as $rate_id =gt; $rate ) {  // Checks if a value exists in an array, multiple can be added, separated by a comma  if ( in_array( $rate_id, array( 'local_pickup:1', 'free_shipping:2' ) ) ) {  unset( $rates['flat_rate:28'] );  }  }     return $rates; } add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 10, 2 );  

Код помещается в functions.php файл активной дочерней темы (или активной темы). Протестировано и работает в WordPress 5.8.1 и WooCommerce 5.8.0

Не забудьте очистить корзину, чтобы обновить кэшированные данные о доставке.