Todavía puedo agregar un tipo de publicación personalizada al carrito en WooCommerce 2.6 simplemente agregando un filtro a ‘woocommerce_product_class’
function wc_product_class( $class, $product_type, $post_type ) {
if( 'my_custom_post_type_slug' == $post_type )
$class="WC_Product_Simple";
return $class;
}
add_filter( 'woocommerce_product_class', 'wc_product_class', 10, 3);
//This will echo the carti item id
echo WC()->cart->add_to_cart($custom_post_type_id, $quantity, null, null, array());
Desafortunadamente, esto aún no funciona en la última versión de WooCommerce. ¿Alguien podría ayudarme cuál es la solución para este problema? Cualquier sugerencia, comentario, solución es muy apreciada.
Estoy vendiendo un complemento que permitiría usar el tipo de publicación personalizada como “producto” de WooCommerce. Trabajé mucho en eso.
Pero esta es la parte más importante.
Tienes que crear tu propio almacén de datos, así:
primero crea una clase que se extienda a WC_Product_Data_Store_CPT
. La idea es sobrescribir la función existente de esta clase que verifica el tipo de publicación. encontré read
y get_product_type
que hace la comprobación.
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;
}
}
}
después de eso, agregue un filtro a woocommerce_data_stores
y usa tu clase.
add_filter( 'woocommerce_data_stores', 'woocommerce_data_stores' );
function woocommerce_data_stores ( $stores ) {
$stores['product'] = 'WCCPT_Product_Data_Store_CPT';
return $stores;
}
con eso, podrás agregar un tipo de publicación de birds
a la cesta. Pero en realidad no será un éxito añadirlo al carrito. Como no hay precio, el carrito lo rechazará.

Para resolver eso, necesitas otro filtro. A continuación se muestra una forma sencilla de añadir el precio.
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;
}
Una vez hecho esto, tendrá éxito al agregar al carrito.
