#php #wordpress #woocommerce
#php #wordpress #woocommerce
Вопрос:
Мне нужно сделать так, чтобы WooCommerce разрешал проверку только тогда, когда в корзину добавляются товары определенных категорий. У меня уже есть для этого рабочий код. Но мне нужно сделать этот код доступным только тогда, когда выбранный способ доставки отличается от доставки в магазине. Есть какие-нибудь советы, как это сделать?
Вот код, который я использую, чтобы требовать добавления определенных продуктов в корзину:
`
`function sv_wc_prevent_checkout_for_category() { // set the slug of the category for which we disallow checkout $category = 'clothing'; // get the product category $product_cat = get_term_by( 'slug', $category, 'product_cat' ); // sanity check to prevent fatals if the term doesn't exist if ( is_wp_error( $product_cat ) ) { return; } $category_name = 'lt;a href="' . get_term_link( $category, 'product_cat' ) . '"gt;' . $product_cat-gt;name . 'lt;/agt;'; // check if this category is the only thing in the cart if ( sv_wc_is_category_alone_in_cart( $category ) ) { // render a notice to explain why checkout is blocked wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category amp;ndash; you must purchase a product from another category to check out.', $category_name ), 'error' ); } } add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' ); function sv_wc_is_category_alone_in_cart( $category ) { // check each cart item for our category foreach ( WC()-gt;cart-gt;get_cart() as $cart_item_key =gt; $cart_item ) { // if a product is not in our category, bail out since we know the category is not alone if ( ! has_term( $category, 'product_cat', $cart_item['data']-gt;id ) ) { return false; } } // if we're here, all items in the cart are in our category return true; }
Ответ №1:
Вам нужно получить текущий метод выбора. Вы можете использовать WC()-gt;session-gt;get('chosen_shipping_methods')
метод, чтобы получить текущий выбор.
Добавьте в свою sv_wc_is_category_alone_in_cart()
функцию условие ниже.
if( WC()-gt;session-gt;get('chosen_shipping_methods')[0] == 'your-shipping-method-name' ){ return false; }
Попробуйте выполнить приведенный ниже код.
function sv_wc_prevent_checkout_for_category() { // set the slug of the category for which we disallow checkout $category = 'test-1'; // get the product category $product_cat = get_term_by( 'slug', $category, 'product_cat' ); // sanity check to prevent fatals if the term doesn't exist if ( is_wp_error( $product_cat ) ) { return; } $category_name = 'lt;a href="' . get_term_link( $category, 'product_cat' ) . '"gt;' . $product_cat-gt;name . 'lt;/agt;'; // check if this category is the only thing in the cart if ( sv_wc_is_category_alone_in_cart( $category ) ) { // render a notice to explain why checkout is blocked wc_add_notice( sprintf( 'Hi there! Looks like your cart only contains products from the %1$s category amp;ndash; you must purchase a product from another category to check out.', $category_name ), 'error' ); } } add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' ); function sv_wc_is_category_alone_in_cart( $category ) { if( WC()-gt;session-gt;get('chosen_shipping_methods')[0] == 'local_pickup:8' ){ return false; } // check each cart item for our category foreach ( WC()-gt;cart-gt;get_cart() as $cart_item_key =gt; $cart_item ) { // if a product is not in our category, bail out since we know the category is not alone if ( ! has_term( $category, 'product_cat', $cart_item['data']-gt;id ) ) { return false; } } // if we're here, all items in the cart are in our category return true; }
Проверено и работает. Я протестировал этот код с моей категорией товара и способом доставки, поэтому не забудьте изменить значение с вашим.