Problema con fechas, idiomas y Wordpress

  • Autor Autor adruiz
  • Fecha de inicio Fecha de inicio
adruiz

adruiz

VIP
Gamma
Verificación en dos pasos activada
Verificado por Whatsapp
Suscripción a IA
Tengo un problema que me trae de cabeza con un proyecto en WordPress y el idioma de las fechas. Intentaré resumirlo.

El idioma de WordPress lo tengo configurado en Español, por otro lado, tengo algunos metabox que guardan fechas mediante un input date, los cuales almacenan por defecto las fechas en el formato YYYY-MM-DD.

A la hora de recopilar esta información necesito que se muestre con el formato "DD de MM del YY" (12 de mayo del 2007), para ello primero paso la fecha original a una marca de tiempo en Unix con strtotime(), y después la formateo con sfrftime().

Básicamente, algo así:
PHP:
$meta = get_post_meta($post_id, 'date');
$unix = strtotime($meta);
$date = strftime("%d de %B del %Y", $unix);

Pero ocurre que me devolvía fechas en inglés, en plan, "12 de May del 2007".

Al principio el problema lo tenía en localhost y como uso Apache24 no le dí mucha importancia porque creo que en PHP 7.4 no tengo español instalado, supuse que en producción no pasaría lo mismo, pero vi que sí, así que no es problema de los paquetes de idiomas.

Estuve trasteando con timezones y setlocales, finalmente timezones no uso ninguno a nivel de código porque luego WordPress me muestra una alerta en el área de seguridad, en cambio setlocale, tras probar varias configuraciones, con este me funciona, tanto en localhost como en producción:
PHP:
setlocale(LC_TIME, 'es_ES', 'Spanish_Spain', 'Spanish');

Está puesto en el wp-config.php.

Entonces, ¿qué problema tengo? Pues que a veces falla. A veces veo que toda la web me está devolviendo esas fechas en inglés, con refrescar la página deja de hacerlo y vuelven a mostrarse en español, pero ahora me fijo que también me ocurre desde el dashboard de WordPress, en algunas áreas del editor de artículos donde muestro esa información, y por mucho que refresque se sigue mostrando en inglés, y esta vez solo ocurre en producción.

¿Alguien tiene alguna idea de qué podría estar pasando? ¿Tal vez no estoy formateando las fechas correctamente?

Os leo.
 
Hola:

PHP:
$sql = "SET lc_time_names = 'es_ES'";
$mysqli->query($sql);

$sql = "SELECT date_format(fecha_hora,'%d-%m a las %H:%i:%s') as fecha_latino
                 FROM tabla
                WHERE ...";
$respuesta = $mysqli->query($sql);

La primera linea es la mas importante, le dice a mysql que el date_format este en castellano. Hay que ejecutarla justo antes de tu select.
 
Como viste, ante el problema, yo lo resolví en la BBDD.

Ahora, se me ocurre esta idea, en base a tu código:

PHP:
$meta = get_post_meta($post_id, 'date');
$unix = strtotime($meta);
setlocale(LC_TIME, 'es_ES', 'Spanish_Spain', 'Spanish'); // COLOCAR setlocale AQUI
$date = strftime("%d de %B del %Y", $unix);

Resumen: asegurate que el setlocale esté activo antes de obtener la fecha.
 
@fabgonber respecto a tu primera solución, el problema aquí es que todas las fechas creo que se han estado almacenando en la base de datos como un string plano, y cambiarlas todas recursivamente sería complicado. De todos modos seguirán habiendo casos donde pueda necesitar de esas fechas en otros formatos distintos, aunque sí que puede serme útil intentar cambiarlas todas al formato unix directamente en la bbdd.

Sobre recolocar el setlocale, se puede hacer, aunque eso implicaría repetir el mismo código en cada sitio donde muestro las fechas, y no sé si sería una buena práctica.
 
@fabgonber respecto a tu primera solución, el problema aquí es que todas las fechas creo que se han estado almacenando en la base de datos como un string plano, y cambiarlas todas recursivamente sería complicado.
Lo ideal es almacenar la fecha como datetime, cambiar todas las fechas es algo que harás una única vez, de ahí en adelante se almacenaran correctamente (haciendo los cambios en el código)

Sobre recolocar el setlocale, se puede hacer, aunque eso implicaría repetir el mismo código en cada sitio donde muestro las fechas, y no sé si sería una buena práctica.
no lo es, pero funciona.

Otra cosa que yo hago es esto:
1653484922358.webp

1653484868988.webp

1653484799523.webp

Resumen, al lado del datetime (fecha_hora) guardo la fecha_hora_fancy (en castellano, como quiero que se vea)
 
Pregunta tonta, pero que a veces pasa. En el general del wordpress tienes el setting de writting en el formato de fecha correcto? Otra prueba que puedes hacer:


PHP:
$meta = get_post_meta($post_id, 'date');
$aDate = date("d-m-Y", strtotime($meta));
 
@fabgonber plantearé hacer un cambio directamente en la bbdd y cambiar también cómo se almacenan las fechas. Es cierto que desde el principio no se estaban almacenando del modo correcto, por entonces no se me ocurrió ninguno de estos escenarios (ni siquiera pensaba mostrar las fechas desde el frontend).

Tu otra solución me parece útil, pero yo soy de los que prefieren soluciones con el mínimo código posible y aprovechando al máximo los recursos del lenguaje. Manías mías 🤣 Aunque es verdad que con esto tienes más control sobre lo que ocurre, así que valoraré todas las opciones. Gracias, por cierto.

Pregunta tonta, pero que a veces pasa. En el general del wordpress tienes el setting de writting en el formato de fecha correcto? Otra prueba que puedes hacer:

PHP:
$meta = get_post_meta($post_id, 'date');
$aDate = date("d-m-Y", strtotime($meta));

Si te refieres a estos ajustes del wordpress:
CzRn7Qf.png


Están tal como se ven en la imagen. Pero tengo entendido que estos ajustes son solo para fechas de WordPress, (the_time(), the_date(), etc), no afecta a fechas creadas con PHP.

Con date() tengo que probarlo, pero a priori creo que ya lo miré hace tiempo y el resultado es el mismo.
 
Atrás
Arriba