WooCommerce Product Type

Vuoi capire meglio cosa sono i Product Type di WooCommerce e vorresti capire come gestirli?

In questa pagina proverò a spiegarti come ottenere i product type, come crearne di nuovi personalizzati e come rimuovere quelli presenti di default.

Quali sono i Product Type di WooCoommerce

Di default WooCommerce offre 4 tipi di prodotto:

  • simple
  • grouped
  • external/affiliate
  • variable

In più sono presenti due variazioni del tipo di prodotto simple:

  • virtual
  • downloadable

Cosa sono i Product Type di WooCommerce

I product type sono registrati come delle tassonomie.

Il tipo di prodotto di WooCommerce viene salvato nel custom post type product, usando un custom taxonomy chiamata product_type.

In breve, sono registrati come delle tassonomie.

Esempio nel database:

  • Post type: product
  • Taxonomy: product_type con valore simple, variable, grouped, external.

Come ottenere i product type di WooCommerce

Per poter ottenere i product type di WooCommerce basta usare questo codice:

/**
 * Ottiene i product type core di WooCommerce.
 *
 * @return array Associativo: slug => etichetta
 */
function riaco_get_core_product_types() {
	// Core WooCommerce product types.
	$product_types = wc_get_product_types();
	return $product_types;
}

Ecco come potresti usarlo:

$product_types = riaco_get_core_product_types();
echo '<pre>' . print_r( $product_types, true ) . '</pre>';

E otterrai un risultato simile a:

Array
(
    [simple] => Simple product
    [grouped] => Grouped product
    [external] => External/Affiliate product
    [variable] => Variable product
)

Come ottenere i product type di un prodotto specifico

Per ottenere il product type di un prodotto specifico hai due modi:

  • get_type()
  • is_type()

Come usare il metodo get_type()

$product_id = 1;
$product = wc_get_product( $product_id );

if ( $product ) {
    $product_type = $product->get_type();
    echo 'Tipo di prodotto: ' . $product_type;
    if('simple' === $product_type){
        // logica per il prodotto 
    }
} else {
    echo 'Prodotto non trovato.';
}

Come usare il metodo is_type()

$product_id = 1;
$product = wc_get_product( $product_id );

if ( $product ) {
    if ( $product->is_type( 'simple' ) ) {
        echo 'Il prodotto è di tipo: simple';
    } elseif ( $product->is_type( 'variable' ) ) {
        echo 'Il prodotto è di tipo: variable';
    } elseif ( $product->is_type( 'grouped' ) ) {
        echo 'Il prodotto è di tipo: grouped';
    } elseif ( $product->is_type( 'external' ) ) {
        echo 'Il prodotto è di tipo: external';
    } else {
        echo 'Tipo di prodotto personalizzato: ' . $product->get_type();
    }
} else {
    echo 'Prodotto non trovato.';
}

Il metodo is_type() accetta:

  • una stringa:
$product->is_type( 'simple' );
  • un array di product type:
$product->is_type( [ 'simple', 'variable' ] );

Come controllare se un prodotto è Virtual o Downloadable

Virtual e Downloadable non sono esattamente dei product type, quindi non puoi usare get_type() o is_type() come abbiamo visto prima.

Per controllare se un prodotto è virtuale o scaricabile, possiamo usare questi metodi:

  • is_virtual()
  • is_downloadable()
$product_id = 1;
$product = wc_get_product( $product_id );

if ( $product ) {
    if ( $product->is_virtual() ) {
        echo "Il prodotto è virtuale.<br>";
    } else {
        echo "Il prodotto NON è virtuale.<br>";
    }

    if ( $product->is_downloadable() ) {
        echo "Il prodotto è scaricabile.<br>";
    } else {
        echo "Il prodotto NON è scaricabile.<br>";
    }
} else {
    echo "Prodotto non trovato.";
}

Le proprietà “Virtuale” e “Scaricabile” dei prodotti sono gestite come custom field (meta dati di WordPress), quindi sono salvati nella tabella wp_postmeta.

Come creare Product Type personalizzati

Per poter aggiungere un custom type personalizzato in WooCommerce, bisogna seguire questi passaggi.

  1. Registrare il tipo nel selettore (woocommerce_product_type_selector)
  2. Definire la classe del prodotto (WC_Product_TUOTIPO)
  3. Estendendi WC_Product per definire il nuovo product type
