84 lines
4.1 KiB
PHP
84 lines
4.1 KiB
PHP
<?php
|
|
/**
|
|
* Ciclo carta nueva — ROTACIÓN de la "carta de la semana" en TODOS los idiomas.
|
|
*
|
|
* Rotación (en este orden, para no perder ninguna):
|
|
* 1) la que estaba en "semana pasada" -> queda solo en "otras semanas"
|
|
* 2) la que estaba en "semana actual" -> pasa a "semana pasada"
|
|
* 3) la carta NUEVA -> pasa a "semana actual"
|
|
*
|
|
* Robusto/autocorrige: la NUEVA es el parámetro CARTA; la "semana pasada" se
|
|
* deriva como la carta publicada más reciente que NO es la nueva (por fecha),
|
|
* no por quién estuviera en el término (que puede estar roto). Garantiza
|
|
* count=1 en "actual" y count=1 en "pasada" por idioma. "Otras semanas" (21)
|
|
* es el cajón base que conservan TODAS las cartas.
|
|
*
|
|
* Términos ES base (se derivan por Polylang a cada idioma):
|
|
* actual = 6 (cartasemana) | pasada = 22 (carta-semana-pasada) | otras = 21
|
|
*
|
|
* Uso: CARTA=<es_id> php rotate_cartas.php (dry-run)
|
|
* APPLY=1 CARTA=<es_id> php rotate_cartas.php
|
|
*/
|
|
require getenv('FEA_WP_LOAD') ?: '/var/www/html/wp-load.php';
|
|
$APPLY = getenv('APPLY') === '1';
|
|
$CARTA = (int)(getenv('CARTA') ?: 0);
|
|
if (!$CARTA) { fwrite(STDERR, "Falta CARTA=<es_id>\n"); exit(1); }
|
|
|
|
$actual_terms = pll_get_term_translations(6);
|
|
$pasada_terms = pll_get_term_translations(22);
|
|
$otras_terms = pll_get_term_translations(21);
|
|
$carta_tr = pll_get_post_translations($CARTA);
|
|
|
|
function cartas_en($terms) { // posts publish en cualquiera de esos términos (mismo idioma), por fecha desc
|
|
return get_posts(['post_type'=>'post','post_status'=>'publish','numberposts'=>-1,'fields'=>'ids',
|
|
'orderby'=>'date','order'=>'DESC','suppress_filters'=>true,
|
|
'tax_query'=>[['taxonomy'=>'category','field'=>'term_id','terms'=>array_values(array_filter($terms))]]]);
|
|
}
|
|
|
|
foreach ($actual_terms as $lang => $t_actual) {
|
|
$t_pasada = (int)($pasada_terms[$lang] ?? 0);
|
|
$t_otras = (int)($otras_terms[$lang] ?? 0);
|
|
$t_actual = (int)$t_actual;
|
|
$new = (int)($carta_tr[$lang] ?? 0);
|
|
|
|
// Conjunto de cartas de ESTE idioma (los términos ya son por idioma) por fecha desc.
|
|
$all = cartas_en([$t_actual, $t_pasada, $t_otras]);
|
|
// "semana pasada" = la más reciente que no es la nueva.
|
|
$prev = 0; foreach ($all as $pid) { if ($pid != $new) { $prev = $pid; break; } }
|
|
|
|
// Posts actualmente marcados como actual/pasada (conjunto pequeño a limpiar).
|
|
$flagged = get_posts(['post_type'=>'post','post_status'=>'any','numberposts'=>-1,'fields'=>'ids',
|
|
'suppress_filters'=>true,
|
|
'tax_query'=>[['taxonomy'=>'category','field'=>'term_id','terms'=>array_values(array_filter([$t_actual,$t_pasada]))]]]);
|
|
|
|
if ($APPLY) {
|
|
// 1) limpiar: quitar actual+pasada de cualquiera salvo los dos destinos.
|
|
foreach ($flagged as $pid) {
|
|
if ($pid == $new || $pid == $prev) continue;
|
|
wp_remove_object_terms($pid, array_values(array_filter([$t_actual,$t_pasada])), 'category');
|
|
}
|
|
// 2) NUEVA -> semana actual (y fuera de pasada). Mantener otras.
|
|
if ($new) {
|
|
wp_set_object_terms($new, [$t_actual], 'category', true);
|
|
if ($t_pasada) wp_remove_object_terms($new, [$t_pasada], 'category');
|
|
if ($t_otras) wp_set_object_terms($new, [$t_otras], 'category', true);
|
|
}
|
|
// 3) ANTERIOR -> semana pasada (y fuera de actual). Mantener otras.
|
|
if ($prev && $t_pasada) {
|
|
wp_set_object_terms($prev, [$t_pasada], 'category', true);
|
|
wp_remove_object_terms($prev, [$t_actual], 'category');
|
|
if ($t_otras) wp_set_object_terms($prev, [$t_otras], 'category', true);
|
|
}
|
|
clean_term_cache(array_filter([$t_actual,$t_pasada,$t_otras]), 'category');
|
|
}
|
|
|
|
$cleaned = count(array_diff($flagged, [$new, $prev]));
|
|
$tn = $new ? get_post($new) : null;
|
|
$tp = $prev ? get_post($prev) : null;
|
|
printf("%s: actual=#%d «%s» | pasada=#%d «%s» | degradadas a 'otras' %d post(s)%s\n",
|
|
strtoupper($lang), $new, $tn?mb_substr($tn->post_title,0,26):'-',
|
|
$prev, $tp?mb_substr($tp->post_title,0,26):'-',
|
|
$cleaned, $APPLY?'':' [DRY-RUN]');
|
|
}
|
|
echo $APPLY ? "APLICADO\n" : "DRY-RUN (APPLY=1 para aplicar)\n";
|