Añadir mu-plugins y scripts de feadulta
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
/**
|
||||
* reasign_cats.php — #136: reasigna las categorías de los posts traducidos (en/fr/it/pt)
|
||||
* a la versión Polylang de su idioma. Si la categoría no tiene traducción, crea un
|
||||
* término espejo (mismo nombre) en ese idioma y lo asocia. Idempotente y resumible
|
||||
* (marca _cats_reasignadas=1).
|
||||
*
|
||||
* Ejecutar: docker exec wordpress-web wp eval-file /tmp/reasign_cats.php [LANG] [LIMIT] --allow-root
|
||||
* sin args: procesa los 4 idiomas. Con LANG (en/fr/it/pt) y LIMIT acota.
|
||||
*/
|
||||
$only_lang = (isset($argv[1]) && in_array($argv[1], ['en','fr','it','pt'], true)) ? $argv[1] : null;
|
||||
$limit = isset($argv[2]) ? (int) $argv[2] : 0;
|
||||
|
||||
$mirror_cache = []; // "cat_es|lang" => term_id
|
||||
|
||||
function translate_or_mirror($c, $lang, &$cache) {
|
||||
$key = $c . '|' . $lang;
|
||||
if (isset($cache[$key])) return $cache[$key];
|
||||
$t = pll_get_term($c, $lang);
|
||||
if (!$t) {
|
||||
$term = get_term($c, 'category');
|
||||
if (!$term || is_wp_error($term)) { return $cache[$key] = $c; }
|
||||
$slug = sanitize_title($term->name) . '-' . $lang . '-' . $c;
|
||||
$res = wp_insert_term($term->name, 'category', ['slug' => $slug]);
|
||||
if (is_wp_error($res)) {
|
||||
$ex = $res->get_error_data();
|
||||
if (!$ex) { return $cache[$key] = $c; }
|
||||
$t = is_array($ex) ? ($ex['term_id'] ?? 0) : (int) $ex;
|
||||
} else {
|
||||
$t = $res['term_id'];
|
||||
}
|
||||
if ($t) {
|
||||
pll_set_term_language($t, $lang);
|
||||
$tr = pll_get_term_translations($c);
|
||||
$tr[$lang] = $t;
|
||||
pll_save_term_translations($tr);
|
||||
} else {
|
||||
$t = $c;
|
||||
}
|
||||
}
|
||||
return $cache[$key] = (int) $t;
|
||||
}
|
||||
|
||||
$langs = $only_lang ? [$only_lang] : ['en','fr','it','pt'];
|
||||
$done = 0; $changed = 0; $mirrors = 0;
|
||||
$start_mirror_terms = count($mirror_cache);
|
||||
foreach ($langs as $lang) {
|
||||
$args = ['lang'=>$lang,'post_type'=>'post','post_status'=>['publish','draft'],
|
||||
'fields'=>'ids','posts_per_page'=> $limit ?: -1,'no_found_rows'=>true,
|
||||
'meta_query'=>[['key'=>'_cats_reasignadas','compare'=>'NOT EXISTS']]];
|
||||
$ids = get_posts($args);
|
||||
foreach ($ids as $pid) {
|
||||
// Fuente de verdad = categorías del ES original (las del post traducido
|
||||
// pueden estar incompletas). Se traducen al idioma del post.
|
||||
$es = pll_get_post($pid, 'es');
|
||||
$source = ($es && $es != $pid) ? wp_get_post_categories($es) : wp_get_post_categories($pid);
|
||||
$new = [];
|
||||
foreach ($source as $c) {
|
||||
$clang = pll_get_term_language($c);
|
||||
$new[] = ($clang === $lang) ? $c : translate_or_mirror($c, $lang, $mirror_cache);
|
||||
}
|
||||
$new = array_values(array_unique($new));
|
||||
$cur = wp_get_post_categories($pid);
|
||||
sort($cur); $cmp = $new; sort($cmp);
|
||||
if ($cur !== $cmp && $new) { wp_set_post_categories($pid, $new); $changed++; }
|
||||
update_post_meta($pid, '_cats_reasignadas', 1);
|
||||
$done++;
|
||||
}
|
||||
}
|
||||
echo "procesados: $done | con cambios: $changed | términos espejo en caché: " . count($mirror_cache) . "\n";
|
||||
Reference in New Issue
Block a user