Usando parámetros URL, listar entradas de categoría y taxonomía personalizada

1 jul 2013, 21:02:11
Vistas: 24.1K
Votos: 4

Por ejemplo, http://example.com/?cat=6&tag=books lista las entradas que pertenecen a la categoría ID 6 y están etiquetadas como 'books' (es decir, entradas que cumplen ambas condiciones).

De manera similar, http://example.com/feed/?cat=6&tag=books hace lo mismo para los feeds.

Ahora, digamos que mi blog tiene una taxonomía personalizada llamada 'edition', con términos 'usa', 'uk', 'china', y así sucesivamente. La URL http://example.com/?edition=usa,china lista las entradas que pertenecen a ambas ediciones 'usa' y 'china'.

Y http://example.com/category/cars/?edition=usa lista aquellas entradas de la categoría 'Cars' que también pertenecen a el término de taxonomía personalizada 'usa'.

El problema

Uso el siguiente código en mi functions.php:

add_filter('pre_get_posts','better_editions_archive');
function better_editions_archive( $better_editions_query ) {

    /* Parece que esta línea necesita ser cambiada, no estoy seguro cómo */
    if ( $better_editions_query->is_tax( 'edition' ) && $better_editions_query->is_main_query() ) {

        $better_editions_terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
        $better_editions_query->set( 'post_type', array( 'post' ) );
        $better_editions_query->set( 'tax_query',
            array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => $better_editions_terms,
                    'operator' => 'NOT IN'
                )
            )
        );

    }

    return $better_editions_query;
}

El código asegura que si una entrada no está asignada a ninguna Edition (es decir, si una entrada no está asignada a ningún término que pertenezca a la taxonomía personalizada 'edition'), la entrada se muestra/lista bajo todos los archivos de términos/feeds de la taxonomía personalizada 'edition'.

Ahora, http://example.com/category/cars/?edition=usa solo lista las entradas que pertenecen a la categoría 'cars' y están específicamente marcadas como 'usa' (un término perteneciente a la taxonomía personalizada 'edition'). No muestra aquellas entradas que no están asignadas a ningún término en la taxonomía personalizada 'edition'. ¿Cómo puedo arreglar esto?

(PD: Establecer términos predeterminados para las entradas no es una opción, ya que podríamos agregar más ediciones más adelante.)


Resuelto pero...

He elaborado una solución que pueden ver como respuesta a esta pregunta. La recompensa sigue en pie, así que siéntanse libres. :)

6
Comentarios

Estoy seguro de que es posible (puedes hacerlo con WP_Query, puedes construir tu propio WP_Query e incluso puedes crear reglas de reescritura personalizadas para construir esta consulta). Sin embargo, no estoy seguro de que funcione directamente sin configuración adicional.

Krzysiek Dróżdż Krzysiek Dróżdż
1 jul 2013 21:21:40

@KrzysiekDróżdż Siempre y cuando tenga la flexibilidad de los parámetros de URL, sí.

its_me its_me
1 jul 2013 21:24:02

