/** * 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 XXXII Semana del Tiempo Ordinario - Sant Francesc de Ciutadella

Jueves de la XXXII Semana del Tiempo Ordinario

Lecturas mar Sant Francesc de Ciutadella

Jueves, 14 de noviembre de 2024

Primera Lectura

Lectura de la carta del apóstol san Pablo a Filemón (7-20):

Me alegró y animó mucho tu caridad, hermano, porque tú has aliviado los sufrimientos de los santos. Por eso, aunque tengo plena libertad en Cristo para mandarte lo que conviene hacer, prefiero rogártelo apelando a tu caridad, yo, Pablo, anciano y prisionero por Cristo Jesús. Te recomiendo a Onésimo, mi hijo, a quien he engendrado en la prisión, que antes era tan inútil para ti, y ahora, en cambio, es tan útil para ti y para mí; te lo envío como algo de mis entrañas. Me hubiera gustado retenerlo junto a mí, para que me sirviera en tu lugar, en esta prisión que sufro por el Evangelio; pero no he querido retenerlo sin contar contigo; así me harás este favor, no a la fuerza, sino con libertad. Quizá se apartó de ti para que lo recobres ahora para siempre; y no como esclavo, sino mucho mejor: como hermano querido. Si yo lo quiero tanto, cuánto más lo has de querer tú, como hombre y como cristiano. Si me consideras compañero tuyo, recíbelo a él como a mí mismo. Si en algo te ha perjudicado y te debe algo, ponlo en mi cuenta; yo, Pablo, te firmo el pagaré de mi puño y letra, para no hablar de que tú me debes tu propia persona. Por Dios, hermano, a ver si me das esta satisfacción en el Señor; alivia mi ansiedad, por amor a Cristo.

Palabra de Dios

 

Salmo

Sal 145,7.8-9a.9bc-10

R/. Dichoso a quien auxilia el Dios de Jacob

Que mantiene su fidelidad perpetuamente,
que hace justicia a los oprimidos,
que da pan a los hambrientos.
El Señor liberta a los cautivos. R/.

El Señor abre los ojos al ciego,
el Señor endereza a los que ya se doblan,
el Señor ama a los justos.
El Señor guarda a los peregrinos. R/.

Sustenta al huérfano y a la viuda
y trastorna el camino de los malvados.
El Señor reina eternamente,
tu Dios, Sión, de edad en edad. R/.

 

Evangelio

Lectura del santo evangelio según san Lucas (17,20-25):

En aquel tiempo, a unos fariseos que le preguntaban cuándo iba a llegar el reino de Dios Jesús les contestó: «El reino de Dios no vendrá espectacularmente, ni anunciarán que está aquí o está allí; porque mirad, el reino de Dios está dentro de vosotros.»
Dijo a sus discípulos: «Llegará un tiempo en que desearéis vivir un día con el Hijo del hombre, y no podréis. Si os dicen que está aquí o está allí no os vayáis detrás. Como el fulgor del relámpago brilla de un horizonte a otro, así será el Hijo del hombre en su día. Pero antes tiene que padecer mucho y ser reprobado por esta generació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