custom-taxonomy – Incluir y excluir taxonomías de archivos y feeds mediante 'pre_get_posts'

Pregunta:

¿Qué estoy tratando de hacer?

Mi blog usa una taxonomía personalizada llamada edition con términos como us-canada (6), eu (7) e india (8) – término slug (ID).

Quiero asegurarme de que las publicaciones no asignadas a ninguna 'edición' específica se muestren bajo todos los términos (es decir, si una publicación no está asignada a EE. UU., Europa o India, se mostrará en las páginas de archivo de todos estos términos) .

¿Qué he probado?

Aquí está el código de muestra perteneciente a uno de los términos, que debería darle una idea de lo que estoy tratando de hacer exactamente y de lo que estaría haciendo mal.

add_filter('pre_get_posts','better_editions_archive');

function better_editions_archive($query) {

    if ( $query->is_tax( 'edition', 6 ) && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post' ) );

        $query->set( 'tax_query',
            array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'id',
                    'terms' => array( 1, 2, 4, 5 )
                ),
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => array( 7, 8 ),
                    'operator' => 'NOT IN'
                )
            )
        );
    }

    return $query;
}

¿Qué ocurre? El código mencionado anteriormente no funciona (otros que he probado: code-1 , code-2 ), no cambia nada. Tampoco hay ningún error de depuración.

Entonces, ¿qué podría estar haciendo mal?

TAMBIÉN , para asegurarme de que los cambios también se apliquen a los feeds de estos términos, reemplacé la línea correspondiente en el código mencionado anteriormente con esto:

function better_editions_archive($query) {

    if ( ( $query->is_tax( 'edition', 6 ) && $query->is_main_query() ) || ( $query->is_feed() && $query->is_tax( 'edition', 6 ) ) ) {

Pero eso comienza a redirigir los términos 'retroalimenta a los archivos de términos'. Es decir, con la función en su lugar, example.com/edition/usa/feed/ redirige a example.com/edition/usa/ .

Una vez más, no tengo ni idea de lo que estaría haciendo mal.

ACTUALIZACIÓN: ¿Qué funcionó para mí? (Pero…)

add_filter( 'pre_get_posts', 'better_editions_archive' );

function better_editions_archive( $query ) {
    if ( $query->is_tax( 'edition', 6 ) && $query->is_main_query() ) {

        $args = array(
            'post_type' => 'post',

            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'id',
                    'terms' => array( 1, 2, 4, 5 )
                ),
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => array( 7, 8 ),
                    'operator' => 'NOT IN'
                )
            )
        );

        $query->query_vars = $args;
    }

    return $query;
}

Funciona, pero el problema es que tuve una conversación de chat prolongada con un desarrollador de WordPress experto, y me dijo esto (puedes seguir la conversación completa aquí , pero es demasiado larga):

Y luego estás asignando esta matriz como query_vars . Ahora query_vars es un objeto bastante grande. Y básicamente está sobrescribiendo los datos allí y simplemente agregando los personalizados. Esto significa que 'desarma' todo lo que se agrega por defecto.

$query->set(); desaconsejó el uso de esta solución y, en su lugar, $query->set(); método.

Pero como puede ver muy arriba, no pude hacer que el otro funcionara. Así que estoy aquí para ver si alguien puede decirme qué estoy haciendo mal, en un lenguaje menos técnico.

Respuesta:

Tomaré otra oportunidad.

Lo siguiente debería modificar la consulta principal, de modo que incluirá en su bucle cualquier publicación que no pertenezca a ningún término de la taxonomía personalizada de la Edición .

add_filter('pre_get_posts','better_editions_archive');

function better_editions_archive( $query ) {

    if ( $query->is_tax( 'edition' ) && $query->is_main_query() ) {
        $terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
        $query->set( 'post_type', array( 'post' ) );
        $query->set( 'tax_query', array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'edition',
                'field' => 'id',
                'terms' => $terms,
                'operator' => 'NOT IN'
            )
        ) );
    }

    return $query;
}

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım