web-dev-qa-db-fra.com

have_posts () retourne false mais le compte dit "3"

La situation est la suivante: j'ai créé un type de publication personnalisé qui fonctionne parfaitement. Je souhaite maintenant créer un modèle de page d'archive spécifique pour les taxonomies de ce type de publication.

J'ai dupliqué la page archive.php de mon thème (schéma de MTS) mais cela ne fonctionne pas dans ce cas.

Voici le code:

<?php

$term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ), get_query_var( 'count' ) );
echo $term->name;
echo ' has nr elements: ';
echo $term->count;


?>
<div id="page">
    <div class="<?php mts_article_class(); ?>">
        <div id="content_box">
            <h1 class="postsby">
                <span><?php echo the_archive_title(); ?></span>
            </h1>
            <?php $j = 0; if (have_posts()) : while (have_posts()) : the_post(); ?>
                <article class="latestPost excerpt  <?php echo (++$j % 3 == 0) ? 'last' : ''; ?>">
                    <?php mts_archive_post(); ?>
                </article><!--.post excerpt-->
                <?php endwhile; else: echo 'nothing'; endif; ?>

            <?php if ( $j !== 0 ) { // No pagination if there is no posts ?>
                <?php mts_pagination(); ?>
            <?php } ?>
        </div>
    </div>
    <?php get_sidebar(); ?>
<?php get_footer(); ?>

L'aspect étrange est que le code n'imprime "rien" car la fonction have_posts() renvoie false mais le $term->count est 3.

Pouvez-vous m'aider s'il vous plaît? Merci beaucoup d'avance!

1
castp

J'ai eu le même problème.

Selon documentation :

The hierarchy for a custom taxonomy is listed below:

taxonomy-{taxonomy}-{term}.php
taxonomy-{taxonomy}.php
taxonomy.php
archive.php
index.php

Ainsi, peu importe le fichier de modèle que vous utilisez, ils génèrent tous le même problème.

Quand j'ai mis au début du code de fichier modèle var_dump($wp_query);, j'ai trouvé ceci:

public 'request' => string 'SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (20)
) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10' (length=433)
  public 'posts' =>

La partie importante de cette requête est wp_posts.post_type IN ('post', 'page', 'attachment').

Un problème se produit car il n'y a pas votre post_type personnalisé dans ce tableau ('post', 'page', 'attachment').

Je ne sais pas pourquoi c'est arrivé, mais il est possible de le réparer en utilisant pre_get_posts hook:

add_filter('pre_get_posts', 'add_custom_post_type_to_query');
function add_custom_post_type_to_query($query) {
    // We do not want unintended consequences.
    if ( is_admin() || ! $query->is_main_query() ) {
        return;    
    }

    // Check if custom taxonomy is being viewed
    if( is_tax() && empty( $query->query_vars['suppress_filters'] ) )         
    {
        $query->set( 'post_type', array( 
            'post',
            'page',
            'my_custom_post_type'
        ) );
    }
}
1
sviriden

Ce qui ne va pas ici, ce sont vos hypothèses selon lesquelles les valeurs devraient être les mêmes. Je ne sais pas exactement ce que le nombre de termes représente exactement, et cela n'apparaît pas dans la documentation, mais il s'agit probablement d'un nombre brut de messages associés à ce terme. OTOH wp_query (qui est utilisé pour la boucle principale) prend en compte les autorisations utilisateur au-dessus de ce nombre brut, exemple le plus simple. Par défaut, le résultat n'inclut pas les publications non publiées. Des problèmes plus complexes peuvent se produire si vous avez des plugins qui manipuler la requête.

0
Mark Kaplun