Plugins bloques actualizados
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -61,8 +61,8 @@ class Bloques_Taxonomies {
|
||||
'query_var' => true,
|
||||
];
|
||||
|
||||
// Asociar a todos los CPTs de Bloques
|
||||
$post_types = ['actuacion', 'recurso_bloques', 'evento_bloques'];
|
||||
// Asociar a todos los CPTs de Bloques + entradas (noticias)
|
||||
$post_types = ['actuacion', 'recurso_bloques', 'evento_bloques', 'post'];
|
||||
register_taxonomy('iniciativa', $post_types, $args);
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ class Bloques_Taxonomies {
|
||||
'query_var' => true,
|
||||
];
|
||||
|
||||
$post_types = ['actuacion', 'recurso_bloques', 'evento_bloques'];
|
||||
$post_types = ['actuacion', 'recurso_bloques', 'evento_bloques', 'post'];
|
||||
register_taxonomy('linea_trabajo', $post_types, $args);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user