Woocommerce: cómo verificar el tipo de producto en el complemento

3 minutos de lectura

Soy bastante nuevo en wordpress/woocommerce y acabo de empezar a jugar con la creación de un complemento personalizado.

Hasta ahora, he agregado mi configuración personalizada de woocommerce a través de la API.

Me encontré con un problema en el que quiero agregar un campo personalizado en un solo producto en la pestaña de datos del producto.

Logré mostrarlo usando el siguiente código:

add_action( 'woocommerce_product_options_general_product_data', array( $this, 'cuzd_general_fields' ) );
add_action( 'woocommerce_process_product_meta', array( $this, 'cuzd_general_fields_save') );

Sin embargo, ahora necesito verificar si el tipo de producto es simple o una variación. Intenté lo siguiente:

$product = new WC_Product( get_the_ID() );
        if( $product->is_type( 'simple' ) ) {
          //
}

Sin embargo me sale un error:

 Fatal error: Class 'WC_Product' not found in ....

Tengo la buena sensación de que estoy tratando de iniciar la clase Producto antes de que se llame. Lo más probable es que tenga todo el formato del complemento de clase incorrecto. Se agradecería cualquier material de lectura con buenas instrucciones/mejores prácticas.

De lo contrario, si lo anterior es una solución simple, házmelo saber.

avatar de usuario
helgatheviking

Lo más pronto que podría esperar acceder a cualquier clase de Woo sería el woocommerce_loaded gancho que ahora se dispara en el plugins_loaded gancho. Si estás ahorrando en el woocommerce_process_product_meta gancho, entonces cualquier devolución de llamada tendría todas las clases cargadas correctamente. Si está probando fuera de esa devolución de llamada (y no está conectado a ningún gancho en absoluto … sería posible que las clases no se cargaran correctamente).

Además, si está intentando llamar get_the_ID() antes de WP_Post se ha configurado el objeto, no obtendrá un valor correcto.

una mas completa cuzd_general_fields_save la rutina quedaría así:

/**
 * Save meta box data.
 *
 * @param int     $post_id WP post id.
 */
public function cuzd_general_fields_save( $post_id ) {

    $_product = wc_get_product( $post_id );

    if( $_product->is_type( 'simple' ) ) {
    // do stuff for simple products
    } else {
    // do stuff for everything else
    }

    $_product->save();

}

Una actualización para Woo 3.0 sería usar el woocommerce_admin_process_product_object por lo que ya no necesita instanciar el objeto del producto o ejecutar save() ya que Woo se encargará de eso en el núcleo.

add_action( 'woocommerce_admin_process_product_object', array( $this, 'cuzd_general_fields_save') );

y la devolución de llamada se modificaría a:

/**
 * Save meta box data.
 *
 * @param obj $_product WC_Product.
 */
public function cuzd_general_fields_save( $_product ) {

    if( $_product->is_type( 'simple' ) ) {
    // do stuff for simple products
    } else {
    // do stuff for everything else
    }

}

  • Para mí, al menos, el tipo de producto de variación es “variable”, no “variación”. Puede haber cambiado desde la respuesta original, pero creo que vale la pena señalarlo para futuras referencias.

    – Tuure

    17 mayo 2017 a las 16:13

  • @Tuure Variable y variación existen. El tipo de producto “variable” significa que es el producto principal el que contiene múltiples productos secundarios de “variación”. Las variaciones no se muestran como productos separados en la lista de productos, sino que en realidad son publicaciones de productos propias.

    – Berend

    20 de mayo de 2017 a las 7:17

  • ¡Gracias por la aclaración!

    – Tuure

    22 de mayo de 2017 a las 10:57

  • Pero si no se encuentra la clase, ¿por qué el problema está en el argumento? ¿Estás seguro de que esta es la respuesta correcta?

    – svelandiag

    1 mayo 2020 a las 21:55

  • Me encanta SO, Preguntas y respuestas de 5 años me ayudaron, Saludos

    – Abdul Rehman

    4 mayo 2020 a las 20:15

Esta es una forma de verificar el tipo de producto sin crear una instancia del producto:

$product_type = get_the_terms( $product_id,'product_type')[0]->slug;

  • Upvoting para obtener un mejor alcance. Estaba buscando la cosa exacta.

    – bhanu

    24 de diciembre de 2020 a las 17:16

Una manera fácil es simplemente verificar el valor de lo publicado select. Entonces puedes:

$product_type = $_POST['product-type'];

if ( $product_type == 'simple' ) {
 // do what you want
}

¿Ha sido útil esta solución?