Añadir mu-plugins y scripts de feadulta
This commit is contained in:
@@ -0,0 +1,185 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugin Name: Fe Adulta — Slider home sync (filesystem → Smart Slider 3)
|
||||
* Description: Sincroniza los slides del Smart Slider 3 id 2 ("Slider_home")
|
||||
* con el contenido del directorio `wp-content/uploads/home/`.
|
||||
* Imita el modelo Joomla mod_ariimageslider que leía
|
||||
* `images/home/` automáticamente.
|
||||
* Version: 1.0
|
||||
*
|
||||
* Operativa para el editor: subir/borrar ficheros en `uploads/home/`.
|
||||
* El slider de la portada se actualiza solo al primer pageview.
|
||||
*
|
||||
* Ver issue rafa/feadulta#43.
|
||||
*/
|
||||
|
||||
const FEA_SLIDER_ID = 2;
|
||||
const FEA_SLIDER_DIRNAME = 'home';
|
||||
const FEA_SLIDER_EXTS = ['jpg', 'jpeg', 'png', 'webp'];
|
||||
const FEA_SLIDER_OPT_KEY = 'fea_slider_home_mtime';
|
||||
|
||||
/**
|
||||
* Lista las imágenes del directorio uploads/home/, ordenadas por nombre.
|
||||
*/
|
||||
function fea_slider_home_files() {
|
||||
$uploads = wp_upload_dir();
|
||||
$dir = trailingslashit($uploads['basedir']) . FEA_SLIDER_DIRNAME;
|
||||
if (!is_dir($dir)) return [];
|
||||
$files = [];
|
||||
foreach (scandir($dir) as $name) {
|
||||
if ($name === '.' || $name === '..') continue;
|
||||
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
|
||||
if (!in_array($ext, FEA_SLIDER_EXTS, true)) continue;
|
||||
$files[] = $name;
|
||||
}
|
||||
sort($files, SORT_NATURAL);
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* mtime del directorio (cambia al añadir/borrar ficheros).
|
||||
*/
|
||||
function fea_slider_home_dir_mtime() {
|
||||
$uploads = wp_upload_dir();
|
||||
$dir = trailingslashit($uploads['basedir']) . FEA_SLIDER_DIRNAME;
|
||||
if (!is_dir($dir)) return 0;
|
||||
$m = (int) @filemtime($dir);
|
||||
// Sumar mtime de cada fichero para detectar reemplazos del mismo nombre
|
||||
foreach (fea_slider_home_files() as $f) {
|
||||
$m = max($m, (int) @filemtime($dir . '/' . $f));
|
||||
}
|
||||
return $m;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sincroniza la tabla wp_nextend2_smartslider3_slides para el slider 2
|
||||
* con los ficheros del directorio. Idempotente.
|
||||
*
|
||||
* - Reusa slides existentes (manteniendo IDs) cuando coincide la imagen
|
||||
* - Crea slides nuevos para imágenes nuevas
|
||||
* - Borra slides cuya imagen ya no está
|
||||
*/
|
||||
function fea_slider_home_sync_now($force = false) {
|
||||
global $wpdb;
|
||||
$mtime = fea_slider_home_dir_mtime();
|
||||
if (!$force) {
|
||||
$last = (int) get_option(FEA_SLIDER_OPT_KEY, 0);
|
||||
if ($last === $mtime && $mtime > 0) return false;
|
||||
}
|
||||
|
||||
$files = fea_slider_home_files();
|
||||
|
||||
$uploads = wp_upload_dir();
|
||||
$reldir = '$upload$/' . FEA_SLIDER_DIRNAME; // SS3 variable placeholder
|
||||
|
||||
// Leer slides actuales del slider 2 → mapeo imagen → row
|
||||
$existing = $wpdb->get_results($wpdb->prepare(
|
||||
"SELECT id, title, params, ordering FROM {$wpdb->prefix}nextend2_smartslider3_slides WHERE slider=%d ORDER BY ordering",
|
||||
FEA_SLIDER_ID
|
||||
), ARRAY_A);
|
||||
|
||||
$by_image = [];
|
||||
foreach ($existing as $row) {
|
||||
$p = json_decode($row['params'], true) ?: [];
|
||||
$img = isset($p['backgroundImage']) ? basename($p['backgroundImage']) : null;
|
||||
if ($img) $by_image[$img] = $row;
|
||||
}
|
||||
|
||||
$keep_ids = [];
|
||||
$ordering = 0;
|
||||
foreach ($files as $file) {
|
||||
$ordering++;
|
||||
if (isset($by_image[$file])) {
|
||||
// Reutilizar slide existente — actualizar params si fuera necesario
|
||||
$row = $by_image[$file];
|
||||
$p = json_decode($row['params'], true) ?: [];
|
||||
$expected = $reldir . '/' . $file;
|
||||
$needs_update = false;
|
||||
if (($p['backgroundImage'] ?? '') !== $expected) { $p['backgroundImage'] = $expected; $needs_update = true; }
|
||||
if (($p['background-type'] ?? '') !== 'image') { $p['background-type'] = 'image'; $needs_update = true; }
|
||||
if ($needs_update) {
|
||||
$wpdb->update(
|
||||
$wpdb->prefix . 'nextend2_smartslider3_slides',
|
||||
['params' => wp_json_encode($p), 'ordering' => $ordering],
|
||||
['id' => $row['id']],
|
||||
['%s','%d'], ['%d']
|
||||
);
|
||||
} else {
|
||||
$wpdb->update(
|
||||
$wpdb->prefix . 'nextend2_smartslider3_slides',
|
||||
['ordering' => $ordering],
|
||||
['id' => $row['id']],
|
||||
['%d'], ['%d']
|
||||
);
|
||||
}
|
||||
$keep_ids[] = (int) $row['id'];
|
||||
} else {
|
||||
// Crear slide nuevo
|
||||
$title = pathinfo($file, PATHINFO_FILENAME);
|
||||
$params = wp_json_encode([
|
||||
'background-type' => 'image',
|
||||
'backgroundImage' => $reldir . '/' . $file,
|
||||
'version' => '3.5.1.32',
|
||||
]);
|
||||
$img_url = $reldir . '/' . $file;
|
||||
$wpdb->insert(
|
||||
$wpdb->prefix . 'nextend2_smartslider3_slides',
|
||||
[
|
||||
'slider' => FEA_SLIDER_ID,
|
||||
'title' => $title,
|
||||
'description' => '',
|
||||
'params' => $params,
|
||||
'slide' => '[]',
|
||||
'thumbnail' => $img_url,
|
||||
'publish_up' => '1970-01-01 00:00:00',
|
||||
'publish_down' => '1970-01-01 00:00:00',
|
||||
'published' => 1,
|
||||
'first' => 0,
|
||||
'generator_id' => 0,
|
||||
'ordering' => $ordering,
|
||||
],
|
||||
['%d','%s','%s','%s','%s','%s','%s','%s','%d','%d','%d','%d']
|
||||
);
|
||||
$keep_ids[] = (int) $wpdb->insert_id;
|
||||
}
|
||||
}
|
||||
|
||||
// Borrar slides cuya imagen ya no está en el directorio
|
||||
if ($keep_ids) {
|
||||
$in = implode(',', array_map('intval', $keep_ids));
|
||||
$wpdb->query($wpdb->prepare(
|
||||
"DELETE FROM {$wpdb->prefix}nextend2_smartslider3_slides WHERE slider=%d AND id NOT IN ($in)",
|
||||
FEA_SLIDER_ID
|
||||
));
|
||||
} else {
|
||||
$wpdb->query($wpdb->prepare(
|
||||
"DELETE FROM {$wpdb->prefix}nextend2_smartslider3_slides WHERE slider=%d",
|
||||
FEA_SLIDER_ID
|
||||
));
|
||||
}
|
||||
|
||||
update_option(FEA_SLIDER_OPT_KEY, $mtime);
|
||||
|
||||
// Marcar slider como cambiado para que SS3 regenere su manifest
|
||||
$wpdb->update(
|
||||
$wpdb->prefix . 'nextend2_section_storage',
|
||||
['value' => (string) $mtime],
|
||||
['application' => 'smartslider', 'section' => 'sliderChanged', 'referenceKey' => (string) FEA_SLIDER_ID],
|
||||
['%s'], ['%s','%s','%s']
|
||||
);
|
||||
|
||||
return count($files);
|
||||
}
|
||||
|
||||
// Ejecutar sync en cada carga de portada (la comprobación de mtime evita trabajo si nada cambió).
|
||||
add_action('template_redirect', function() {
|
||||
if (!is_front_page()) return;
|
||||
fea_slider_home_sync_now();
|
||||
}, 5);
|
||||
|
||||
// Sync también al entrar al admin (por si el editor sube ficheros desde wp-admin).
|
||||
add_action('admin_init', function() {
|
||||
fea_slider_home_sync_now();
|
||||
});
|
||||
|
||||
// WP-CLI helper: `wp eval "fea_slider_home_sync_now(true);"` fuerza resync ignorando mtime.
|
||||
Reference in New Issue
Block a user