2013-07-01 3 views
2

Так что я пытаюсь скрыть определенные методы корабля в Woocommerce на основе тега продукта. Основная проблема, я лицо мое отсутствия PHP знаний, поэтому я frankensteined следующего кода вместе с помощью некоторых очень дружелюбных людей:Скрыть параметры доставки Woocommerce

add_filter('woocommerce_available_shipping_methods', 'hide_shipping_based_on_tag' , 10, 1); 

function check_cart_for_share() { 

// load the contents of the cart into an array. 
global $woocommerce; 
$cart = $woocommerce->cart->cart_contents; 

$found = false; 

// loop through the array looking for the tag you set. Switch to true if the tag is found. 
foreach ($cart as $array_item) { 
if (isset($array_item['product_tag']) && $array_item['product_tag'] == "CHOSEN_TAG") { // Replace "CHOSEN_TAG" with what ever tag you want 
$found = true; 
break; 
} 
} 
return $found; 

} 

function hide_shipping_based_on_tag($available_methods) { 

// use the function abve to check the cart for the tag. 
if (check_cart_for_share()) { 

// remove the rate you want 
unset($available_methods['flat_rate']); // Replace "flar_rate" with the shipping option that yu want to remove. 
} 

// return the available methods without the one you unset. 
return $available_methods; 

} 

Я понимаю, что этот код не является ни в коей мере не универсальная и, таким образом, переменные будет отличается от случая к случаю, но, возможно, кто-то может сказать мне, если что-то в коде. Большое спасибо

+0

Этот код не работает? Или вы ищете больше того, как лучше ответить? Если это так, то этот вопрос лучше в http://codereview.stackexchange.com/. –

ответ

5

Без сомнения, вы отсортировали это сейчас, но ваш код стал для меня хорошим началом ... и так как я его отсортировал, я опубликовал его ниже. Ваша проблема заключалась в том, что woocommerce не имеет product_tag в массиве корзин, поэтому вам нужно пойти и получить его.

/* !Hide Shipping Options Woocommerce */ 

add_filter('woocommerce_available_shipping_methods', 'hide_shipping_based_on_tag' , 10, 1); 

function check_cart_for_share() { 

// load the contents of the cart into an array. 
global $woocommerce; 
$cart = $woocommerce->cart->cart_contents; 

$found = false; 

// loop through the array looking for the tag you set. Switch to true if the tag is found. 
foreach ($cart as $array_item) { 
    $term_list = wp_get_post_terms($array_item['product_id'], 'product_tag', array("fields" => "names")); 

    if (in_array("Heavy",$term_list)) { // Replace "Heavy" with what ever tag you want 

     $found = true; 
     break; 
    } 
} 

return $found; 

} 

function hide_shipping_based_on_tag($available_methods) { 

// use the function above to check the cart for the tag. 
if (check_cart_for_share()) { 

    // remove the rate you want 
    unset($available_methods['flat_rate']); // Replace "flat_rate" with the shipping option that you want to remove. 
} 

// return the available methods without the one you unset. 
return $available_methods; 

} 
+0

Фактически, что я пытался сделать, это удалить класс перевозкы груза 'flat_rate', когда присутствовал другой класс отгрузки. Этот код позволил мне сделать это, когда тег присутствовал на продукте. Однако когда я проснулся сегодня утром, я понял, что если бы я изменил «product_tag» на «product_shipping_class» (для получения дополнительных опций см. Http://docs.woothemes.com/wc-apidocs/class-WC_Product.html), я мог бы сделать то, что я хотел без добавления тега, а также класса доставки ... он работает ... но он также будет работать для любого атрибута продукта. Думал, что поделюсь. Ian –

-2

Используйте его в functions.php в своей теме или создайте плагин с этим кодом.

+0

Осветите нас своей причиной для downvote. Это может быть образовательный. –

+0

Не тот, кто ниспроверг вас, но у вас там нет ответа. Это скорее комментарий. Добавьте ссылки или образцы небольшого кода на то, что вы пытаетесь передать вопроснику. Вышеизложенное никоим образом не помогает, форма или форма для тех, у кого нет такого опыта. – adamj

+0

Да, конечно. Это должен был быть комментарий. Комментарий, который был ошибочно поставлен в качестве ответа, был направлен на то, чтобы помочь тем, кто не знает, как использовать образец кода или где его реализовать. Поэтому я действительно чувствую, что мой неуместный комментарий действительно помог тем, кто, как я, не близок с каркасом. –

0

Для достижения этой цели вы можете использовать класс судоходства Woocommerce.

Вот пошаговые инструкции.

  • Создание доставки класс (woocommerce-> настройки-> shipping-> доставки классов).
  • Associate это судоходный класс с продуктами (что вы палочка, чтобы скрыть методы доставки для)
  • Используйте this фрагмент кода. (копировать и pate to function.php).

Дополнительную информацию о фрагменте можно получить here.

Смежные вопросы