web-dev-qa-db-fra.com

Afficher les publications d'un seul formulaire de publication dans une requête personnalisée et exclure dans la requête principale

J'essaie tout d'abord d'afficher quatre publications avec post-format-apart (toutes affectées à la balise actuelle), puis d'afficher la "vraie" archive (exclure post-format-apart) pour la balise spécifique. En ce moment, j'utilise une fonction pour exclure le format de publication, en dehors de la requête principale:

add_action('pre_get_posts', 'keyl_get_emp_posts');
function keyl_get_emp_posts($query) {
if (is_tag()) {
if ($query->is_main_query())
 $taxq = array(
    'tag' => $current_tag,
    array(
        'taxonomy' => 'post_format',
        'field' => 'slug',
        'terms' => array(
            'post-format-aside'
          ),
        'operator' => 'NOT IN'
    )
);

    $query->set('tax_query',$taxq);
}

}

Puis-je essayer d'afficher la requête personnalisée avec uniquement post-format-côté avec

<div class="row">
<?php $current_tag = single_tag_title("", false);
$args = array(
    'posts_per_page' => 4,
    'tag' => $current_tag,
    'post_type' => array('post', 'renvoeringsdamm'),
    'tax_query' => array(
        array(
            'taxonomy' => 'post_format',
            'field' => 'slug',
            'terms' => array( 'post-format-aside' )
        )
    )
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
  while ( $query->have_posts() ) {
    $query->the_post(); ?>
    <div class="col-sm-3 col-xs-6">
        <?php get_template_part( 'content', get_post_format() ); ?>
    </div>
    <?php
  }
      wp_reset_postdata();
} ?>
</div>

Mais la requête spéciale qui concerne uniquement post-format-apart affiche les publications de tous les types de post-formats ... Ma question est donc la suivante: qu'est-ce qui ne va pas avec ce que j'ai fait jusqu'à présent! ..

1
HannesH

Je ne soupçonne pas que votre tax_query vous manque, mais en réalité votre paramètre tag l'est. single_tag_title() renvoie le nom de la balise, pas le slug.

Toutes les requêtes de balises et de catégories sont converties en un tax_query dans la classe WP_Query avant d’être transmises à la classe WP_Tax_Query pour générer la chaîne relative de la requête SQL. Les noms de termes et les slugs sont désinfectés avant validation et avant d’obtenir l’ID de terme du ou des termes passés. ( Juste pour votre intérêt, lisez pourquoi vous ne devriez pas utiliser les noms de termes et le paramètre name dans un tax_query, vérifiez ma réponse ici)

Maintenant, les slugs devraient/toujours être en minuscule et plusieurs mots séparés par des traits d'union. Vous passez un nom en tant que limace. Parce que le terme "nom" ne correspond à rien dans le terme "colonne slug" ( parce que vous avez demandé au tax_query de regarder dans la colonne "slug" ), WP_Tax_Query accepte que le terme soit invalide et n'existe pas. abandonne et retourne une chaîne vide. C'est là qu'intervient le gros défaut ( qui, à mon avis, est un bogue qui devrait être corrigé ). WP_Tax_Query renvoie une chaîne de jointure SQL vide à WP_Query, WP_Query lit ceci à tort comme s'il n'y avait jamais eu tax_query et continue à générer puis à exécuter le code SQL sans la clause join. De manière inattendue, cela retourne ensuite allposts indépendamment de l'endroit où, à mon avis, il devrait simplement ne renvoyer aucun message. C'est ce que vous voyez

Voyons donc une solution, nettoyons également votre code et le rendre plus fiable

Tout d'abord, votre action pre_get_post

  • Ajoutez une coche pour cibler uniquement le serveur, sinon les requêtes du serveur seront également affectées.

  • Définissez is_tag() sur l'instance actuelle

  • Obtenez le tax_query actuel sur la page de balises et modifiez-le pour ajouter la section de format de publication et transmettez-le en tant que nouveau tax_query

Vous pouvez ajuster votre code à quelque chose comme ceci: ( J'utilise des fermetures, mais vous pouvez revenir à l'ancien style comme dans votre question; -) )

add_action('pre_get_posts', function ($q) 
{
    if (    !is_admin() // Only targets front end queries
         && $q->is_main_query() // Only targets the main query
         && $q->is_tag() // Only targets tag archive pages  
    ) {
        // Gets the current tax_query
        $tax_query_obj = $q->tax_query->queries;
        // Add the post format query part to the current tax_query
        $tax_query_obj[] = [
            'taxonomy' => 'post_format',
            'field' => 'slug',
            'terms' => ['post-format-aside'],
            'operator' => 'NOT IN'
        ];
        //Build a proper tax query
        $tax_query = [
            'relation' => 'AND',
            $tax_query_obj
        ];
        // Set the modified tax_query
        $q->set( 'tax_query', $tax_query );

        // Set any additional parameters here except tag parameters
    }
}, PHP_INT_MAX );

En ce qui concerne votre requête personnalisée, nous pouvons obtenir l’ID de la balise en cours d’affichage en utilisant simplement get_queried_object_id(), puis en l’utilisant dans un tax_query avec notre format de publication. Vous pouvez essayer ce qui suit dans vos arguments: ( Requiert PHP 5.4+ en raison de la nouvelle syntaxe de tableau abrégé ([]) )

$args = [
    'tax_query' => [
        [
            'taxonomy' => 'post_tag', // Default tag taxonomy
            'terms' => get_queried_object_id(), // Gets current tag archive tag ID
        ],
        [
            'taxonomy' => 'post_format',
            'field' => 'slug',
            'terms' => 'post-format-aside'
        ],
    ],
    // Rest of your arguments excluding tag parameter
];
1
Pieter Goosen