Last active
February 11, 2020 01:37
-
-
Save machelinos/1211053a49e35adf6aa8068f5be68389 to your computer and use it in GitHub Desktop.
Conditional fields in Woocommerce checkout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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