Skip to content

Instantly share code, notes, and snippets.

@racmanuel
Created April 22, 2025 23:16
Show Gist options
  • Save racmanuel/ce902a9b8d48ad591e4d590aa19cdd43 to your computer and use it in GitHub Desktop.
Save racmanuel/ce902a9b8d48ad591e4d590aa19cdd43 to your computer and use it in GitHub Desktop.
Meetup - WordPress Queretaro
<?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