I'm selling a plugin that would enable to use Custom Post Type as "product" of WooCommerce. Я сделал много работы над этим, чтобы сделать его совместимым с WooCommerce 3.0
Но вот самая важная часть.
Необходимо создать собственное хранилище данных, подобное этому:
Сначала создайте класс, который простирается до WC_Product_Data_Store_CPT
. Идея состоит в том, чтобы перезаписать существующую функцию этого класса, которая проверяет тип сообщения. Я нашел read
и get_product_type
, что делает проверку.
class WCCPT_Product_Data_Store_CPT extends WC_Product_Data_Store_CPT {
/**
* Method to read a product from the database.
* @param WC_Product
*/
public function read(&$product) {
$product->set_defaults();
if (! $product->get_id() || ! ($post_object = get_post($product->get_id())) || ! in_array($post_object->post_type, array('birds', 'product'))) { // change birds with your post type
throw new Exception(__('Invalid product.', 'woocommerce'));
}
$id = $product->get_id();
$product->set_props(array(
'name' => $post_object->post_title,
'slug' => $post_object->post_name,
'date_created' => 0 < $post_object->post_date_gmt ? wc_string_to_timestamp($post_object->post_date_gmt) : null,
'date_modified' => 0 < $post_object->post_modified_gmt ? wc_string_to_timestamp($post_object->post_modified_gmt) : null,
'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);
}
/**
* Get the product type based on product ID.
*
* @since 3.0.0
* @param int $product_id
* @return bool|string
*/
public function get_product_type($product_id) {
$post_type = get_post_type($product_id);
if ('product_variation' === $post_type) {
return 'variation';
} elseif (in_array($post_type, array('birds', 'product'))) { // change birds with your post type
$terms = get_the_terms($product_id, 'product_type');
return ! empty($terms) ? sanitize_title(current($terms)->name) : 'simple';
} else {
return false;
}
}
}
после этого добавьте фильтр woocommerce_data_stores
и использовать свой класс.
add_filter('woocommerce_data_stores', 'woocommerce_data_stores');
function woocommerce_data_stores ($stores) {
$stores['product'] = 'WCCPT_Product_Data_Store_CPT';
return $stores;
}
с этим, вы будете иметь возможность добавить тип пост birds
в корзину. Но на самом деле не будет успеха добавить в корзину. Потому что нет цены, тележка откажется от нее.
Чтобы решить, что вам нужен еще один фильтр. Ниже приведен простой способ добавления цены.
add_filter('woocommerce_product_get_price', 'woocommerce_product_get_price', 10, 2);
function woocommerce_product_get_price($price, $product) {
if ($product->get_id() == 815) {
$price = 10;
}
return $price;
}
Как только это будет сделано, у вас будет успех в добавлении в корзину.
«Мне любопытно, и заранее пакетное решение не то, что я ищу.«Но вы можете узнать тонну, глядя на то, как плагин что-то делает. Я никогда не слышал об этом плагине раньше, но я бросаю 5 долларов, чтобы увидеть, что находится под капотом ... и у меня даже нет немедленное использование для этого. – helgatheviking