Buenos días
Al hilo del otro ticket que está cerrado, abro éste para solicitar ayuda nuevamente.
Os comento, hace unas semanas, Pepe, me envío un código para poder poner la fecha estimada de reposición de productos.
Obviamente, está funcionando perfectamente pero con la incidencia de que en productos variables no aparece, tampoco el campo para indicar la fecha de reposición.
Lógicamente, el principal no se altera, tan sólo se actualizan las variaciones (stock y/o precios).
Os pongo enlaces para que veáis:
- Productos individuales : https://clon.tsaco.es/intenso-lapiz-usb-office-line-32gb-usb-a-3-2 o https://clon.tsaco.es/msi-ventus-geforce-rtx-5080-16g-3x-oc-plus-gddr7
- Producto variable : https://clon.tsaco.es/cougar-ranger-elite-sillon-gaming
(el enlace corresponde al clon que tenemos para hacer pruebas).
Quedo pendiente.
Contenido solo visible a usuarios registrados
Hola Antonio.
Esto igual se complica un poco mas pero bueno vamos a ver si podemos solucionarlo.
Añade lo siguiente al plugin de fragmentos de código:
// 1. Mostrar campo de fecha de reposición en cada variación (admin)
add_action('woocommerce_variation_options_pricing', 'we_mostrar_fecha_reposicion_variacion', 10, 3);
function we_mostrar_fecha_reposicion_variacion($loop, $variation_data, $variation) {
woocommerce_wp_text_input([
'id' => 'fecha_reposicion_' . $loop,
'name' => 'fecha_reposicion[' . $loop . ']',
'value' => get_post_meta($variation->ID, '_fecha_reposicion', true),
'label' => __('Fecha de reposición', 'woocommerce'),
'desc_tip' => true,
'description' => __('Fecha estimada de reposición (formato: YYYY-MM-DD)', 'woocommerce'),
'type' => 'date'
]);
}
// 2. Guardar el campo de fecha al guardar la variación
add_action('woocommerce_save_product_variation', 'we_guardar_fecha_reposicion_variacion', 10, 2);
function we_guardar_fecha_reposicion_variacion($variation_id, $i) {
if (isset($_POST['fecha_reposicion'][$i])) {
update_post_meta($variation_id, '_fecha_reposicion', sanitize_text_field($_POST['fecha_reposicion'][$i]));
}
}
// 3. Mostrar la fecha de reposición en el frontend si la variación está agotada (formato en español)
add_action('woocommerce_single_product_summary', 'we_mostrar_fecha_reposicion_frontend', 25);
function we_mostrar_fecha_reposicion_frontend() {
global $product;
if (!$product->is_type('variable')) return;
?>
<div id="mensaje-fecha-reposicion" style="margin-top: 10px;"></div>
<script>
jQuery(document).ready(function($) {
const formularioVariaciones = $('form.variations_form');
formularioVariaciones.on('found_variation', function(event, variation) {
const $mensajeDiv = $('#mensaje-fecha-reposicion');
const hayStock = variation.is_in_stock;
const fechaReposicion = variation.fecha_reposicion;
if (!hayStock && fechaReposicion) {
const meses = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'];
const partes = fechaReposicion.split('-');
const fechaFormateada = `${parseInt(partes[2])} de ${meses[parseInt(partes[1]) - 1]} de ${partes[0]}`;
$mensajeDiv.html('<strong>Fecha estimada de reposición:</strong> ' + fechaFormateada);
} else {
$mensajeDiv.html('');
}
});
});
</script>
<?php
}
// 4. Añadir la fecha de reposición a los datos de variación que WooCommerce pasa al frontend
add_filter('woocommerce_available_variation', 'we_agregar_fecha_reposicion_a_variacion');
function we_agregar_fecha_reposicion_a_variacion($datos_variacion) {
$fecha = get_post_meta($datos_variacion['variation_id'], '_fecha_reposicion', true);
$datos_variacion['fecha_reposicion'] = $fecha;
return $datos_variacion;
}
Si editas una variación de un producto podrás ver que hay un nuevo campo para añadir la fecha de reposición de ese producto.
Un Saludo
@pepesoler, buenos días
Lamento ver que se nos complica el tema, por eso era saber si había algún plugin que hiciera lo que queremos.
En el código anterior que me pasaste el meta era "fecha_reposicion" y ahora me indicas "_fecha_reposicion"; si lo cambio daría algún problema?
El anterior código es:
// Muestra la fecha de reposición solo si el producto está agotado
add_action('woocommerce_single_product_summary', 'we_mostrar_fecha_reposicion_producto', 25);
function we_mostrar_fecha_reposicion_producto() {
global $post, $product;
if ( ! $product->is_in_stock() ) {
$fecha = get_field('fecha_reposicion', $post->ID);
if ($fecha) {
echo '<p class="mastock"><strong>Fecha estimada de reposición:</strong> ' . date_i18n('d/m/Y', strtotime($fecha)) . '</p>';
}
}
}
// Muestra la fecha de reposición en la tienda, solo si el producto está agotado
add_action('woocommerce_after_shop_loop_item_title', 'we_mostrar_fecha_reposicion_en_loop', 15);
function we_mostrar_fecha_reposicion_en_loop() {
global $product, $post;
if ( ! $product->is_in_stock() ) {
$fecha = get_field('fecha_reposicion', $post->ID);
if ($fecha) {
echo '<p class="mastock fecha-reposicion-loop">Reposición: ' . date_i18n('d/m/Y', strtotime($fecha)) . '</p>';
}
}
}
// Muestra la fecha de reposición en el checkout para productos agotados
add_action('woocommerce_checkout_after_order_review', 'we_mostrar_fechas_reposicion_en_checkout');
function we_mostrar_fechas_reposicion_en_checkout() {
echo '<div class="fecha-reposicion-checkout" style="margin-top: 20px;">';
foreach (WC()->cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$product_id = $product->get_id();
if ( ! $product->is_in_stock() ) {
$fecha = get_field('fecha_reposicion', $product_id);
if ($fecha) {
$nombre = $product->get_name();
$fecha_formateada = date_i18n('d/m/Y', strtotime($fecha));
echo '<p class="mastock"><strong>' . esc_html($nombre) . '</strong><br>Fecha estimada de reposición: ' . esc_html($fecha_formateada) . '</p>';
}
}
}
echo '</div>';
}
Hola Antonio.
Son dos cosas distintas, no tienes que eliminar el anterior, el de antes lo utilizas para los productos padre y este ultimo seria para las variaciones, tienes que mantener los dos.
Un saludo
@pepesoler, vaaale, pero como se me crean dos "metas diferentes" y con diferente formato (20250711 ó 11/07/2025), pues por eso consulto.
Vale, veré como lo hago para subir con los csv.
Hola Antonio.
Ok, dejo el hilo abierto por si necesitas retomarlo.
Un Saludo