2017-01-27 2 views
2

Я боролся со сниппетом для WooCommerce, который я хотел бы добавить к функциям темы моего ребенка, но я достигаю пределов своих знаний PHP.Условно изготовление продукта WooCommerce, не подлежащего покупке

Я установил пользовательский атрибут pdt_volume, который я буду заполнять каждый раз, когда добавляю продукт. Я хотел бы удалить кнопку Add_to_cart, когда сумма этого атрибута для всех элементов, уже находящихся в корзине, достигает предела max_volume.

Например, Max_volume 100, у меня есть 4 продукты pdt_volume = 20, следовательно, кнопка add_to_cart для продукта с pdt_volume 25 должны быть удалены, так что не могу добавить его в Корзина.

Итак, у меня есть этот фрагмент, с фрагментами кода, найденными здесь и там. Но функции.php не сохранит его, и другие варианты этого кода успели зарегистрироваться в функции.php, но затем сайт выдаст ошибку 500 ...

Пожалуйста, у кого-нибудь есть идея как добиться этого?
Что я делаю неправильно?

Спасибо.


EDIT 1: Хорошо, так что я получил этот код на самом деле быть зарегистрирован в functions.php редактором, не нарушая, но на месте, я все еще получаю ошибку внутреннего сервера. Как будто что-то не вычисляет или что-то еще.


EDIT 2 (29/01/2017)
Я использовал плагин ACF я купил давно, но не нашли подходящую цель ... до сих пор.

Вот рабочий код, который я смог придумать. Это не шедевр кода, и я не получу никакой награды за это, но, похоже, он работает до сих пор. По крайней мере, это позволяет мне получить инструкцию TRUE/FALSE, которую я могу использовать в условии if, чтобы изменить кнопку add_to_cart на кнопку Your_box_is_full. Действительно, мне не нужны были global $woocommerce или $product!

function get_cart_volume() { 
    $cart_volume = 0; 
    foreach(WC()->cart->get_cart() as $cart_item) { 
    $item_id = $cart_item['product_id']; 
    $item_volume = get_field('product_volume', $item_id); 
    $item_qty = $cart_item['quantity']; 
    $vol_by_qty = $item_volume * $item_qty; 
    $cart_volume += $vol_by_qty; 
    } 
    return $cart_volume; 
} 

function check_if_full($candidate) { 
    $max_volume = 100; 
    $candidate = $product->id; 
    $a_volume = get_field('product_volume', $candidate); 
    $b_volume = get_cart_volume(); 
    $check_volume = $a_volume + $b_volume; 
    if ($check_volume > $max_volume) 
     return true; 
    else 
     return false; 
} 

//Just a function to see if it's working on the cart page fur debugging purpose 
add_action('woocommerce_check_cart_items', 'current_volume'); 
function current_volume() { 
    if (is_cart() || is_checkout()) { 
    global $woocommerce; 
    $current_volume = get_cart_volume(); 
    wc_add_notice(sprintf('<strong>Volume is %s.</strong>', $current_volume), 
    'error'); 
    } 
} 
+0

В 'кандидат_volume()' объект '$ product' не определен, поэтому гарантируется, что это будет фатальной ошибкой. – helgatheviking

+0

Привет, спасибо за ваш вклад. Должен ли я объявить его с помощью «глобального $ продукта»? Редактировать: oh Я вижу, что вы имели в виду кандидат_volume ($ product) ... – Baptiste

+0

Да, передача '$ product' в качестве параметра для' кандидат_volume() ': ex' candid_volume ($ product) 'должна работать. – helgatheviking

ответ

1

Как говорит Helgatheviking, вы получите уже с woocommerce_is_purchasable крюком в вашей крючковатой функции, объект $ продукта в качестве 2-го аргумента. Так что вам это не нужно, и вам нужно удалить global $woocommerce, $product;, чтобы он работал без ошибки.

Ваш код будет:

add_filter('woocommerce_is_purchasable', 'if_room_is_purchasable', 10, 2); 
function if_room_is_purchasable ($is_purchasable, $product){ 

    $cart_volume = 0; 
    $max_volume = 100; 

    foreach(WC()->cart->get_cart() as $cart_item){ 
     $item_id = $cart_item['product_id']; 
     $terms = get_the_terms($item_id, 'pa_pdt_volume'); 
     foreach($terms as $key => $term){ 
      $cart_volume += $term->name; // May be better with $term->slug; 
     } 
    } 

    $candidate_volume = $cart_volume + $product->get_attribute('pa_pdt_volume'); 

    if ($candidate_volume > $max_volume) 
     return false; 
    else 
     return true; 
    } 

Это должно работать без ошибок.

+0

Hello Loic, Во-первых, большое спасибо за ваш код. Я работаю над фрагментом, который отлично работает, или так кажется. Вместо этого я использовал ACF get_field, потому что казалось, что имя $ term-> не работает. Я тоже проверю код, и посмотрю, какая из них имеет лучшую производительность и гибкость для разных мест, которые я намерен использовать для информации, предоставляемой функцией. – Baptiste

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