'group_user_foto_perfil', 'title' => 'Foto de perfil', 'fields' => [[ 'key' => 'field_user_foto_perfil', 'label' => 'Foto', 'name' => 'foto_perfil', 'type' => 'image', 'instructions' => 'Sube una foto cuadrada del autor (mínimo 100×100px).', 'return_format' => 'url', 'preview_size' => 'thumbnail', 'upload_folder' => 'autores', ]], 'location' => [[ ['param' => 'user_form', 'operator' => '==', 'value' => 'all'], ]], ]); }); // Usar la foto del autor en lugar del Gravatar cuando existe // Lee el attachment ID guardado en el meta 'foto_perfil' (campo ACF) add_filter('get_avatar_url', function($url, $id_or_email, $args) { $user_id = null; if (is_numeric($id_or_email)) $user_id = (int) $id_or_email; elseif ($id_or_email instanceof WP_User) $user_id = $id_or_email->ID; elseif (is_string($id_or_email)) { $user = get_user_by('email', $id_or_email); if ($user) $user_id = $user->ID; } if (!$user_id) return $url; $attach_id = get_user_meta($user_id, 'foto_perfil', true); if ($attach_id) { $foto = wp_get_attachment_image_url((int) $attach_id, 'full'); if ($foto) return $foto; } return $url; }, 10, 3); // ── Ordenar por fecha los resultados del buscador ACF en campos de portada ─ add_filter('acf/fields/relationship/query/key=field_portada_articulos', function($args) { $args['orderby'] = 'date'; $args['order'] = 'DESC'; return $args; }); add_filter('acf/fields/relationship/query/key=field_portada_multimedia', function($args) { $args['orderby'] = 'date'; $args['order'] = 'DESC'; return $args; }); // ── Campos ACF para la portada ──────────────────────────────────────────── add_action('acf/init', function() { if (!function_exists('acf_add_local_field_group')) return; $front_page_id = (int) get_option('page_on_front'); acf_add_local_field_group([ 'key' => 'group_portada_fea', 'title' => 'Contenido de la portada', 'fields' => [ [ 'key' => 'field_portada_articulos', 'label' => 'Artículos seleccionados', 'name' => 'portada_articulos', 'type' => 'relationship', 'instructions' => 'Elige los artículos que aparecerán en la portada esta semana (máx. 9). Puedes buscar por título.', 'post_type' => ['post'], 'post_status' => ['publish', 'draft'], 'filters' => ['search', 'taxonomy'], 'elements' => ['featured_image'], 'min' => 0, 'max' => 9, 'return_format' => 'object', 'query_args' => ['orderby' => 'date', 'order' => 'DESC'], ], [ 'key' => 'field_portada_multimedia', 'label' => 'Multimedia seleccionado', 'name' => 'portada_multimedia', 'type' => 'relationship', 'instructions' => 'Elige los vídeos o audios para la portada (máx. 4).', 'post_type' => ['post'], 'post_status' => ['publish', 'draft'], 'filters' => ['search'], 'elements' => ['featured_image'], 'min' => 0, 'max' => 4, 'return_format' => 'object', 'query_args' => ['orderby' => 'date', 'order' => 'DESC'], ], ], 'location' => [[ ['param' => 'page', 'operator' => '==', 'value' => (string) $front_page_id], ]], 'position' => 'normal', 'style' => 'default', 'label_placement' => 'top', ]); }); // ── Centrar bloque slider+librería (header template, todas las páginas) ─── add_action('wp_head', function() { ?> 48]); $author_url = get_author_posts_url($author_id); $cat_str = ''; $cats = get_the_category(); if ($cats) { $cat_url = get_category_link($cats[0]->term_id); $cat_str = '' . esc_html($cats[0]->name) . ''; } echo '
' . '' . '' . '' . '
' . '' . $cat_str . '
' . '
'; }); add_action('wp_head', function() { if (!is_single()) return; ?> post_author; $author_name = get_the_author_meta('display_name', $author_id); $avatar_url = get_avatar_url($author_id, ['size' => 28, 'default' => 'identicon']); $url = get_permalink($post->ID); $title = fea_title($post->post_title); return '
' . '
' . '' . '' . esc_html($author_name) . '' . '
' . '

' . esc_html($title) . '

