ea5ecafc3d
Co-authored-by: rafa <rcalvotorrejon@gmail.com> Signed-off-by: rafa <rcalvotorrejon@gmail.com>
172 lines
8.0 KiB
PHP
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
|
|
});
|