web-dev-qa-db-fra.com

Obtenir des publications par nom et terme de taxonomie

Comment puis-je obtenir tous les messages qui ont un terme de taxonomie et un nom/slug spécifique?

J'ai essayé avec les arguments suivants mais sans obtenir le résultat souhaité. Qu'est-ce qui me manque, comment puis-je combiner le slug et le terme dans la même requête?

array(      
    'name' => '<name of post>',
    'tax_query' => array(
        array(
            'taxonomy' => '<taxonomy>',
            'field' => 'slug',
            'terms' => <slug>,
            'operator' => 'IN'
        )
    ),      
)

Le SQL:

SELECT  wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_name = '<slug-name>' AND wp_posts.post_type = '<post type>' AND ((wp_posts.post_status = 'publish'))  ORDER BY wp_posts.post_date DESC

Si je supprime le champ "name", la partie taxonomie du code SQL est correcte.

array(
    'tax_query' => array(
        array(
            'taxonomy' => '<taxonomy>',
            'field' => 'slug',
            'terms' => <slug>,
            'operator' => 'IN'
        )
    ),      
)

Le SQL:

SELECT   wp_posts.* FROM wp_posts  INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (2)
) AND wp_posts.post_type = '<post type>' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5"
1
user634545

Notez que si vous avez le post-slug, vous n'avez pas besoin de la requête de taxonomie supplémentaire pour trouver ce post. Il est donc logique de supprimer la requête de taxonomie coûteuse au cœur de ce cas.

Sinon, essayez plutôt le paramètre post_name__in:

[      
    'post_name__in' => [ '<postslug>' ],
    'tax_query' => [
        [
            'taxonomy' => '<taxonomy>',
            'field' => 'slug',
            'terms' => <slug>,
            'operator' => 'IN'
        ]
    ],      
];

cela a été introduit dans WordPress 4.4, si vous voulez vraiment que la partie requête taxonomie soit également incluse ;-)

1
birgire