Это статья является продолжение вот этой статьи. В ней мы рассмотрим более интересные примеры работы с WooCommerce.
Содержание
- 1. Добавление товаров на основе произвольного типа записи(Custom Post Type) в корзину.
- 2. Изменение цены товара на лету при добавлении в корзину.
1. Добавление товаров на основе произвольного типа записи(Custom Post Type) в корзину.
К примеру у нас есть проект на WordPress, где каталог товаров создан на основе произвольного типа записи(Custom Post Type). И нам нужно сделать возможность добавлять в корзину, и создать заказы используя WooCommerce. На самом деле все не так сложно как может показаться.
Нам потребуется вот такой класс:
class SP_Product_Data_Store_CPT extends WC_Product_Data_Store_CPT implements WC_Object_Data_Store_Interface, WC_Product_Data_Store_Interface { public function read( &$product ) { $customPostType = 'post'; $product->set_defaults(); if ( ! $product->get_id() || ! ( $post_object = get_post( $product->get_id())) || $customPostType !== $post_object->post_type) { } $id = $product->get_id(); $product->set_props( array( 'name' => $post_object->post_title, 'slug' => $post_object->post_name, 'status' => $post_object->post_status, 'description' => $post_object->post_content, 'short_description' => $post_object->post_excerpt, 'parent_id' => $post_object->post_parent, 'menu_order' => $post_object->menu_order, 'reviews_allowed' => 'open' === $post_object->comment_status, ) ); $this->read_attributes( $product ); $this->read_downloads( $product ); $this->read_visibility( $product ); $this->read_product_data( $product ); $this->read_extra_data( $product ); $product->set_object_read( true ); } }
Выносим его в отдельный файл(class-data-store-cpt.php). И подключаем в functions.php вот таким способом:
function sp_woocommerce_data_stores( $stores ) { require_once 'inc/class-data-store-cpt.php'; $stores['product'] = 'SP_Product_Data_Store_CPT'; return $stores; } add_filter('woocommerce_data_stores', 'sp_woocommerce_data_stores');
В $customPostType указываем свой тип записи.
Важно, поле в котором хранится цена, должно называться "_price", как у WooCommerce.
2. Изменение цены товара на лету при добавлении в корзину.
Давайте рассмотрим еще одни интересный пример работы с WooCommerce. Допустим появилась задача изменять стоимость товара в зависимости от вы браных параметров.
Код добавления товара будет иметь вот такой вид:
global $woocommerce; $productID = 16; $customPrice = 200; $customTitle = ' - custom'; $cart_item_data["custom_price"] = $customPrice; $cart_item_data["custom_ID"] = $productID; $cart_item_data["custom_product_name"] = get_the_title($productID).$customTitle; $woocommerce->cart->add_to_cart($productID, 1, '', array(), $cart_item_data);
$cart_item_data - массив с новыми значениями для товара(ID товара, цена и название);
Что бы увидеть изменение в корзине, нужно сделать перерасчет:
function apply_custom_price_to_cart_item( $cart_object ) { if( !WC()->session->__isset( "reload_checkout" )) { foreach ( $cart_object->cart_contents as $key => $value ) { if( isset( $value["custom_price"] ) ) { if($value['data']->id == $value["custom_ID"]){ $value['data']->set_price($value["custom_price"]); $value['data']->set_name($value["custom_product_name"]); } } } } } add_action('woocommerce_before_calculate_totals', 'apply_custom_price_to_cart_item', 99);
Суть здесь в том, что при добавлении товара в корзину, мы передаем массив $cart_item_data с нужными значениями. И во время перерасчета товаров в корзине, делаем проверку на их существование if(isset($value["custom_price"])). Если они существуют, то меняем текущие значения товара, на те которые передали в $cart_item_data.
Таким способом создается эффект изменение цены товара на лету.
Комментариев (0)