'MATEO', 'Mc' => 'MARCOS', 'Lc' => 'LUCAS', 'Jn' => 'JUAN']; return $books[$m[1]] . ' ' . preg_replace('/\s+/u', ' ', trim($m[2])); } /** Localiza la lectura española, sin depender del slug (que puede llevar sufijos). */ function fea_evangelio_reading_id($cita) { global $wpdb; static $cache = []; $title = fea_evangelio_reading_title($cita); if ($title === '') return 0; if (isset($cache[$title])) return $cache[$title]; // La coincidencia se hace siempre contra la lectura original en español; después // Polylang la sustituye por la traducción del comentario cuando exista. $cat = 1645; $sql = $wpdb->prepare( "SELECT p.ID FROM {$wpdb->posts} p INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id = p.ID INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE p.post_type = 'post' AND p.post_status = 'publish' AND p.post_title = %s AND tt.taxonomy = 'category' AND tt.term_id = %d ORDER BY p.post_date DESC LIMIT 1", $title, $cat ); return $cache[$title] = (int) $wpdb->get_var($sql); } /** Devuelve los evangelios enlazados en la sección pertinente de una carta. */ function fea_evangelio_from_carta($carta_id) { if (!function_exists('fea_parse_carta_sections')) return []; if (function_exists('pll_get_post')) $carta_id = (int) (pll_get_post((int) $carta_id, 'es') ?: $carta_id); $links = fea_parse_carta_sections((int) $carta_id)['evangelio'] ?? []; $result = []; foreach ($links as $id) { $post = get_post($id); if (!$post) continue; $cita = get_post_meta($id, '* Cita biblica', true); if (!$cita && preg_match('/^(MATEO|MARCOS|LUCAS|JUAN)\s+(.+)$/u', trim($post->post_title), $m)) { $abbr = ['MATEO' => 'Mt', 'MARCOS' => 'Mc', 'LUCAS' => 'Lc', 'JUAN' => 'Jn'][$m[1]]; $cita = $abbr . ' ' . $m[2]; } if (fea_evangelio_reading_title($cita)) $result[(string) $id] = trim($cita); } return $result; } /** Busca una carta en las tres categorías históricas, dentro de cuatro días. */ function fea_evangelio_nearest_carta_id(WP_Post $post) { $date = mysql2date('Y-m-d', $post->post_date, false); $cartas = get_posts([ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 10, 'category__in' => array_map('fea_evangelio_category', [6, 21, 22]), 'date_query' => [[ 'after' => date('Y-m-d', strtotime($date . ' -4 days')), 'before' => date('Y-m-d', strtotime($date . ' +4 days')), 'inclusive' => true, ]], 'orderby' => 'date', 'order' => 'DESC', ]); if (!$cartas) return 0; usort($cartas, function($a, $b) use ($post) { return abs(strtotime($a->post_date) - strtotime($post->post_date)) <=> abs(strtotime($b->post_date) - strtotime($post->post_date)); }); return (int) $cartas[0]->ID; } /** Escribe solo metadatos ausentes cuando la carta identifica un único evangelio. */ function fea_evangelio_capture_meta($post_id) { $post = get_post($post_id); if (!$post || $post->post_type !== 'post' || $post->post_status !== 'publish' || !fea_evangelio_is_comment($post_id)) return false; if (get_post_meta($post_id, '_cita_evangelio', true)) return false; $carta_id = (int) get_post_meta($post_id, '_carta_id', true); if (!$carta_id) $carta_id = fea_evangelio_nearest_carta_id($post); if (!$carta_id) return false; $evangelios = fea_evangelio_from_carta($carta_id); if (count($evangelios) !== 1) { error_log(sprintf('Fe Adulta: comentario %d sin cita; carta %d tiene %d evangelios.', $post_id, $carta_id, count($evangelios))); return false; } update_post_meta($post_id, '_cita_evangelio', reset($evangelios)); if (!get_post_meta($post_id, '_carta_id', true)) update_post_meta($post_id, '_carta_id', $carta_id); return true; } function fea_evangelio_summary_label($lang) { $labels = [ 'es' => 'Leer el evangelio', 'en' => 'Read the Gospel', 'fr' => 'Lire l’Évangile', 'it' => 'Leggi il Vangelo', 'pt' => 'Ler o Evangelho', ]; return $labels[$lang] ?? $labels['es']; } add_action('transition_post_status', function($new_status, $old_status, $post) { if ($new_status === 'publish' && $old_status !== 'publish') fea_evangelio_capture_meta($post->ID); }, 20, 3); /** Completa la cita cuando llega la carta, aunque el comentario ya estuviera publicado. */ function fea_evangelio_capture_meta_on_carta_assignment($meta_id, $post_id, $meta_key, $meta_value) { if ($meta_key !== '_carta_id' || !(int) $meta_value) return; fea_evangelio_capture_meta((int) $post_id); } add_action('added_post_meta', 'fea_evangelio_capture_meta_on_carta_assignment', 20, 4); add_action('updated_post_meta', 'fea_evangelio_capture_meta_on_carta_assignment', 20, 4); /** Añade referencia y texto plegado, cerrado por defecto, antes del comentario. */ add_filter('the_content', function($content) { if (!is_single() || is_admin()) return $content; global $post; if (!$post || !fea_evangelio_is_comment($post->ID)) return $content; $cita = trim((string) fea_evangelio_comment_meta($post->ID, '_cita_evangelio')); if (!$cita) return $content; $reading_id = fea_evangelio_reading_id($cita); $lang = function_exists('pll_current_language') ? pll_current_language() : 'es'; if ($reading_id && $lang && $lang !== 'es' && function_exists('pll_get_post')) $reading_id = (int) (pll_get_post($reading_id, $lang) ?: $reading_id); $reading = $reading_id ? get_post($reading_id) : null; $starts_with_cita = preg_match('/^\s*' . preg_quote($cita, '/') . '(?:[\s\.,:;\-–—]|$)/iu', wp_strip_all_tags($content)); $html = '
'; if (!$starts_with_cita) $html .= '

' . esc_html($cita) . '

'; if ($reading && trim(wp_strip_all_tags($reading->post_content)) !== '') { $html .= '
' . esc_html(fea_evangelio_summary_label($lang)) . '' . wpautop(do_shortcode($reading->post_content)) . '
'; } return $html . '
' . $content; }, 8); add_action('wp_head', function() { if (!is_single()) return; global $post; if (!$post || !fea_evangelio_is_comment($post->ID)) return; ?>