/** * 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 17º del Tiempo Ordinario - Ciclo B - Sant Francesc de Ciutadella

Domingo 17º del Tiempo Ordinario – Ciclo B

lecturas 20201119 066 Sant Francesc de Ciutadella

Domingo, 25 de julio de 2021

Primera lectura

Lectura del segundo libro de los Reyes (4,42-44):

En aquellos días, uno de Baal-Salisá vino a traer al profeta Eliseo el pan de las primicias, veinte panes de cebada y grano reciente en la alforja.
Eliseo dijo: «Dáselos a la gente, que coman.»
El criado replicó: «¿Qué hago yo con esto para cien personas?»
Eliseo insistió: «Dáselos a la gente, que coman. Porque así dice el Señor: Comerán y sobrará.»
Entonces el criado se los sirvió, comieron y sobró, como había dicho el Señor.

Palabra de Dios

Salmo

Sal 144,10-11.15-16.17-18

R/. Abres tú la mano, Señor, y nos sacias

Que todas tus criaturas te den gracias,
Señor, que te bendigan tus fieles;
que proclamen la gloria de tu reinado,
que hablen de tus hazañas. R/.

Los ojos de todos te están aguardando,
tú les das la comida a su tiempo;
abres tú la mano,
y sacias de favores a todo viviente. R/.

El Señor es justo en todos sus caminos,
cerca está el Señor de los que lo invocan,
de los que lo invocan sinceramente. R/.

Segunda lectura

Lectura de la carta del apóstol san Pablo a los Efesios (4,1-6):

Yo, el prisionero por el Señor, os ruego que andéis como pide la vocación a la que habéis sido convocados. Sed siempre humildes y amables, sed comprensivos, sobrellevaos mutuamente con amor; esforzaos en mantener la unidad del Espíritu con el vínculo de la paz. Un solo cuerpo y un solo Espíritu, como una sola es la esperanza de la vocación a la que habéis sido convocados. Un Señor, una fe, un bautismo. Un Dios, Padre de todo, que lo trasciende todo, y lo penetra todo, y lo invade todo.

Palabra de Dios

Evangelio

Evangelio según san Juan (6,1-15), del domingo, 25 de julio de 2021

Lectura del santo evangelio según san Juan (6,1-15):

En aquel tiempo, Jesús se marchó a la otra parte del lago de Galilea (o de Tiberíades). Lo seguía mucha gente, porque habían visto los signos que hacía con los enfermos. Subió Jesús entonces a la montaña y se sentó allí con sus discípulos. Estaba cerca la Pascua, la fiesta de los judíos.
Jesús entonces levantó los ojos, y al ver que acudía mucha gente, dice a Felipe: «¿Con qué compraremos panes para que coman éstos?» Lo decía para tentarlo, pues bien sabía él lo que iba a hacer.
Felipe contestó: «Doscientos denarios de pan no bastan para que a cada uno le toque un pedazo.»
Uno de sus discípulos, Andrés, el hermano de Simón Pedro, le dice: «Aquí hay un muchacho que tiene cinco panes de cebada y un par de peces; pero, ¿qué es eso para tantos?»
Jesús dijo: «Decid a la gente que se siente en el suelo.»
Había mucha hierba en aquel sitio. Se sentaron; sólo los hombres eran unos cinco mil. Jesús tomó los panes, dijo la acción de gracias y los repartió a los que estaban sentados, y lo mismo todo lo que quisieron del pescado.
Cuando se saciaron, dice a sus discípulos: «Recoged los pedazos que han sobrado; que nada se desperdicie.»
Los recogieron y llenaron doce canastas con los pedazos de los cinco panes de cebada, que sobraron a los que habían comido.
La gente entonces, al ver el signo que había hecho, decía: «Éste sí que es el Profeta que tenía que venir al mundo.»
Jesús entonces, sabiendo que iban a llevárselo para proclamarlo rey, se retiró otra vez a la montaña él solo.

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