' . '
'; } // ── Shortcode: [fea_carta_semana_hero] ──────────────────────────────────── add_shortcode('fea_carta_semana_hero', function() { $cartas = get_posts([ 'posts_per_page' => 1, 'category__in' => [6], 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]); if (!$cartas) return ''; $c = $cartas[0]; $url = get_permalink($c->ID); $fecha = date_i18n('j \d\e F \d\e Y', strtotime($c->post_date)); $author_name = get_the_author_meta('display_name', $c->post_author); $avatar_url = get_avatar_url($c->post_author, ['size' => 32, 'default' => 'identicon']); return '
' . '' . '' . '

' . esc_html(fea_title($c->post_title)) . '

' . '
' . '' . '' . esc_html($author_name) . ' · ' . $fecha . '' . '
' . '
'; }); // ── Shortcode: [fea_articulos_semana] ───────────────────────────────────── add_shortcode('fea_articulos_semana', function($atts) { $atts = shortcode_atts(['titulo' => 'Artículos de esta semana'], $atts); $page = (int) get_option('page_on_front'); // Selección editorial (ACF) — solo posts publicados, ordenados por fecha desc $posts = []; if (function_exists('get_field')) { $seleccion = get_field('portada_articulos', $page) ?: []; foreach ($seleccion as $p) { if ($p->post_status === 'publish') $posts[] = $p; } } // Fallback: últimos artículos si no hay selección if (empty($posts)) { $posts = get_posts([ 'posts_per_page' => 9, 'category__in' => [1650], 'category__not_in' => [6, 21, 22, 23, 26, 58, 40, 1645, 1646, 1647, 1648, 1649, 1651, 1652], 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]); } if (!$posts) return ''; $html = '
' . '

' . esc_html($atts['titulo']) . '

' . '
'; foreach ($posts as $post) $html .= fea_card($post); return $html . '
'; }); // ── Shortcode: [fea_evangelio] ──────────────────────────────────────────── // Editorial (cat 1646) primero, luego comentarios (cat 1647). Máx 7 en total. add_shortcode('fea_evangelio', function($atts) { $atts = shortcode_atts(['titulo' => 'Comentarios al evangelio'], $atts); $editorial = get_posts([ 'posts_per_page' => 1, 'category__in' => [1646], 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]); $comentarios = get_posts([ 'posts_per_page' => 6, 'category__in' => [1647], 'category__not_in' => [1646], 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]); $posts = array_merge($editorial, $comentarios); if (!$posts) return ''; $html = '
' . '

' . esc_html($atts['titulo']) . '

' . '
'; foreach ($posts as $post) $html .= fea_card($post); return $html . '
'; }); // ── Shortcode: [fea_eucaristia] ─────────────────────────────────────────── add_shortcode('fea_eucaristia', function($atts) { $atts = shortcode_atts(['titulo' => 'Para una eucaristía más participativa'], $atts); $posts = get_posts([ 'posts_per_page' => 6, 'category__in' => [1648], 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]); if (!$posts) return ''; $html = '
' . '

' . esc_html($atts['titulo']) . '

' . '
'; foreach ($posts as $post) $html .= fea_card($post); return $html . '
'; }); // ── Shortcode: [fea_multimedia] ─────────────────────────────────────────── add_shortcode('fea_multimedia', function($atts) { $atts = shortcode_atts(['titulo' => 'Multimedia'], $atts); $page = (int) get_option('page_on_front'); $posts = []; if (function_exists('get_field')) { $seleccion = get_field('portada_multimedia', $page) ?: []; foreach ($seleccion as $p) { if ($p->post_status === 'publish') $posts[] = $p; } } if (empty($posts)) { $posts = get_posts([ 'posts_per_page' => 4, 'category__in' => [1649, 26, 58], 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]); } if (!$posts) return ''; $html = '
' . '

' . esc_html($atts['titulo']) . '

' . '
'; foreach ($posts as $post) $html .= fea_card($post); return $html . '
'; }); // ── Reescribir links internos al idioma activo (Polylang) ───────────────── add_filter('the_content', function($content) { if (!function_exists('pll_current_language') || !function_exists('pll_get_post')) return $content; $lang = pll_current_language(); if (!$lang || $lang === 'es') return $content; return preg_replace_callback( '/]*\s)?href=["\']([^"\']+)["\']([^>]*)>/i', function($m) use ($lang) { $href = $m[2]; $home = home_url(); if (strpos($href, $home) === false) return $m[0]; $post_id = url_to_postid($href); if (!$post_id) return $m[0]; $translated_id = pll_get_post($post_id, $lang); if (!$translated_id || $translated_id === $post_id) return $m[0]; $new_url = get_permalink($translated_id); if (!$new_url) return $m[0]; return str_replace($href, $new_url, $m[0]); }, $content ); }, 20);