Статьи

Действия и фильтры WooCommerce для управления корзиной

Добро пожаловать во вторую статью из серии «Освоение действий и фильтров WooCommerce». В предыдущей статье , хотя она и была очень простой, мы рассмотрели обработку платежного адреса и адреса доставки клиента, а также то, что происходит, когда клиент регистрируется через WooCommerce и отправляет их на сторонний веб-сайт, например Salesforce.

Во второй статье мы будем хитроумно управлять корзиной с помощью реальных сценариев, с которыми вы можете столкнуться при создании веб-сайта электронной коммерции с помощью WooCommerce.

Добавление продукта в корзину программно

Для добавления товара в корзину требуется только одна строка кода. Единственный мозговой штурм, который вы будете делать, — это решить, когда или почему вы захотите это сделать. Мы поговорим об этом позже в третьей части этой статьи, когда будем работать над сценарием реального мира.

Все, что нужно для добавления товара в корзину — это следующее:

<?php // Takes the Product ID and the Quantity WC()->cart->add_to_cart( 73, 1 ); 

В качестве предостережения, убедитесь, что вы не запускаете это для действия, которое выполняется на каждой странице, например, для действия template_redirect иначе вы добавите один из этих продуктов в корзину при каждой загрузке страницы или перезагрузите страницу. Избегайте делать это по возможности:

 <?php // template_redirect runs once for every page so you'll be // increasing the quantity by one on every page load add_action( 'template_redirect', 'add_random_product' ); function add_random_product() { WC()->cart->add_to_cart( 73, 1 ); } 

Удаление продукта из корзины программно

