Created
April 22, 2025 23:16
-
-
Save racmanuel/ce902a9b8d48ad591e4d590aa19cdd43 to your computer and use it in GitHub Desktop.
Meetup - WordPress Queretaro
This file contains hidden or 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 | |
/** | |
* Plugin Name: Cotizador de Regalos | |
* Description: Plugin para cotizar regalos personalizados. | |
* Version: 1.0 | |
*/ | |
// ✅ Configurar ACF para guardar y cargar campos desde la carpeta del plugin | |
add_filter('acf/settings/save_json', function () { | |
return plugin_dir_path(__FILE__) . 'acf-json'; | |
}); | |
add_filter('acf/settings/load_json', function ($paths) { | |
// Eliminar la ruta por defecto (del theme) | |
unset($paths[0]); | |
// Agregar la ruta de este plugin | |
$paths[] = plugin_dir_path(__FILE__) . 'acf-json'; | |
return $paths; | |
}); | |
add_action('template_redirect', function () { | |
// Asegúrate de que solo se ejecute en la página que contiene el formulario | |
if (is_page('pagina-ejemplo')) { // cambia por el slug o ID real de tu página | |
acf_form_head(); | |
} | |
}); | |
// Registrar el shortcode que mostrará el formulario en el frontend | |
add_shortcode('acf_form_caja_regalo', function () { | |
// Inicia el almacenamiento en búfer para capturar la salida del formulario y retornarla como texto | |
ob_start(); | |
// Renderiza el formulario de ACF en el frontend | |
acf_form([ | |
// Indica que se creará un nuevo post al enviar el formulario | |
'post_id' => 'new_post', | |
// Define el tipo de post y su estado al ser creado | |
'new_post' => [ | |
'post_type' => 'cajas_de_regalo', // Este es tu Custom Post Type | |
'post_status' => 'publish', // El nuevo post se publicará automáticamente | |
], | |
// ID del grupo de campos de ACF que se usará en este formulario | |
'field_groups' => ['group_6807cf396fd10'], // Reemplazar con el KEY de tu grupo real | |
// Texto del botón de envío del formulario | |
'submit_value' => 'Agregar Caja al Carrito 🎁', | |
]); | |
// Devuelve el formulario como contenido del shortcode | |
return ob_get_clean(); | |
}); | |
add_action('acf/save_post', 'caja_agregar_producto_al_carrito', 20); | |
function caja_agregar_producto_al_carrito($post_id) | |
{ | |
// Obtener valores del formulario | |
$ocasion = get_field('ocasion', $post_id); | |
$contenido = get_field('contenido_caja', $post_id); | |
$mensaje = get_field('mensaje_personalizado', $post_id); | |
$color_caja = get_field('color_caja', $post_id); | |
// Asegurar que contenido sea array | |
if (! is_array($contenido)) { | |
$contenido = $contenido ? [$contenido] : []; | |
} | |
// ID del producto base (virtual, sin inventario) | |
$producto_id = 61; // Cambiar por el ID real | |
// Agregar producto al carrito con la info personalizada | |
WC()->cart->add_to_cart($producto_id, 1, 0, [], [ | |
'caja_regalo' => [ | |
'ocasion' => $ocasion, | |
'contenido' => $contenido, | |
'mensaje' => $mensaje, | |
'color_caja' => $color_caja, | |
], | |
]); | |
wp_redirect(wc_get_cart_url()); | |
exit; | |
} | |
// Aplica un fee adicional basado en los contenidos seleccionados por el usuario | |
add_action('woocommerce_cart_calculate_fees', 'caja_aplicar_fee_contenido', 20, 1); | |
function caja_aplicar_fee_contenido($cart) | |
{ | |
if (is_admin() && ! defined('DOING_AJAX')) { | |
return; | |
} | |
$fee_aplicado = false; | |
foreach ($cart->get_cart() as $item) { | |
// Verificamos que el ítem tenga datos personalizados bajo 'caja_regalo' | |
if (! isset($item['caja_regalo'])) { | |
continue; | |
} | |
$datos = $item['caja_regalo']; | |
// Verificamos que tenga contenido definido | |
if (empty($datos['contenido'])) { | |
continue; | |
} | |
// Aseguramos que el contenido sea un array | |
$contenido = is_array($datos['contenido']) ? $datos['contenido'] : [$datos['contenido']]; | |
// Definimos el precio individual para cada tipo de contenido | |
$precios = [ | |
'chocolates' => 20, | |
'velas_aromaticas' => 30, | |
'vino' => 45, | |
'peluche' => 40, | |
'tarjeta_personalizada' => 10, | |
]; | |
$fee_total = 0; | |
// Recorremos cada ítem del contenido para calcular su precio | |
foreach ($contenido as $opcion) { | |
$opcion_key = strtolower(trim($opcion)); | |
$precio = $precios[$opcion_key] ?? 0; | |
$fee_total += $precio; | |
} | |
if ($fee_total > 0 && ! $fee_aplicado) { | |
$cart->add_fee('Contenido de la caja', $fee_total); | |
$fee_aplicado = true; | |
} | |
} | |
} | |
// Muestra los datos personalizados en el carrito y checkout | |
add_filter('woocommerce_get_item_data', 'caja_mostrar_detalles_en_carrito', 10, 2); | |
function caja_mostrar_detalles_en_carrito($item_data, $cart_item) | |
{ | |
if (! empty($cart_item['caja_regalo'])) { | |
$data = $cart_item['caja_regalo']; | |
if (! empty($data['ocasion'])) { | |
$item_data[] = [ | |
'name' => 'Ocasión', | |
'value' => ucfirst($data['ocasion']), | |
]; | |
} | |
if (! empty($data['color_caja'])) { | |
$item_data[] = [ | |
'name' => 'Color de la caja', | |
'value' => ucfirst($data['color_caja']), | |
]; | |
} | |
if (! empty($data['contenido'])) { | |
$contenido = is_array($data['contenido']) ? $data['contenido'] : [$data['contenido']]; | |
$item_data[] = [ | |
'name' => 'Contenido', | |
'value' => implode(', ', $contenido), | |
]; | |
} | |
if (! empty($data['mensaje'])) { | |
$item_data[] = [ | |
'name' => 'Mensaje personalizado', | |
'value' => $data['mensaje'], | |
]; | |
} | |
} | |
return $item_data; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment