/** * 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.' ]); }); Viernes de la 5ª semana de Cuaresma

Viernes de la 5ª semana de Cuaresma

Lecturas 807 Sant Francesc de Ciutadella Sant Francesc de Ciutadella

Viernes, 26 de marzo de 2021

Primera lectura

Lectura del libro de Jeremías (20,10-13):

En aquel tiempo, dijo Jeremías:
“Yo oía el cuchicheo de la gente que decía:
‘Denunciemos a Jeremías,
Denunciemos al profeta del terror’.
Todos los que eran mis amigos espiaban mis pasos,
esperaban que tropezara y me cayera, diciendo:
‘Si se tropieza y se cae, lo venceremos
y podremos vengarnos de él’.

Pero el Señor, guerrero poderoso, está a mi lado;
por eso mis perseguidores caerán por tierra
y no podrán conmigo;
quedarán avergonzados de su fracaso
y su ignominia será eterna e inolvidable.

Señor de los ejércitos, que pones a prueba al justo
y conoces lo más profundo de los corazones,
haz que yo vea tu venganza contra ellos,
porque a ti he encomendado mi causa.

Canten y alaben al Señor,
porque él ha salvado la vida de su pobre
de la mano de los malvados’’.

Palabra de Dios

Salmo

Sal 17,2-3a.3bc-4.5-6.7

R/. En el peligro invoqué al Señor, y me escuchó

V/. Yo te amo, Señor; tú eres mi fortaleza;
Señor, mi roca, mi alcázar, mi libertador. R/.

V/. Dios mío, peña mía, refugio mío,
escudo mío, mi fuerza salvadora, mi baluarte.
Invoco al Señor de mi alabanza
y quedo libre de mis enemigos. R/.

V/. Me cercaban olas mortales,
torrentes destructores me aterraban,
me envolvían las redes del abismo,
me alcanzaban los lazos de la muerte. R/.

V/. En el peligro invoqué al Señor,
grité a mi Dios:
desde su templo él escuchó mi voz,
y mi grito llegó a sus oídos. R/.

Evangelio

Lectura del santo evangelio según san Juan (10,31-42):

En aquel tiempo, cuando Jesús terminó de hablar, los judíos cogieron piedras para apedrearlo. Jesús les dijo: “He realizado ante ustedes muchas obras buenas de parte del Padre, ¿por cuál de ellas me quieren apedrear?”

Le contestaron los judíos: “No te queremos apedrear por ninguna obra buena, sino por blasfemo, porque tú, no siendo más que un hombre, pretendes ser Dios”. Jesús les replicó: “¿No está escrito en su ley: Yo les he dicho: Ustedes son dioses? Ahora bien, si ahí se llama dioses a quienes fue dirigida la palabra de Dios (y la Escritura no puede equivocarse), ¿cómo es que a mí, a quien el Padre consagró y envió al mundo, me llaman blasfemo porque he dicho: ‘Soy Hijo de Dios’? Si no hago las obras de mi Padre, no me crean. Pero si las hago, aunque no me crean a mí, crean a las obras, para que puedan comprender que el Padre está en mí y yo en el Padre”. Trataron entonces de apoderarse de él, pero se les escapó de las manos.

Luego regresó Jesús al otro lado del Jordán, al lugar donde Juan había bautizado en un principio y se quedó allí. Muchos acudieron a él y decían: “Juan no hizo ningún signo; pero todo lo que Juan decía de éste, era verdad”. Y muchos creyeron en él allí.

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