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.