// 1. Aggiungi il tipo prodotto al selettore admin
function riaco_add_custom_product_type( $types ) {
	$types['custom_type'] = esc_html__( 'Prodotto Personalizzato', 'woocommerce' );
	return $types;
}
add_filter( 'product_type_selector', 'riaco_add_custom_product_type' );

// 2. Registra la classe del nuovo tipo prodotto
function riaco_register_custom_product_class( $class_name, $product_type ) {
	if ( 'custom_type' === sanitize_key( $product_type ) ) {
		$class_name = 'WC_Product_Custom_Type';
	}
	return $class_name;
}
add_filter( 'woocommerce_product_class', 'riaco_register_custom_product_class', 10, 2 );

// 3. Definisci la classe prodotto personalizzata
add_action(
	'init',
	function () {
		if ( class_exists( 'WC_Product' ) ) {
			class WC_Product_Custom_Type extends WC_Product {
				public function get_type() {
					return 'custom_type';
				}
			}
		}
	}
);

Ecco il risultato:

prodotto personalizzato type woocommerce

E nella schermata dei Prodotti, è possibile filtrare per questo nuovo Prodotto Personalizzato usando le funzionalità native di WooCommerce:

filtro prodotto personalizzato type woocommerce

Rimuovere il tab Attributi per il product type personalizzato

Puoi nascondere il tab “Attributi” nel pannello di modifica prodotto di WooCommerce per un product type personalizzato, ad esempio il nostro custom_type usando il filtro woocommerce_product_data_tabs e la classe hide_if_custom_type.

/**
 * Rimuove il tab "Attributi" per il tipo di prodotto personalizzato.
 */
function riaco_remove_attributes_tab_for_custom_type( $tabs ) {
	$tabs['attribute']['class'][] = 'hide_if_custom_type';
	return $tabs;
}
add_filter( 'woocommerce_product_data_tabs', 'riaco_remove_attributes_tab_for_custom_type', 10 );
Rimuovere attributi tab Edit product woocommerce

Mostrare il tab Generale e Inventario per product type personalizzato

Il tab “Generale” (quello con Prezzo regolare, Prezzo scontato, Tasse) è visibile solo per alcuni tipi di prodotto.

Infatti quando crei il tuo custom product type non lo vedrai comparire di default.

Ma lo puoi mostrare usando il filtro woocommerce_product_data_tabs.

function riaco_add_class_to_general_fields() {
	// Aggiungi la classe condizionale corretta via JS
	wc_enqueue_js(
		"
		// Quando il tipo prodotto cambia
		$( document.body ).on( 'woocommerce-product-type-change', function( event, type ) {
			if ( type === 'custom_type' ) {
				// WooCommerce controllerà la visibilità in base alle classi
				$('#general_product_data .pricing').addClass('show_if_custom_type');
			}
		});
	"
	);

	// Se il prodotto è già caricato come custom_type (iniziale)
	global $post;
	if ( $post ) {
		$product = wc_get_product( $post->ID );
		if ( $product && $product->get_type() === 'custom_type' ) {
			wc_enqueue_js(
				"
				$('#general_product_data .pricing').addClass('show_if_custom_type');
				$('#product-type').trigger('change');
			"
			);
		}
	}
}
add_action( 'woocommerce_product_options_general_product_data', 'riaco_add_class_to_general_fields' );

Come rimuovere i product type presenti di default

Per rimuovere i product type di WooCommerce presenti di default basta fare un unset della variabile del product type:

function riaco_remove_default_product_types( $types ) {
    // Rimuovo tutti i tipi di default (esempio)
    unset( $types['simple'] );
    unset( $types['variable'] );
    unset( $types['grouped'] );
    unset( $types['external'] );

    return $types;
}
add_filter( 'product_type_selector', 'riaco_remove_default_product_types' );

La stessa cosa la puoi fare per un product type personalizzato:

function riaco_remove_custom_product_types( $types ) {
    // Rimuovo product type personalizzato 'subscriptions'
 
    unset( $types['subscriptions'] );

    return $types;
}
add_filter( 'product_type_selector', 'riaco_remove_custom_product_types' );

Sponsor

Vhosting
themeforest