Files
feadulta/mu-plugins/fea-evangelio-comentarios.php
2026-08-21 06:59:06 -04:00

172 lines
8.0 KiB
PHP

<?php
/**
* Plugin Name: Fe Adulta — Evangelio en comentarios
* Description: Deriva la cita de la carta semanal y muestra la lectura en los comentarios al evangelio.
* Version: 1.0
*/
function fea_evangelio_category($es_id) {
return function_exists('fea_cat') ? (int) fea_cat($es_id) : (int) $es_id;
}
function fea_evangelio_comment_categories() {
return array_map('fea_evangelio_category', [1647, 1646]);
}
function fea_evangelio_is_comment($post_id) {
return has_category(fea_evangelio_comment_categories(), $post_id);
}
/** Lee el meta del comentario; las traducciones heredan el dato editorial del original ES. */
function fea_evangelio_comment_meta($post_id, $key) {
$value = get_post_meta($post_id, $key, true);
if ($value !== '' && $value !== null) return $value;
if (!function_exists('pll_get_post')) return $value;
$source_id = (int) pll_get_post((int) $post_id, 'es');
return $source_id && $source_id !== (int) $post_id
? get_post_meta($source_id, $key, true)
: $value;
}
function fea_evangelio_reading_title($cita) {
$cita = trim(wp_strip_all_tags((string) $cita));
if (!preg_match('/^(Mt|Mc|Lc|Jn)\s+(.+)$/u', $cita, $m)) return '';
$books = ['Mt' => '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 = '<section class="fea-com-evangelio" aria-label="' . esc_attr(fea_evangelio_summary_label($lang)) . '">';
if (!$starts_with_cita) $html .= '<p class="fea-com-evangelio-cita">' . esc_html($cita) . '</p>';
if ($reading && trim(wp_strip_all_tags($reading->post_content)) !== '') {
$html .= '<details class="fea-com-evangelio-details"><summary>' . esc_html(fea_evangelio_summary_label($lang)) . '</summary>'
. wpautop(do_shortcode($reading->post_content)) . '</details>';
}
return $html . '</section>' . $content;
}, 8);
add_action('wp_head', function() {
if (!is_single()) return;
global $post;
if (!$post || !fea_evangelio_is_comment($post->ID)) return;
?>
<style>
.fea-com-evangelio { margin: 0 0 1.75rem; padding: 1rem 1.15rem; background: #f7f4ed; border-left: 4px solid #a77b2d; }
.fea-com-evangelio-cita { margin: 0 0 .65rem; font-weight: 700; }
.fea-com-evangelio-details summary { cursor: pointer; font-weight: 700; color: #51401e; }
.fea-com-evangelio-details > :last-child { margin-bottom: 0; }
.fea-com-evangelio-details[open] summary { margin-bottom: .85rem; }
</style>
<?php
});