Skip to content

Instantly share code, notes, and snippets.

@machelinos
Last active February 11, 2020 01:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save machelinos/1211053a49e35adf6aa8068f5be68389 to your computer and use it in GitHub Desktop.
Save machelinos/1211053a49e35adf6aa8068f5be68389 to your computer and use it in GitHub Desktop.
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