В WooCommerce я использую код из этого ответа:
Установите цену товара в корзину WooCommerce до нуля, если продукт уже куплен
Он отлично работает с одним продуктом, но я хотел бы, чтобы он работал с несколькими продуктами .
Поэтому приведенный ниже код для конкретного продукта изменит цену товара на корзину до $0.00
если клиент уже купил, и если цена не установлена в $100
(для первой покупки) :
add_action( 'woocommerce_before_calculate_totals', 'conditionally_change_cart_items_price', 10, 1 ); function conditionally_change_cart_items_price( $cart_object ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; $targeted_product_id = 1107; // Set Here your custom price (1st purshase) $custom_price = 100; // First purshase for product ID 1092 // Detecting if customer has already bought The targeted product (1092) if( is_user_logged_in() ){ $customer = wp_get_current_user(); $customer_id = $customer->ID; // customer ID $customer_email = $customer->email; // customer email if( wc_customer_bought_product( $customer_email, $customer_id, $targeted_product_id) ) $custom_price = 0; // Set to 0 for other purchases (product ID 1092) } foreach ( $cart_object->get_cart() as $cart_item ) { // When targeted product is in cart we change the price if ( $cart_item['product_id'] == $targeted_product_id ) { // Woocommerce 3+ compatibility if ( version_compare( WC_VERSION, '3.0', '<' ) ) $cart_item['data']->price = $custom_price; else $cart_item['data']->set_price( $custom_price ); } } }
Как я могу заставить его работать для нескольких определенных продуктов (а не на самом деле)?
Вам нужно создать массив со всеми целевыми идентификаторами продуктов, а затем проверить, покупает ли клиент этот продукт уже в цикле foreach:
add_action( 'woocommerce_before_calculate_totals', 'conditionally_change_cart_items_price', 10, 1 ); function conditionally_change_cart_items_price( $cart_object ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // add as many ids as you need $targeted_product_ids = array( 1107, 1108, 1109 ); // Set Here your custom price (1st purshase) $custom_price = 100; // First purshase for target product if ( is_user_logged_in() ) { $customer = wp_get_current_user(); $customer_id = $customer->ID; // customer ID $customer_email = $customer->email; // customer email foreach ( $cart_object->get_cart() as $cart_item ) { // When targeted product is in cart we change the price if ( in_array( $cart_item['product_id'], $targeted_product_ids ) ) { // Detecting if customer has already bought The targeted product if ( wc_customer_bought_product( $customer_email, $customer_id, $targeted_product_id ) ) // Set to 0 for other purchases $custom_price = 0; // Woocommerce 3+ compatibility if ( version_compare( WC_VERSION, '3.0', '<' ) ) $cart_item['data']->price = $custom_price; else $cart_item['data']->set_price( $custom_price ); } } } }
На основании: Установите цену товара в корзину WooCommerce до нуля, если продукт уже куплен
Вы сможете заставить его работать для нескольких определенных идентификаторов продуктов (в массиве) следующим образом:
// For WooCommerce version 3 and above (only) add_action( 'woocommerce_before_calculate_totals', 'conditionally_change_cart_items_prices', 10, 1 ); function conditionally_change_cart_items_prices( $cart_object ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Set HERE the Products to check in this array $targeted_product_ids = array( 37, 50, 89, 124, 327 ); $products_bought = array(); // Set Here your custom price (1st purshase) $custom_price1 = 100; // First purshase // Set Here your custom price (more purshases than first) $custom_price2 = 0; // Next purshases // Detecting if customer has already bought our targeted products if( is_user_logged_in() ){ $customer = wp_get_current_user(); $customer_id = $customer->ID; // customer ID $customer_email = $customer->email; // customer email // Checking each product in the array foreach( $targeted_product_ids as $product_id ){ if( wc_customer_bought_product( $customer_email, $customer_id, $product_id) ){ // We set all (targeted) purchased products in an array $products_purchased[] = $product_id; } } } // Checking cart items and changing item prices if needed foreach ( $cart_object->get_cart() as $cart_item ) { // When a targeted products already purchased is in cart we set price 2 if ( in_array( $cart_item['product_id'], $products_purchased ) ) { $cart_item['data']->set_price( $custom_price2 ); } // When a targeted products is in cart and has not been purchased we set price 1 elseif ( in_array( $cart_item['product_id'], $targeted_product_ids ) ) { $cart_item['data']->set_price( $custom_price1 ); } } }
Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Этот код проверен и работает в WooCommerce 3+