/** * AJAX: SEO COMPLETO (Contenido + Rank Math + Schema + Imágenes) * Enfoque robusto: * - Gemini devuelve JSON SIMPLE (no JSON-LD completo) * - PHP construye JSON-LD final */ add_action( 'wp_ajax_nv_gemini_generate_full_seo', function() { // Base: permisos + nonce + request disponible + rate-limit $post = nv_gemini_check_ajax_base( 'nv_gemini_generate_save' ); $post_id = $post->ID; $prompt = isset($_POST['prompt']) ? sanitize_textarea_field( wp_unslash($_POST['prompt']) ) : ''; if ( empty( $prompt ) ) { wp_send_json_error([ 'message' => 'Prompt vacío.' ]); } // Contexto (capado para no enviar megas) $existing_title = get_post_meta( $post_id, 'rank_math_title', true ); $page_title = $existing_title ?: get_the_title( $post_id ); $existing_content = wp_strip_all_tags( $post->post_content ); if ( function_exists('mb_substr') ) { $existing_content = mb_substr( $existing_content, 0, 2000 ); } else { $existing_content = substr( $existing_content, 0, 2000 ); } $instruction = "Eres un asistente SEO experto para WordPress. Devuelve SOLO un JSON válido (sin texto extra). NO devuelvas JSON-LD completo. Devuelve estas claves: - title: título SEO (máx 60 caracteres) - description: meta descripción (máx 160 caracteres) - focus_keyword: keyword principal (frase corta) - extra_keywords: array de 10 keywords adicionales (strings) - content: HTML simple (sin scripts, sin iframes) - schema_simple: objeto JSON simple (NO JSON-LD) con: - headline - description (máx 160) - author_name - date_published (YYYY-MM-DD) TÍTULO ACTUAL: {$page_title} CONTENIDO ACTUAL (si existe): {$existing_content} PROMPT: {$prompt}"; // Con caché por prompt si existe helper if ( function_exists('nv_gemini_cached_request') ) { $raw = nv_gemini_cached_request( $instruction, 12 ); } else { $raw = nv_gemini_pro_request( $instruction ); } if ( empty( $raw ) ) { wp_send_json_error([ 'message' => 'No devuelve contenido (API Key, timeout o bloqueo).' ]); } // Extraer JSON robustamente if ( function_exists('nv_extract_json_object') ) { $clean = nv_extract_json_object( $raw ); } else { $raw2 = preg_replace('/^```(?:json)?/i', '', trim($raw)); $raw2 = preg_replace('/```$/', '', trim($raw2)); $start = strpos($raw2, '{'); $end = strrpos($raw2, '}'); $clean = ($start !== false && $end !== false && $end > $start) ? substr($raw2, $start, $end - $start + 1) : ''; } if ( empty($clean) ) { error_log('[NV Gemini] SEO completo: no se pudo extraer JSON. Raw: ' . substr($raw,0,500)); wp_send_json_error([ 'message' => 'Respuesta sin JSON utilizable.' ]); } $json = json_decode( $clean, true ); if ( ! is_array( $json ) ) { error_log('[NV Gemini] SEO completo: JSON inválido. Clean: ' . substr($clean,0,500)); wp_send_json_error([ 'message' => 'La respuesta de Gemini no es JSON válido.' ]); } // Normalizar campos $title = sanitize_text_field( $json['title'] ?? '' ); $desc = sanitize_text_field( $json['description'] ?? '' ); $kw = sanitize_text_field( $json['focus_keyword'] ?? '' ); if ( function_exists('mb_substr') ) { if ( $title ) $title = mb_substr( $title, 0, 60 ); if ( $desc ) $desc = mb_substr( $desc, 0, 160 ); } else { if ( $title ) $title = substr( $title, 0, 60 ); if ( $desc ) $desc = substr( $desc, 0, 160 ); } $extra_keywords = ( isset($json['extra_keywords']) && is_array($json['extra_keywords']) ) ? array_values(array_filter(array_map('sanitize_text_field', $json['extra_keywords'] ))) : []; $content_html = wp_kses_post( $json['content'] ?? '' ); $schema_simple = ( isset($json['schema_simple']) && is_array($json['schema_simple']) ) ? $json['schema_simple'] : []; // 1) Guardar contenido en post_content if ( ! empty( $content_html ) ) { wp_update_post([ 'ID' => $post_id, 'post_content' => $content_html, ]); } // 2) Guardar metas Rank Math if ( $title !== '' ) update_post_meta( $post_id, 'rank_math_title', $title ); if ( $desc !== '' ) update_post_meta( $post_id, 'rank_math_description', $desc ); if ( $kw !== '' ) update_post_meta( $post_id, 'rank_math_focus_keyword', $kw ); // 3) Guardar keywords extra if ( ! empty( $extra_keywords ) ) { update_post_meta( $post_id, 'nv_gemini_extra_keywords', $extra_keywords ); } // 4) Construir JSON-LD Article en PHP (estable) $headline = sanitize_text_field( $schema_simple['headline'] ?? ($title ?: $page_title) ); $sd_desc = sanitize_text_field( $schema_simple['description'] ?? $desc ); $author = sanitize_text_field( $schema_simple['author_name'] ?? 'Redacción' ); $date_pub = sanitize_text_field( $schema_simple['date_published'] ?? date('Y-m-d') ); if ( function_exists('mb_substr') ) { $sd_desc = mb_substr( $sd_desc, 0, 160 ); } else { $sd_desc = substr( $sd_desc, 0, 160 ); } if ( ! preg_match('/^\d{4}-\d{2}-\d{2}$/', $date_pub ) ) { $date_pub = date('Y-m-d'); } $schema_ld = [ '@context' => 'https://schema.org', '@type' => 'Article', 'headline' => $headline, 'description' => $sd_desc, 'author' => [ '@type' => 'Person', 'name' => $author, ], 'datePublished' => $date_pub, 'inLanguage' => 'es-ES', 'mainEntityOfPage' => get_permalink( $post_id ), ]; if ( function_exists('nv_gemini_save_schema_raw') ) { nv_gemini_save_schema_raw( $post_id, $schema_ld ); } else { update_post_meta( $post_id, 'nv_gemini_schema_raw', wp_json_encode( $schema_ld ) ); } // 5) Optimizar imágenes if ( function_exists('nv_gemini_optimize_images_for_post') ) { $seo_title_for_images = $title ?: $page_title; $html_for_images = $content_html ?: $post->post_content; nv_gemini_optimize_images_for_post( $post_id, $seo_title_for_images, $html_for_images ); } wp_send_json_success([ 'message' => 'SEO completo guardado: contenido + Rank Math (title/description/keyword) + schema + optimización de imágenes.' ]); }); Domingo de la XXI Semana del Tiempo Ordinario - Sant Francesc de Ciutadella

Domingo de la XXI Semana del Tiempo Ordinario

lecturas 20201119 066 Sant Francesc de Ciutadella

Domingo, 24 de agosto de 2025

Primera Lectura

Lectura del libro de Isaías (66,18-21):

Esto dice el Señor:
«Yo, conociendo sus obras y sus pensamientos,
vendré para reunir
las naciones de toda lengua;
vendrán para ver mi gloria.
Les daré una señal, y de entre ellos
enviaré supervivientes a las naciones:
a Tarsis, Libia y Lidia (tiradores de arco),
Túbal y Grecia, a las costas lejanas
que nunca oyeron mi fama ni vieron mi gloria.
Ellos anunciarán mi gloria a las naciones.
Y de todas las naciones, como ofrenda al Señor,
traerán a todos vuestros hermanos,
a caballo y en carros y en literas,
en mulos y dromedarios,
hasta mi santa montaña de Jerusalén
—dice el Señor—,
así como los hijos de Israel traen ofrendas,
en vasos purificados, al templo del Señor.
También de entre ellos escogeré
sacerdotes y levitas —dice el Señor—».

Palabra de Dios

 

Salmo

Sal 116,1.2

R/. Id al mundo entero y proclamad el Evangelio

V/. Alabad al Señor todas las naciones,
aclamadlo todos los pueblos. R/.

V/. Firme es su misericordia con nosotros,
su fidelidad dura por siempre. R/.

 

Segunda Lectura

Lectura de la carta a los Hebreos (12,5-7.11-13):

Hermanos:
Habéis olvidado la exhortación paternal que os dieron:
«Hijo mío, no rechaces la corrección del Señor,
ni te desanimes por su reprensión;
porque el Señor reprende a los que ama
y castiga a sus hijos preferidos».
Soportáis la prueba para vuestra corrección, porque Dios os trata como a hijos, pues ¿qué padre no corrige a sus hijos?
Ninguna corrección resulta agradable, en el momento, sino que duele; pero luego produce fruto apacible de justicia a los ejercitados en ella.
Por eso, fortaleced las manos débiles, robusteced las rodillas vacilantes, y caminad por una senda llana: así el pie cojo, no se retuerce, sino que se cura.

Palabra de Dios

 

Evangelio de hoy

Lectura del santo evangelio según san Lucas (13,22-30):

En Jesús pasaba por ciudades y aldeas enseñando y se encaminaba hacia Jerusalén.
Uno le preguntó:
«Señor, ¿son pocos los que se salvan?».
Él les dijo:
«Esforzaos en entrar por la puerta estrecha, pues os digo que muchos intentarán entrar y no podrán. Cuando el amo de la casa se levante y cierre la puerta, os quedaréis fuera y llamaréis a la puerta diciendo:
Señor, ábrenos;
pero él os dirá:
“No sé quiénes sois”.
Entonces comenzaréis a decir:
“Hemos comido y bebido contigo, y tú has enseñado en nuestras plazas”.
Pero él os dirá:
“No sé de dónde sois. Alejaos de mí todos los que obráis la iniquidad”.
Allí será el llanto y el rechinar de dientes, cuando veáis a Abrahán, a Isaac y a Jacob y a todos los profetas en el reino de Dios, pero vosotros os veáis arrojados fuera. Y vendrán de oriente y occidente, del norte y del sur, y se sentarán a la mesa en el reino de Dios.
Mirad: hay últimos que serán primeros, y primeros que serán últimos».

Palabra del Señor

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Privacidad