Vietare l’acquisto di un prodotto che non può essere spedito in una determinata città

Pubblicato da: Roberto Commenti: 0

Se hai necessità di vietare l’acquisto di un determinato prodotto, in quanto non hai modo di poterlo spedire in una determinata città, è possibile farlo con un semplice snippet.

Woocommerce utilizza il campo PROVINCIA, che nelle altre nazioni è inteso come STATO.

La via più facile è quella di sfruttare il controllo di woocommerce, quando in fase di fatturazione e/o spedizione, chiede la compilazione dei dati.

Questo snippet si avvia quando, alla compilazione, avviene il controllo del campo PROVINCIA.

Snippet utilizzabile se si fa solo spedizioni in ITALIA

 

/** * @snippet Vietare acquisto di un prodotto che non puo essere spedito in una determinata provincia*/
function your_states_shipping_settings(){
$results = array();
$results['type'] = true;
// Sostituisci BA con la provincia desiderata
$results['states'] = array( 'BA' );

if( $results['type'] ){
// Sostituisci 16 con l'id del prodotto in questione
$results['matching'] = array( 16 );
} else {
// Sostituisci "inventata" se vuoi farlo per categoria (Accetta ID, Slug o Nome)
$results['matching'] = array('inventata' );
}
// Messaggio
$results['message'] = __( "Non può essere spedito nella tua città. Eliminalo dal carrello per procedere con il restante acquisto", "woocommerce" );

return $results;
}

// Utility Controllo Carrello
function get_items_names( $matching, $package, $type ){
$product_names = array();

foreach( $package['contents'] as $item ){
if( $type ){
if( in_array( $item['data']->get_id(), $matching ) )
$product_names[] = $item['data']->get_name();
} else {
if( has_term( $matching, 'product_cat', $item['product_id'] ) )
$product_names[] = $item['data']->get_name();
}
}
return $product_names;
}

// Disabilita la spedizione
add_filter('woocommerce_package_rates','custom_states_shipping_rules', 10, 2 );
function custom_states_shipping_rules( $rates, $package ){
if( isset($package['destination']['state'] ) && isset($package['contents']) ){
$data = your_states_shipping_settings();

if( in_array( $package['destination']['state'] , $data['states'] ) )
return $rates;

$product_names = get_items_names( $data['matching'], $package, $data['type'] );

if( count($product_names) > 0 ){

foreach( $rates as $rate_id => $rate )
unset( $rates[$rate_id] );
}
}
return $rates;
}

// Fai apparire il messaggio
add_filter('woocommerce_cart_no_shipping_available_html','custom_states_shipping_notice', 10, 1 );
add_filter('woocommerce_no_shipping_available_html','custom_states_shipping_notice', 10, 1 );
function custom_states_shipping_notice( $html ){
$package = WC()->shipping->get_packages()[0];
if( isset($package['destination']['state'] ) && isset($package['contents']) ){

$data = your_states_shipping_settings();

if( in_array( $package['destination']['state'] , $data['states'] ) )
return $html;

$product_names = get_items_names( $data['matching'], $package, $data['type'] );

if( count($product_names) > 0 ){
$text = '"' . implode( '", "', $product_names ) . '" ' . $data['message'];
$html = wpautop( $text );
}
}
return $html;
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *