Wordpress. Woocommerce. Хук действия ПЕРЕД добавлением в корзину

Что мне нужно сделать: я хочу выполнить несколько проверок продукта, прежде чем он будет добавлен в корзину. Точнее: я хочу сравнить продукт, который я собираюсь добавить в корзину, с уже добавленными, чтобы увидеть, есть ли какие-то конфликты. Пример. Допустим, у нас есть товар с названием «Обе туфли» и продукт «Левая обувь». Пользователь добавляет в корзину «левую обувь». Затем он добавляет «обе туфли». Я хочу напечатать ошибку вместо добавления «обеих туфлей»: извините, но вы не можете добавить обе туфли, если вы добавили левую обувь в корзину. Если вы хотите купить «обе туфли», сначала удалите «левую обувь».

Я просмотрел class-wc-cart.php и обнаружил перехватчик действия в строке 811, но уже слишком поздно! Это после того, как товар был добавлен

"do_action ('woocommerce_add_to_cart', $ cart_item_key, $ product_id, $ amount, $ вариация_id, $ вариация, $ cart_item_data);

Метод add_to_cart начинается со строки 705. http://wcdocs.woothemes.com/apidocs/source-class-WC_Cart.html#705 < / а>

Как можно подключить мою функцию "менеджер конфликтов продуктов" до строки 801, без взлома woocommerce?

Спасибо!


person Sergiu-Antonin Ghita    schedule 20.01.2013    source источник
comment
Если бы я взломал его, я бы просто добавил следующие строки в строку 799: if(!do_action( 'woocommerce_before_add_to_cart', $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data )) { return false; } И использовал add_action ('woocommerce_before_add_to_cart','add_to_cart_conflict_manage',10,6); в моем functions.php   -  person Sergiu-Antonin Ghita    schedule 20.01.2013
comment
^ или что-то подобное   -  person Sergiu-Antonin Ghita    schedule 21.01.2013
comment
Взлом закончился фактически фильтром, а не действием // This is supposed to handle product conflicts and check if user already has access to the product // $product_conflict_error = apply_filters( 'woocommerce_before_add_to_cart', $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data,$product_data); if (product_conflict_error) { $woocommerce->add_error( __($product_conflict_error, 'woocommerce') ); return false; }   -  person Sergiu-Antonin Ghita    schedule 21.01.2013
comment
Вы нашли ответ на эту проблему? У меня такая же проблема, и мне не удалось найти правильный крючок.   -  person Eric K    schedule 23.10.2013


Ответы (1)


Немного поздно, но я думаю, вы ищете проверку добавления в корзину, которую можно фильтровать. Вот упрощенная версия:

function so_validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '' ) {

    // do your validation, if not met switch $passed to false
    if ( 1 != 2 ){
        $passed = false;
        wc_add_notice( __( 'You can not do that', 'textdomain' ), 'error' );
    }
    return $passed;

}
add_filter( 'woocommerce_add_to_cart_validation', 'so_validate_add_cart_item', 10, 5 );
person helgatheviking    schedule 31.03.2014
comment
Спасибо! ^ _ ^ Это полностью поставило меня на правильный путь; однако я заметил ошибочную закрывающую скобку в строке add_filter, и ей нужно количество аргументов для набора фильтров вместе с приоритетом (add_filter( 'woocommerce_add_to_cart_validation', 'so_validate_add_cart_item', 10, 5);), иначе это вызовет ошибку. - person indextwo; 06.08.2014
comment
Как мы можем заставить его работать, когда продукты добавляются через ajax? - person Learning and sharing; 19.05.2018
comment
Проверка выполняется, даже если продукт добавлен через ajax. - person helgatheviking; 22.05.2018