Я видел, как этот вопрос задавали бесконечное количество раз на разных форумах и сайтах с очень небольшими ответами. Надеемся, что это поможет вам в следующий раз, когда вы захотите удалить продукт из корзины, и снова, единственный мозговой штурм, который вы будете делать, — это когда или почему вы захотите удалить продукт из корзины. Следующий код не позволит никому проверить товар в вашем магазине. Я не знаю, почему вы хотели бы сделать что-то подобное, но он продемонстрирует шаги по удалению продукта из корзины, что не так просто, как в предыдущем примере, когда мы добавили продукт в корзину.

 <?php add_action( 'template_redirect', 'remove_product_from_cart' ); function remove_product_from_cart() { // Run only in the Cart or Checkout Page if( is_cart() || is_checkout() ) { // Set the product ID to remove $prod_to_remove = 56; // Cycle through each product in the cart foreach( WC()->cart->cart_contents as $prod_in_cart ) { // Get the Variation or Product ID $prod_id = ( isset( $prod_in_cart['variation_id'] ) && $prod_in_cart['variation_id'] != 0 ) ? $prod_in_cart['variation_id'] : $prod_in_cart['product_id']; // Check to see if IDs match if( $prod_to_remove == $prod_id ) { // Get it's unique ID within the Cart $prod_unique_id = WC()->cart->generate_cart_id( $prod_id ); // Remove it from the cart by un-setting it unset( WC()->cart->cart_contents[$prod_unique_id] ); } } } } 

Программная очистка корзины

Чтобы лучше проиллюстрировать, как программно очистить корзину, давайте добавим в корзину кнопку, которая позволит покупателям нажимать на нее и очищать корзину.

WooCommerce пустая кнопка корзины

Давайте воспользуемся действием woocommerce_proceed_to_checkout нашу собственную кнопку «Отправить», которая очистит корзину для текущего покупателя.

 <?php add_action( 'woocommerce_proceed_to_checkout', 'insert_empty_cart_button' ); function insert_empty_cart_button() { // Echo our Empty Cart button echo '<input type="submit" class="button" name="empty_cart" value="Empty Cart" />'; } 

Следующим шагом является прослушивание нажатия кнопки, чтобы при нажатии мы очищали корзину. Для этого мы собираемся подключиться к действию template_redirect .

 <?php // Let's wait for the button to be clicked on add_action( 'template_redirect', 'empty_cart_button_handler' ); function empty_cart_button_handler() { if( isset( $_POST['empty_cart'] ) && $_SERVER['REQUEST_METHOD'] == "POST" ) { WC()->cart->empty_cart( true ); } } 

Теперь вы заметите, что после нажатия кнопки вместо обычного шаблона отображается cart-empty.php .

WooCommerce опустошил корзину

Теперь, когда мы установили, как добавить или удалить продукт из корзины, даже полностью опустошив корзину, давайте перейдем к созданию сценария реального мира, в котором знание такого рода вещей имеет большое значение.

Стимулирующие продукты

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

Проблема

Мы должны иметь возможность выдавать продукт по вашему выбору в качестве стимула для ваших клиентов.

Решение

Создайте систему, которая позволит вам раздавать свой стимулирующий продукт на основе следующего:

  • Наличие определенного товара в корзине

  • Наличие минимальной общей суммы для вашего заказа

  • Наличие минимального веса в вашей корзине

  • Наличие продукта из определенной категории

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

Вы не только сможете предложить своим клиентам стимулирующий продукт, отвечая одному из этих критериев, но и сможете объединить их. Например, вы можете проверить, есть ли у кого-то сумма в корзине не менее 100 долларов, а также продукт из категории «Одежда».

Давайте кратко рассмотрим функции, которые мы напишем через минуту, и то, что каждая из них делает в нашем сценарии проблемы / решения.

  • get_id_from_product( $product, $check_variations = true ) — получает идентификатор продукта и возвращает его. Принимает во внимание идентификаторы вариаций, поэтому мы проверяем их перед проверкой фактического идентификатора продукта.

  • qualifies_basedon_specific_product( $product_required ) — проверяет, имеет ли покупатель право на стимул, указав указанный идентификатор продукта в качестве одного из товаров в корзине.

  • qualifies_basedon_weight( $weight_required ) — Проверяет, имеет ли покупатель право на стимул, имея минимальный вес в корзине.

  • qualifies_basedon_cart_total( $total_required ) — проверяет, имеет ли клиент право на получение поощрения, имея минимальную общую сумму до расчета налогов.

  • qualifies_basedon_product_category( $category ) — Проверяет, имеет ли покупатель право на стимул, имея в корзине продукт определенной категории.

  • add_incentive_to_cart( $product_id ) — добавляет продукт-стимул в корзину, если клиент имеет на него право

  • remove_incentive_from_cart( $product_id ) — удаляет поощрительный продукт в корзину, если покупатель не имеет права на этот продукт.

  • qualifies_for_incentive() — это то, где волшебство произойдет, потому что у него будут правила, которые должны соответствовать, чтобы клиент мог претендовать на стимул. Эта функция будет обрабатывать логику нашей программы стимулирования.

 <?php /** * Will extract the Variation ID if available otherwise it will get the Product ID * @param $product Product * @param bool $check_variations Whether or not to check for variation IDs * @return mixed */ function get_id_from_product( $product, $check_variations = true ) { // Are we taking variations into account? if( $check_variations ) { // Ternary Operator // http://php.net/manual/en/language.operators.comparison.php return ( isset( $product['variation_id'] ) && ! empty( $product['variation_id']) && $product['variation_id'] != 0 ) ? $product['variation_id'] : $product['product_id']; } else { // No variations, just need the product IDs return $product['product_id']; } } /** * Checks the existence of a specific product in the cart * @param $product_required The Product ID required to be in the cart * @return bool */ function qualifies_basedon_specific_product( $product_required ) { /* * We only want to run this on the cart or checkout page */ if( is_cart() || is_checkout () ) { foreach( WC()->cart->cart_contents as $key => $product_in_cart ) { if( $product_required == get_id_from_product( $product_in_cart ) ) { return true; } } // Return false in case anything fails return false; } } /** * Checks the cart for the weight required to qualify for the incentive * @param $weight_required Weight Required * @return bool */ function qualifies_basedon_weight( $weight_required ) { /* * We only want to run this on the cart or checkout page */ if( is_cart() || is_checkout () ) { if( $weight_required >= WC()->cart->cart_contents_weight ) { return true; } } // Return false in case anything fails return false; } /** * Checks the cart for the Total excluding taxes * @param $total_required * @return bool */ function qualifies_basedon_cart_total( $total_required ) { /* * We only want to run this on the cart or checkout page */ if( is_cart() || is_checkout () ) { if( WC()->cart->subtotal_ex_tax >= $total_required ) { return true; } } // Return false in case anything fails return false; } /** * Checks the cart to verify whether or not a product from a Category is in the cart * @param $category Accepts the Product Category Name, ID, Slug or array of them * @return bool */ function qualifies_basedon_product_category( $category ) { foreach( WC()->cart->cart_contents as $key => $product_in_cart ) { if( has_term( $category, 'product_cat', get_id_from_product( $product_in_cart, false ) ) ) { return true; } } // Return false in case anything fails return false; } /** * Adds a specific product to the cart * @param $product_id Product to be added to the cart */ function add_incentive_to_cart( $product_id ) { // Check the cart for this product $cart_id = WC()->cart->generate_cart_id( $product_id ); $prod_in_cart = WC()->cart->find_product_in_cart( $cart_id ); // Add the product only if it's not in the cart already if( ! $prod_in_cart ) { WC()->cart->add_to_cart( $product_id ); } } /** * Removes a specific product from the cart * @param $product_id Product ID to be removed from the cart */ function remove_incentive_from_cart( $product_id ) { $prod_unique_id = WC()->cart->generate_cart_id( $product_id ); // Remove it from the cart by un-setting it unset( WC()->cart->cart_contents[$prod_unique_id] ); } 

Как видите, эти функции возвращают «True» или «False», поэтому нам будет очень легко смешать их и создать действительно гибкую программу стимулирования. Теперь осталось придумать правила, которые вы хотите установить для своих клиентов, чтобы претендовать на продукт стимулирования, и написать функцию woocommerce_check_cart_items qualifies_for_incentive() которая будет связана с woocommerce_check_cart_items WooCommerce woocommerce_check_cart_items .

 <?php /** * Checks whether or not the customer qualifies for the incentive */ add_action( 'woocommerce_check_cart_items', 'qualifies_for_incentive' ); function qualifies_for_incentive() { } 

Ниже приведены некоторые примеры того, как вы можете использовать эти функции для создания чего-то действительно уникального.

Только одно требование

Вот несколько примеров, устанавливающих только одно требование.

Конкретный продукт, существующий в корзине
 <?php // Specific product existing in the cart function qualifies_for_incentive() { // Incentive product we are giving away $incentive_product_id = 102; if( qualifies_basedon_specific_product( 70 ) ) { add_incentive_to_cart( $incentive_product_id ); } else { remove_incentive_from_cart( $incentive_product_id ); } } 
Минимальный вес всех товаров в корзине
 <?php // Minimum weight of all the products in the cart function qualifies_for_incentive() { // Incentive product we are giving away $incentive_product_id = 102; if( qualifies_basedon_weight( 10 ) ) { add_incentive_to_cart( $incentive_product_id ); } else { remove_incentive_from_cart( $incentive_product_id ); } } 
Всего в корзине, исключая налоги
 <?php // Cart's Total Excluding Taxes function qualifies_for_incentive() { // Incentive product we are giving away $incentive_product_id = 102; if( qualifies_basedon_cart_total( 199 ) ) { add_incentive_to_cart( $incentive_product_id ); } else { remove_incentive_from_cart( $incentive_product_id ); } } 
Товар из категории в корзине
 <?php // Product From A Category In The Cart function qualifies_for_incentive() { // Incentive product we are giving away $incentive_product_id = 102; if( qualifies_basedon_product_category( 'premium-quality' ) ) { add_incentive_to_cart( $incentive_product_id ); } else { remove_incentive_from_cart( $incentive_product_id ); } } 

Смешивая это

Поскольку у нас очень гибкая кодовая база, вы можете смешать ее и сделать вашу программу стимулирования уникальной. Ниже приведены еще несколько примеров, показывающих, как легко добавлять дополнительные условия по мере необходимости.

Товар из категории в корзине или минимальная сумма в корзине
 <?php // Product From A Category In The Cart OR Minimum Cart Total function qualifies_for_incentive() { // Incentive product we are giving away $incentive_product_id = 102; if( qualifies_basedon_product_category( 'premium-quality' ) || qualifies_basedon_cart_total( 199 ) ) { add_incentive_to_cart( $incentive_product_id ); } else { remove_incentive_from_cart( $incentive_product_id ); } } 
Товар из категории и минимальной суммы в корзине
 <?php // Product From A Category AND Minimum Cart Total function qualifies_for_incentive() { // Incentive product we are giving away $incentive_product_id = 102; if( qualifies_basedon_product_category( 'premium-quality' ) && qualifies_basedon_cart_total( 199 ) ) { add_incentive_to_cart( $incentive_product_id ); } else { remove_incentive_from_cart( $incentive_product_id ); } } 

Вы даже можете продвинуться дальше и создать более сложные сценарии. Следующим шагом для вас будет превратить это в «Класс», чтобы у вас было более одной программы стимулирования, каждая со своим уникальным набором правил для квалификации.

Вот именно для этой статьи. В третьей части этой серии мы будем работать с действиями и фильтрами, которые запускаются на экранах Новый продукт / Редактировать продукт. Затем мы рассмотрим, как добавить пользовательские поля в «Экраны продуктов», используя только API.