Aquí hay información sobre wp_query y consultas de taxonomía: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters Luego verifica los query_vars registrados (si está registrado, úsalo y si no, agrega el tuyo propio con global $wp; $wp->add_query_var('author_more');

Krzysiek Dróżdż Krzysiek Dróżdż
1 jul 2013 21:44:39

@its_me, ¿el problema es que tu filtro anterior está sobrescribiendo las consultas de taxonomía actuales? ¿O no está teniendo ningún efecto en los resultados?

Eric Holmes Eric Holmes
3 jul 2013 22:12:09

@EricHolmes No tiene ningún efecto en los resultados cuando se usan los parámetros de URL, como en http://example.com/category/cars/?edition=usa

its_me its_me
3 jul 2013 22:14:34

@Milo 1. Creo que is_tax( 'edition' ) funciona bien. El código de mi pregunta solo no funciona cuando se usan los parámetros de URL category_name/edition. Entonces, creo que es más como si la declaración condicional debería incluir también categorías de alguna manera. 2. No pude encontrar suficientes ejemplos en la web para entender cómo usar posts_where. :-/

its_me its_me
4 jul 2013 11:17:41
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 2
2

En circunstancias generales, utilizando parámetros en la URL, puedes listar publicaciones que pertenecen a una categoría específica Y una taxonomía personalizada, así:

http://example.com/category/cars/?edition=usa

Donde, category es la base de categorías que estás usando en tu sitio (Panel de WordPress > Ajustes > Enlaces permanentes > Base de categorías); edition es la base/slug de la taxonomía personalizada; y usa es un término dentro de la taxonomía personalizada.

Si deseas incluir más de una categoría/taxonomía personalizada, estos ejemplos podrían ayudarte:

http://example.com/category/cars/?edition=usa,india
http://example.com/?category_name=cars,books&edition=usa,india

Y los Feeds:

http://example.com/category/cars/?edition=usa,india&feed=rss2
http://example.com/?category_name=cars,books&edition=usa,india&feed=rss2

Lectura adicional:


PERO...

Como expliqué en mi pregunta, mi caso es complejo, así que desarrollé una solución alternativa. Aquí está...

  1. El bloque de código en la pregunta asegura que si una publicación no está asignada a ninguna Edición (es decir, si una publicación no está asignada a ningún término de la taxonomía personalizada 'edition'), la publicación se muestra/lista en todos los archivos/feeds de términos de la taxonomía 'edition'.

    PERO AHORA, eliminé ese código. Luego creé un nuevo término en la taxonomía 'edition', llamado 'intl' (Internacional). Cualquier publicación que desee mostrarse en todas las Ediciones se asignará a 'intl'. Pero, ¿cómo me aseguro de que todas las publicaciones asignadas a 'intl' aparezcan en todos los archivos/feeds de términos de mi taxonomía personalizada?

    Para ello, ahora uso este código (va en functions.php):

    add_filter('pre_get_posts','better_editions_archive');
    function better_editions_archive( $query ) {
        if ( $query->is_tax( 'edition' ) && $query->is_main_query() ) {
            $query->set( 'post_type', array( 'post' ) );
            $query->set( 'tax_query',
                array(
                    'relation' => 'OR',
                    array(
                        'taxonomy' => 'edition',
                        'field' => 'slug',
                        'terms' => 'intl',
                        'operator' => 'IN'
                    )
                )
            );
        }
        return $query;
    }
    

    Así que ahora, por ejemplo, http://example.com/edition/usa/ lista publicaciones que pertenecen a 'usa' o 'intl' (que son términos de mi taxonomía 'edition'). Su feed, http://example.com/edition/usa/feed/, hace lo mismo.

  2. Volviendo al problema principal de la pregunta. ¿Cómo listo publicaciones que pertenecen a una categoría específica Y una edición, usando parámetros en la URL?

    Por ejemplo, ¿cómo listo publicaciones que pertenecen a la categoría 'cars' Y la edición 'usa'?

    Así debería verse la URL: http://example.com/category/cars/?edition=usa,intl (ya que también queremos las publicaciones que se muestran en todas las ediciones, es decir, las asignadas al término 'intl'). Para los feeds: http://example.com/category/cars/feed/?edition=india,intl

¡Eso es todo!

(Un agradecimiento especial a @kaiser por su ayuda.)


Notas

Si deseas modificar la consulta principal/loop directamente en la plantilla, por ejemplo, taxonomy-edition.php (en mi caso), aquí tienes un ejemplo de cómo se puede hacer:

<?php
$edition_term = get_term( get_queried_object(), 'edition' )->slug;
$better_editions = new WP_Query(
    array(
        'post_type' => 'post',
        'tax_query' => array(
            array(
                'taxonomy' => 'edition',
                'field' => 'slug',
                'terms' => array( $edition_term, 'intl' )
            )
        )
    )
);
?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php if ( $better_editions->have_posts() ) : ?>

    <?php /* Inicia el Loop */ ?>
    <?php while ( $better_editions->have_posts() ) : $better_editions->the_post(); ?>
        <?php get_template_part( 'content', get_post_format() ); ?>
    <?php endwhile; wp_reset_postdata(); ?>

<?php else : ?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php endif; ?>

Sin embargo, a menos que realmente lo necesites, usa pre_get_posts.

4 jul 2013 17:18:24
Comentarios

Estoy confundido acerca de con qué estás teniendo problemas. Dices en tu respuesta: "usando parámetros de URL, puedes listar publicaciones que pertenecen a una categoría específica Y a una taxonomía personalizada, así...", y luego más adelante, "Volviendo al problema principal de la pregunta. ¿Cómo listo publicaciones que pertenecen a una categoría específica Y a una edición, usando parámetros de URL?" ¿Puedes explicar (brevemente, ya que mi capacidad de atención es bastante limitada) con qué necesitas ayuda?

Matthew Boynes Matthew Boynes
6 jul 2013 20:13:04

@MatthewBoynes Claramente mencioné al inicio de la segunda parte de mi respuesta: "Como expliqué en mi pregunta, mi caso es complejo..." es decir, estaba usando un código (ver pregunta) que "se asegura de que si una publicación no está asignada a ninguna Edición (es decir, si una publicación no está asignada a ningún término que pertenezca a la taxonomía personalizada 'edition'), la publicación se muestre/liste en todos los archivos/feeds de términos de la taxonomía personalizada 'edition'". ¿Más claro ahora? :)

its_me its_me
10 jul 2013 16:38:35
2
-3

Es posible que tengas que utilizar wp_query, donde puedes configurar tu propia consulta para mostrar cualquier categoría que desees, y luego, cuando termines, restablecerla al comportamiento predeterminado.

4 jul 2013 02:37:03
Comentarios

El código en cuestión ya funciona con la consulta principal. ¿Cómo ayudaría crear una consulta secundaria a resolver la pregunta?

Rarst Rarst
6 jul 2013 15:24:22

Lo que estaba pensando era crear una nueva consulta que maneje tanto la consulta principal en cuestión como cualquier elemento que no se esté mostrando. No proporcioné código porque asumí que mi respuesta daría suficientes pautas a la persona que hizo la pregunta. Obviamente no a mucha gente le gusta este enfoque, sin embargo yo lo he usado y funciona perfectamente.

Greeso Greeso
6 jul 2013 21:31:54