/** * 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.' ]); }); Jueves de la XXXIV Semana del Tiempo Ordinario - Sant Francesc de Ciutadella

Jueves de la XXXIV Semana del Tiempo Ordinario

Lecturas mar Sant Francesc de Ciutadella

Jueves, 27 de noviembre de 2025

Primera Lectura

Lectura de la profecía de Daniel (6,12-28):

En aquellos días, unos hombres espiaron a Daniel y lo sorprendieron orando y suplicando a su Dios.
Entonces fueron a decirle al rey: «Majestad, ¿no has firmado tú un decreto que prohíbe hacer oración, durante treinta días, a cualquier dios o cualquier hombre fuera de ti, bajo pena de ser arrojado al foso de los leones?»
El rey contestó: «El decreto está en vigor, como ley irrevocable de medos y persas.»
Ellos le replicaron: «Pues Daniel, uno de los deportados de Judea, no te obedece a ti, majestad, ni al decreto que has firmado, sino que tres veces al día hace oración a su Dios.»
Al oírlo, el rey, todo sofocado, se puso a pensar la manera de salvar a Daniel, y hasta la puesta del sol hizo lo imposible por librarlo.
Pero aquellos hombres le urgían, diciéndole: «Majestad, sabes que, según la ley de medos y persas, un decreto o edicto real es válido e irrevocable.»
Entonces el rey mandó traer a Daniel y echarlo al foso de los leones.
El rey dijo a Daniel: «¡Que te salve ese Dios a quien tú veneras tan fielmente!»
Trajeron una piedra, taparon con ella la boca del foso, y el rey la selló con su sello y con el de sus nobles, para que nadie pudiese modificar la sentencia dada contra Daniel. Luego el rey volvió a palacio, pasó la noche en ayunas, sin mujeres y sin poder dormir. Madrugó y fue corriendo al foso de los leones.
Se acercó al foso y gritó afligido: «¡Daniel, siervo del Dios vivo! ¿Ha podido salvarte de los leones ese Dios a quien veneras tan fielmente?»
Daniel le contestó: «¡Viva siempre el rey! Mi Dios envió su ángel a cerrar las fauces de los leones, y no me han hecho nada, porque ante él soy inocente, como tampoco he hecho nada contra ti.»
El rey se alegró mucho y mandó que sacaran a Daniel del foso. Al sacarlo, no tenía ni un rasguño, porque había confiado en su Dios. Luego mandó el rey traer a los que habían calumniado a Daniel y arrojarlos al foso de los leones con sus hijos y esposas. No habían llegado al suelo, y ya los leones los habían atrapado y despedazado.
Entonces el rey Darlo escribió a todos los pueblos, naciones y lenguas de la tierra: «¡Paz y bienestar! Ordeno y mando que en mi imperio todos respeten y teman al Dios de Daniel. Él es el Dios vivo que permanece siempre. Su reino no será destruido, su imperio dura hasta el fin. Él salva y libra, hace signos y prodigios en el cielo y en la tierra. Él salvó a Daniel de los leones.»

Palabra de Dios

 

Salmo

Dn 3,68.69.70.71.72.73.74

R/. Ensalzadlo con himnos por los siglos

Rocíos y nevadas,
bendecid al Señor. R/.

Témpanos y hielos,
bendecid al Señor. R/.

Escarchas y nieves,
bendecid al Señor. R/.

Noche y día,
bendecid al Señor. R/.

Luz y tinieblas,
bendecid al Señor. R/.

Rayos y nubes,
bendecid al Señor. R/.

Bendiga la tierra al Señor. R/.

 

Evangelio de hoy

Lectura del santo evangelio según san Lucas (21,20-28):

En aquel tiempo, dijo Jesús a sus discípulos: «Cuando veáis a Jerusalén sitiada por ejércitos, sabed que está cerca su destrucción. Entonces, los que estén en Judea, que huyan a la sierra; los que estén en la ciudad, que se alejen; los que estén en el campo, que no entren en la ciudad; porque serán días de venganza en que se cumplirá todo lo que está escrito. ¡Ay de las que estén encintas o criando en aquellos días! Porque habrá angustia tremenda en esta tierra y un castigo para este pueblo. Caerán a filo de espada, los llevarán cautivos a todas las naciones, Jerusalén será pisoteada por los gentiles, hasta que a los gentiles les llegue su hora. Habrá signos en el sol y la luna y las estrellas, y en la tierra angustia de las gentes, enloquecidas por el estruendo del mar y el oleaje. Los hombres quedarán sin aliento por el miedo y la ansiedad ante lo que se le viene encima al mundo, pues los astros se tambalearán. Entonces verán al Hijo del hombre venir en una nube, con gran poder y majestad. Cuando empiece a suceder esto, levantaos, alzad la cabeza: se acerca vuestra liberación.»

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