El tipo de publicación personalizada de WP ya no se puede agregar al carrito en woocommerce 3.0 anterior

4 minutos de lectura

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.

El tipo de publicacion personalizada de WP ya no se
Reigel

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á.

Tipo de publicación personalizada de WooCommerce

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.

Tipo de publicación personalizada de WooCommerce

  • ¡Muchas gracias! Realmente aprecio tu ayuda. Y también he revisado su complemento y estoy impresionado. Buen trabajo.

    – solomonculaste

    24 de abril de 2017 a las 7:53

  • @solomonculaste De nada. Marque esto como la respuesta si lo encontró correcto y útil.

    – Reigel

    24 de abril de 2017 a las 8:01


  • hola reigel, hice todo eso, aún así la publicación no se agrega

    – Amán Satija

    30 de abril de 2017 a las 10:08

  • tengo woo coomerce 3.04 instalado

    – Amán Satija

    30 de abril de 2017 a las 10:19

  • @NirmalGoswami, eso debería funcionar… pero también puedes agregar esa clase arriba de esta línea $stores['product'] = 'WCCPT_Product_Data_Store_CPT'; fácilmente … pero aún así, la mejor manera es crear un archivo de clase y requerirlo …

    – Reigel

    13 de diciembre de 2017 a las 1:36


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad