Это статья является продолжение вот этой статьи. В ней мы рассмотрим более интересные примеры работы с 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)