Plugins bloques actualizados

This commit is contained in:
Jose Ibáñez
2026-02-14 18:21:10 +01:00
parent 26d7f11378
commit cc68c21d9a
7 changed files with 315 additions and 280 deletions
+113 -259
View File
@@ -78,6 +78,57 @@ class Bloques_Shortcodes {
return $permalink;
}
/**
* Construir tax_query correcta según el tipo de contenido.
*
* Para noticias: siempre incluye la condición base (category = bloques-en-transicion)
* y la combina con AND con los filtros de iniciativa/linea_trabajo.
* Para CPTs: solo filtra por iniciativa/linea_trabajo.
*
* @param string $type Tipo de contenido (noticias, actuaciones, recursos, eventos)
* @param string $iniciativa Slug de iniciativa para filtrar (vacío = sin filtro)
* @param string $linea Slug de línea de trabajo para filtrar (vacío = sin filtro)
* @return array tax_query lista para WP_Query
*/
private static function build_tax_query($type, $iniciativa = '', $linea = '') {
$tax_query = [];
// Para noticias: siempre requerir la categoría base
if ($type === 'noticias') {
$tax_query[] = [
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['bloques-en-transicion', 'bloques'],
'include_children' => true,
];
}
// Filtro por iniciativa
if (!empty($iniciativa)) {
$tax_query[] = [
'taxonomy' => 'iniciativa',
'field' => 'slug',
'terms' => is_array($iniciativa) ? $iniciativa : explode(',', $iniciativa),
];
}
// Filtro por línea de trabajo
if (!empty($linea)) {
$tax_query[] = [
'taxonomy' => 'linea_trabajo',
'field' => 'slug',
'terms' => is_array($linea) ? $linea : explode(',', $linea),
];
}
// Si hay más de una condición, usar AND
if (count($tax_query) > 1) {
$tax_query['relation'] = 'AND';
}
return $tax_query;
}
/**
* Mapeo de tipos
*/
@@ -106,14 +157,6 @@ class Bloques_Shortcodes {
'template' => 'noticias',
'label_singular' => __('noticia', 'bloques-transicion'),
'label_plural' => __('noticias', 'bloques-transicion'),
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['bloques-en-transicion', 'bloques'],
],
],
],
];
@@ -191,44 +234,10 @@ class Bloques_Shortcodes {
}
}
// Construir tax_query según el tipo
if ($atts['type'] === 'noticias') {
// Para noticias: siempre filtrar por categoría bloques-en-transicion
$args['tax_query'] = [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['bloques-en-transicion', 'bloques'],
'include_children' => true,
],
];
} else {
// Para CPTs: filtros por taxonomía custom
$tax_query = [];
if (!empty($atts['iniciativa'])) {
$tax_query[] = [
'taxonomy' => 'iniciativa',
'field' => 'slug',
'terms' => explode(',', $atts['iniciativa']),
];
}
if (!empty($atts['linea'])) {
$tax_query[] = [
'taxonomy' => 'linea_trabajo',
'field' => 'slug',
'terms' => explode(',', $atts['linea']),
];
}
if (count($tax_query) > 1) {
$tax_query['relation'] = 'AND';
}
if (!empty($tax_query)) {
$args['tax_query'] = $tax_query;
}
// Construir tax_query (para noticias incluye automáticamente la categoría base)
$tax_query = self::build_tax_query($atts['type'], $atts['iniciativa'], $atts['linea']);
if (!empty($tax_query)) {
$args['tax_query'] = $tax_query;
}
$query = new WP_Query($args);
@@ -286,6 +295,16 @@ class Bloques_Shortcodes {
* Renderizar barra de filtros estilo botonera
*/
private static function render_filter_bar($type, $container_id, $show_search, $total_posts, $type_config) {
$iniciativas = get_terms([
'taxonomy' => 'iniciativa',
'hide_empty' => true,
]);
$lineas = get_terms([
'taxonomy' => 'linea_trabajo',
'hide_empty' => true,
]);
ob_start();
?>
<div class="bloques-filters" data-container="<?php echo esc_attr($container_id); ?>">
@@ -295,117 +314,54 @@ class Bloques_Shortcodes {
</div>
<?php endif; ?>
<?php if ($type === 'noticias'): ?>
<?php
// Para noticias: mostrar subcategorías de "bloques-en-transicion" como filtros
$bloques_cat = get_term_by('slug', 'bloques-en-transicion', 'category');
if (!$bloques_cat) {
$bloques_cat = get_term_by('slug', 'bloques', 'category');
}
$child_cats = [];
if ($bloques_cat) {
$child_cats = get_terms([
'taxonomy' => 'category',
'child_of' => $bloques_cat->term_id,
'hide_empty' => true,
]);
}
if (!empty($child_cats) && !is_wp_error($child_cats)): ?>
<div class="bloques-filter-group">
<span class="bloques-filter-label"><?php _e('Filtrar por categoría', 'bloques-transicion'); ?></span>
<div class="bloques-filter-buttons">
<button type="button" class="bloques-filter-btn active" data-taxonomy="category" data-value="">
<?php _e('Todas', 'bloques-transicion'); ?>
<?php if (!empty($iniciativas) && !is_wp_error($iniciativas)): ?>
<div class="bloques-filter-group">
<span class="bloques-filter-label"><?php _e('Filtrar por Iniciativa', 'bloques-transicion'); ?></span>
<div class="bloques-filter-buttons">
<button type="button" class="bloques-filter-btn active" data-taxonomy="iniciativa" data-value="">
<?php _e('Todas las iniciativas', 'bloques-transicion'); ?>
</button>
<?php foreach ($iniciativas as $term):
$color = get_field('color', $term);
$icono = get_field('icono', $term);
?>
<button type="button" class="bloques-filter-btn"
data-taxonomy="iniciativa"
data-value="<?php echo esc_attr($term->slug); ?>"
style="<?php echo $color ? '--btn-active-color: ' . esc_attr($color) . ';' : ''; ?>">
<?php if ($icono): ?>
<img src="<?php echo esc_url($icono); ?>" alt="" class="bloques-filter-icon">
<?php endif; ?>
<?php echo esc_html($term->name); ?>
</button>
<?php foreach ($child_cats as $cat):
// Intentar obtener color/icono de la iniciativa con el mismo slug
$color = '';
$icono = '';
$matched_iniciativa = get_term_by('slug', $cat->slug, 'iniciativa');
if ($matched_iniciativa) {
$color = get_field('color', $matched_iniciativa);
$icono = get_field('icono', $matched_iniciativa);
}
?>
<button type="button" class="bloques-filter-btn"
data-taxonomy="category"
data-value="<?php echo esc_attr($cat->slug); ?>"
style="<?php echo $color ? '--btn-active-color: ' . esc_attr($color) . ';' : ''; ?>">
<?php if ($icono): ?>
<img src="<?php echo esc_url($icono); ?>" alt="" class="bloques-filter-icon">
<?php endif; ?>
<?php echo esc_html($cat->name); ?>
</button>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endif; ?>
<?php else: ?>
<?php
// Para CPTs: mostrar filtros de iniciativa y línea de trabajo
$iniciativas = get_terms([
'taxonomy' => 'iniciativa',
'hide_empty' => true,
]);
$lineas = get_terms([
'taxonomy' => 'linea_trabajo',
'hide_empty' => true,
]);
?>
<?php if (!empty($iniciativas) && !is_wp_error($iniciativas)): ?>
<div class="bloques-filter-group">
<span class="bloques-filter-label"><?php _e('Filtrar por Iniciativa', 'bloques-transicion'); ?></span>
<div class="bloques-filter-buttons">
<button type="button" class="bloques-filter-btn active" data-taxonomy="iniciativa" data-value="">
<?php _e('Todas las iniciativas', 'bloques-transicion'); ?>
<?php if (!empty($lineas) && !is_wp_error($lineas)): ?>
<div class="bloques-filter-group">
<span class="bloques-filter-label"><?php _e('Filtrar por eje de trabajo', 'bloques-transicion'); ?></span>
<div class="bloques-filter-buttons">
<button type="button" class="bloques-filter-btn active" data-taxonomy="linea_trabajo" data-value="">
<?php _e('Todos los ejes', 'bloques-transicion'); ?>
</button>
<?php foreach ($lineas as $term):
$color = get_field('color', $term);
$icono = get_field('icono', $term);
?>
<button type="button" class="bloques-filter-btn"
data-taxonomy="linea_trabajo"
data-value="<?php echo esc_attr($term->slug); ?>"
style="<?php echo $color ? '--btn-active-color: ' . esc_attr($color) . ';' : ''; ?>">
<?php if ($icono): ?>
<img src="<?php echo esc_url($icono); ?>" alt="" class="bloques-filter-icon">
<?php endif; ?>
<?php echo esc_html($term->name); ?>
</button>
<?php foreach ($iniciativas as $term):
$color = get_field('color', $term);
$icono = get_field('icono', $term);
?>
<button type="button" class="bloques-filter-btn"
data-taxonomy="iniciativa"
data-value="<?php echo esc_attr($term->slug); ?>"
style="<?php echo $color ? '--btn-active-color: ' . esc_attr($color) . ';' : ''; ?>">
<?php if ($icono): ?>
<img src="<?php echo esc_url($icono); ?>" alt="" class="bloques-filter-icon">
<?php endif; ?>
<?php echo esc_html($term->name); ?>
</button>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php if (!empty($lineas) && !is_wp_error($lineas)): ?>
<div class="bloques-filter-group">
<span class="bloques-filter-label"><?php _e('Filtrar por eje de trabajo', 'bloques-transicion'); ?></span>
<div class="bloques-filter-buttons">
<button type="button" class="bloques-filter-btn active" data-taxonomy="linea_trabajo" data-value="">
<?php _e('Todos los ejes', 'bloques-transicion'); ?>
</button>
<?php foreach ($lineas as $term):
$color = get_field('color', $term);
$icono = get_field('icono', $term);
?>
<button type="button" class="bloques-filter-btn"
data-taxonomy="linea_trabajo"
data-value="<?php echo esc_attr($term->slug); ?>"
style="<?php echo $color ? '--btn-active-color: ' . esc_attr($color) . ';' : ''; ?>">
<?php if ($icono): ?>
<img src="<?php echo esc_url($icono); ?>" alt="" class="bloques-filter-icon">
<?php endif; ?>
<?php echo esc_html($term->name); ?>
</button>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
</div>
<?php endif; ?>
<div class="bloques-filters-footer">
@@ -651,7 +607,7 @@ class Bloques_Shortcodes {
'subtitle' => __('Próximas actividades', 'bloques-transicion'),
'show_header' => 'true',
'link_text' => __('Ver calendario completo', 'bloques-transicion'),
'link_url' => '/bloques-en-transicion/eventos/',
'link_url' => '/bloques-en-transicion/noticias/',
'upcoming' => 'true',
'class' => '',
], $atts, 'bloques-agenda');
@@ -823,7 +779,6 @@ class Bloques_Shortcodes {
$type = sanitize_text_field($_POST['type'] ?? 'recursos');
$iniciativa = sanitize_text_field($_POST['iniciativa'] ?? '');
$linea = sanitize_text_field($_POST['linea_trabajo'] ?? '');
$category = sanitize_text_field($_POST['category'] ?? '');
$search = sanitize_text_field($_POST['search'] ?? '');
$widget = sanitize_text_field($_POST['widget'] ?? 'grid');
$upcoming = sanitize_text_field($_POST['upcoming'] ?? 'true');
@@ -860,60 +815,8 @@ class Bloques_Shortcodes {
}
}
// Construir tax_query según el tipo
if ($type === 'noticias') {
// Para noticias: filtrar por categorías de WordPress
$base_cat_query = [
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['bloques-en-transicion', 'bloques'],
'include_children' => true,
];
if (!empty($category)) {
// Filtro activo: base AND categoría seleccionada
$args['tax_query'] = [
'relation' => 'AND',
$base_cat_query,
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $category,
'include_children' => true,
],
];
} else {
// Sin filtro: solo la condición base
$args['tax_query'] = [$base_cat_query];
}
} else {
// Para CPTs: filtrar por iniciativa y/o línea de trabajo
$tax_query = [];
if (!empty($iniciativa)) {
$tax_query[] = [
'taxonomy' => 'iniciativa',
'field' => 'slug',
'terms' => $iniciativa,
];
}
if (!empty($linea)) {
$tax_query[] = [
'taxonomy' => 'linea_trabajo',
'field' => 'slug',
'terms' => $linea,
];
}
if (count($tax_query) > 1) {
$tax_query['relation'] = 'AND';
}
if (!empty($tax_query)) {
$args['tax_query'] = $tax_query;
}
}
// Construir tax_query
$args['tax_query'] = self::build_tax_query($type, $iniciativa, $linea);
$query = new WP_Query($args);
@@ -950,7 +853,6 @@ class Bloques_Shortcodes {
$widget = sanitize_text_field($_POST['widget'] ?? 'grid');
$iniciativa = sanitize_text_field($_POST['iniciativa'] ?? '');
$linea = sanitize_text_field($_POST['linea_trabajo'] ?? '');
$category = sanitize_text_field($_POST['category'] ?? '');
$upcoming = sanitize_text_field($_POST['upcoming'] ?? 'true');
$type_config = self::get_type_config($type);
@@ -981,56 +883,8 @@ class Bloques_Shortcodes {
}
}
// Construir tax_query según el tipo
if ($type === 'noticias') {
$base_cat_query = [
'taxonomy' => 'category',
'field' => 'slug',
'terms' => ['bloques-en-transicion', 'bloques'],
'include_children' => true,
];
if (!empty($category)) {
$args['tax_query'] = [
'relation' => 'AND',
$base_cat_query,
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $category,
'include_children' => true,
],
];
} else {
$args['tax_query'] = [$base_cat_query];
}
} else {
$tax_query = [];
if (!empty($iniciativa)) {
$tax_query[] = [
'taxonomy' => 'iniciativa',
'field' => 'slug',
'terms' => $iniciativa,
];
}
if (!empty($linea)) {
$tax_query[] = [
'taxonomy' => 'linea_trabajo',
'field' => 'slug',
'terms' => $linea,
];
}
if (count($tax_query) > 1) {
$tax_query['relation'] = 'AND';
}
if (!empty($tax_query)) {
$args['tax_query'] = $tax_query;
}
}
// Construir tax_query
$args['tax_query'] = self::build_tax_query($type, $iniciativa, $linea);
$query = new WP_Query($args);