Публикация в группе: Полезное для WordPress

Категории группы: Полезное

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

Таким способом создается эффект изменение цены товара на лету.

1

Автор публикации

не в сети 7 месяцев

spoot@bk.ru

85
Комментарии: 54Публикации: 23Регистрация: 09-03-2016Продаж/Покупок: 0/0