wordpress wp-query – Declaración SQL generada por WP_Query que no produce los resultados esperados

Pregunta:

Estoy tratando de modificar WP_Query en el gancho de acción pre_get_posts , para filtrar las publicaciones devueltas, según la category post_tag y post_tag taxonomías post_tag .

Me gustaría que las únicas publicaciones devueltas por la consulta tengan ambas taxonomías no registradas en absoluto, o no se establezca un término para ambas taxonomías para la publicación o, en último caso, ambas taxonomías tienen un valor específico.

En la página del Codex WP_Query que para este tipo de propósito se deben utilizar "taxonomías anidadas" ( ver aquí ).

Aunque en mi caso particular no funciona, aquí está mi código:

// In a function hooked on 'pre_get_posts' action
$query->set('post_type', array('post','wpgdacces_acces', 'page'));
$query_tax_param = array(
    'relation' => 'OR',
    array( 
        'relation' => 'AND',
        array(  'taxonomy' => 'category',
                'field' => 'slug',
                'terms' => array( 'private' ),
                'operator' => 'IN'),
        array( 'taxonomy' => 'post_tag',
                'field' => 'slug',
                'terms' => array('private'),
                'operator' => 'IN')
    ),
    array(
        'relation' => 'AND',
        array( 'taxonomy' => 'category',
               'field' => 'slug',
               'operator' => 'NOT EXISTS'
               ),
        array( 'taxonomy' => 'post_tag',
               'field' => 'slug',
               'operator' => 'NOT EXISTS'
               ) 
    )
);

Antes de eso, registré el tipo de publicación personalizada 'wpgdacces_acces', y también post_tag category taxonomías post_tag y la post_tag de post_tag para el tipo de post_tag de la page .

Estoy probando la consulta en un entorno local, en una instalación de WP 4.3 con el tema predeterminado. En esta configuración, tengo 3 publicaciones estándar, de las cuales solo una tiene el término 'privado' para Categoría y Etiquetas. Los 2 puestos restantes tienen "Sin clasificar" como término de categoría. También tengo 3 páginas, para las cuales no se establece un término para ambas taxonomías. Y en mi tipo de publicación personalizada 'wpgdacces_acces', para la que no se han registrado ambas taxonomías, tengo 2 publicaciones.

Entonces, en la página de inicio, la consulta se modifica para mostrar los 3 tipos de post : post , page y 'wpgdacces_acces' (la primera línea de código en el bloque aquí arriba). Y, por lo tanto, debería ver 1 publicación + 3 páginas + 2 publicaciones de wpgdacces_acces. Pero el único elemento que se muestra es la publicación estándar con Categoría y Etiquetas configuradas como 'privadas'.

Realmente extraño: cuando modifico y ejecuto la consulta con las dos condiciones por separado (alterando la consulta para obtener solo publicaciones con taxonomías no configuradas, en un lado, y alterando la consulta para obtener publicaciones con taxonomías configuradas como privadas, en el otro lado) está funcionando perfectamente.

Esto me permite pensar que la declaración SQL generada por WP_Query después de pre_get_posts podría estar equivocada en alguna parte. Aquí está, impreso con echo $GLOBALS['wp_query']->request; en el gancho 'wp_footer':

SELECT SQL_CALC_FOUND_ROWS  wptom_posts.ID 
FROM wptom_posts  
INNER JOIN wptom_term_relationships 
ON (wptom_posts.ID = wptom_term_relationships.object_id)  
INNER JOIN wptom_term_relationships 
AS tt1 
ON (wptom_posts.ID = tt1.object_id) 
WHERE 1=1  
AND ( 
   ( 
    wptom_term_relationships.term_taxonomy_id IN (7) 
    AND 
    tt1.term_taxonomy_id IN (8)
  ) 
   OR 
  ( 
    NOT EXISTS (
            SELECT 1
            FROM wptom_term_relationships
            INNER JOIN wptom_term_taxonomy
            ON wptom_term_taxonomy.term_taxonomy_id = wptom_term_relationships.term_taxonomy_id
            WHERE wptom_term_taxonomy.taxonomy = 'category'
            AND wptom_term_relationships.object_id = wptom_posts.ID
        ) 
    AND 
    NOT EXISTS (
            SELECT 1
            FROM wptom_term_relationships
            INNER JOIN wptom_term_taxonomy
            ON wptom_term_taxonomy.term_taxonomy_id = 
            wptom_term_relationships.term_taxonomy_id
            WHERE wptom_term_taxonomy.taxonomy = 'post_tag'
            AND wptom_term_relationships.object_id = wptom_posts.ID
        )
  )
) AND wptom_posts.post_type 
  IN ('post', 'wpgdacces_acces', 'page') 
  AND (wptom_posts.post_status = 'publish' 
  OR wptom_posts.post_author = 1 
  AND wptom_posts.post_status = 'private') 
  GROUP BY wptom_posts.ID 
  ORDER BY wptom_posts.post_date 
  DESC LIMIT 0, 10

¿Ve algo incorrecto en la declaración SQL anterior? Me gustaría averiguar qué está mal en esa declaración SQL. Si sé lo que está mal, tal vez pueda usar uno de los filtros WP_Query proporcionados para modificar la consulta después de pre_get_posts , pero antes de que se ejecute realmente.

Respuesta:

Se parece a esta sección:

AND (wptom_posts.post_status = 'publish' 
OR wptom_posts.post_author = 1 
AND wptom_posts.post_status = 'private') 

no está vinculado en absoluto a las dos condiciones de consulta diferentes …

Quizás el código original debería tener tres condiciones para la parte 1:

array( 
    'relation' => 'AND',
    array(  'taxonomy' => 'category',
            'field' => 'slug',
            'operator' => 'IN'),
    array( 'taxonomy' => 'post_tag',
            'field' => 'slug',
            'operator' => 'IN'),
    array( 'terms' => array('private') )
),

Estoy adivinando un poco aquí sin probarlo, pero eso es lo que intentaría.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım