Skip to content

Instantly share code, notes, and snippets.

@machelinos machelinos/functions.php
Last active Sep 15, 2018

Embed
What would you like to do?
Conditional fields in Woocommerce checkout
<?php
function claserama_cart_only_has_virtual_product()
{
//Primero declaramos algunas variables que ocuparemos
$has_only_virtual=false; //Esta será la variable final que retornaremos y que nos dice si solo hay artículos virtuales en el pedido
$virtual_products = 0; //Primero iniciamos el contador de productos virtuales a 0
$total_products = 0; // Iniciamos el contador de todos los productos a cero
// Vamos a checar cada uno de los elementos que se encuentran en el carrito, uno por uno por medio de la función WC()->cart->get_cart() que nos regresa un objeto con cada uno de los elementos
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
//Si el elemento del carrito es del tipo "virtual" entonces agregamos uno a nuestro variable $virtual_products que cuenta la cantidad de productos virtuales
if($cart_item['data']->is_virtual()== true){
$virtual_products+=1;
}
//Sumamos uno a nuestro total de productos, independientemente de si el producto es virtual o no
$total_products+=1;
}
// Si al terminar el loop la cantidad de productos virtuales es igual a la cantidad de productos totales en el carrito, entonces quiere decir que solo hay productos virtuales por lo cual cambiamos a true el valor que retornaremos
if($virtual_products == $total_products){
$has_only_virtual = true;
}
//Si al terminar el loop la cantidad de productos virtuales no es igual a la cantidad de productos totales en el carrito, quiere decir que hay al menos un producto físico en nuestro carrito por lo cual el valor de nuestra variable $has_only_virtual seguirá en false
//Finalmente retornamos el valor true o false alojado en nuestra variable $has_only_virtual
return $has_only_virtual;
}
function claserama_unset_unneccesary_fields_checkout($fields){
//Verificar si en el carrito hay solamente productos virtuales mediante la función claserama_Cart_only_has_virtual_product() que creamos anteriormente
if( claserama_cart_only_has_virtual_product() == true ){
// Si la función nos retorna verdadero
//Creamos un array con los campos que queremos quitar de nuestro checkout si solo hay productos virtuales
$billing_keys = array(
'billing_phone', //campo de teléfono
'billing_address_1', // campo de dirección
'billing_city', // campo de ciudad
'billing_postcode', // campo de código postal
'billing_country', // campo de País
'billing_state' // campo de Estado
);
//Por cada uno de esos campos del array que creamos, lo eliminamos de nuestro array de $fields o campos del checkout mediante la función unset()
foreach($billing_keys as $key){
unset($fields['billing'][$key]);
}
}
//Eliminamos los campos innecesarios, esto es dependiendo de las necesidades de cada proyecto, en neustro caso nunca utilizamos estos campos por eso los quitamos indistintamente de si se requiere envío o no, por eso está fuera de nuestra condición anterior
unset($fields['billing']['billing_company']); // campo de la empresa
unset($fields['billing']['billing_address_2']); //Campo de dirección 2 opcional
unset($fields['shipping']['shipping_company']); // campo de empresa en envío
unset($fields['shipping']['shipping_address_2']); // campo de dirección 2 opcional en envío
//Finalente retornamos los campos de nuestro array $fields ya filtrados de acuerdo l tipo de productos que tenemos en el carrito
return $fields;
}
add_filter('woocommerce_checkout_fields','claserama_unset_unneccesary_fields_checkout');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.