web-dev-qa-db-fra.com

Archive de termes taxonomiques paginés comprenant un post par terme

J'ai une requête personnalisée qui obtient toutes les taxonomies personnalisées pour le type de message personnalisé et affiche le dernier message dans chacune. Pour le moment, il attire toutes les taxonomies . Est-il possible de limiter le nombre de taxonomies affichées à un nombre défini par page et de les paginer?

// Set post type
$post_type = 'prints';

// Get all the taxonomies for this post type
$taxonomies = get_object_taxonomies( (object) array( 'post_type' => $post_type ) );

foreach( $taxonomies as $taxonomy ) : 

    // Get every "category" (term) in this taxonomy to get the respective posts
    $terms = get_terms( $taxonomy );

    foreach( $terms as $term ) : 

       // Query to show first post in taxonomy
        $posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );

        if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post(); ?><!-- 
        --><div>
            <a href="<?php esc_url( the_permalink() ); ?>">
                <?php the_post_thumbnail ('medium'); ?>
                <h2><?php echo $term->name; ?></h2>
            </a>
        </div><?php
        endwhile; endif;

    endforeach;

endforeach;
2
jasonbradberry

Pour que la pagination fonctionne, vous devez passer une requête paginée var. Peut-être dans un modèle de page personnalisé.

puis...

$tax_per_page = 2;

$post_type = 'print';

$taxonomies = get_object_taxonomies( $post_type );

$page = get_query_var('paged') > 1 ? get_query_var('paged')-1 : 0;

$splitted_taxes = array_chunk($taxonomies, $tax_per_page);

$taxonomies_on_page = isset($splitted_taxes[$page]) ? $splitted_taxes[$page] : false;

if ($taxonomies_on_page) { foreach( $taxonomies_on_page as $taxonomy ) {

  $terms = get_terms( $taxonomy );

  foreach( $terms as $term ) : 

    $posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );

    if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post();
    ?>
    <div>
    <a href="<?php esc_url( the_permalink() ); ?>">
    <?php the_post_thumbnail('medium'); ?>
    <h4><?php echo $term->name; ?></h4>
    </a>
    </div>
    <?php
    endwhile; endif;

  endforeach;

} }

Note : code posté au dessus de la pagination des taxonomies pas des termes, car vous demandez cela en question.

1
gmazzap

Comme discuté dans le chat et comme vous l’a déjà dit @Rarst, il n’ya pas de moyen par défaut de WordPress à accomplir.

Archive de plusieurs taxonomies et de tous leurs termes

En fait, il n'y a aucun moyen d'accomplir

Archives de la taxonomie unique et de tous ses termes

dans WordPress. Tout simplement parce que WordPress ne le fait pas - sans requêtes SQL personnalisées.

Mais vous pouvez faire certaines choses pour simplifier votre approche.

Comme vous l'avez dit dans le chat, je vais entrer un peu plus dans les détails:

Ce que j'essaie de créer est essentiellement une archive de catégories. Ainsi, pour chaque catégorie (taxonomie personnalisée), je souhaite afficher une image sélectionnée de l'un des messages et le titre de la catégorie.

$taxonomies = get_object_taxonomies( get_post_type_object( 'prints' )->name, 'names' );

Remarque: Si vous définissez le deuxième argument de get_object_taxonomies() sur objects, vous obtiendrez les objets complets pour une utilisation ultérieure.

Et get_terms() prend un tableau de taxonomies comme premier argument. Vous pouvez donc effectuer les opérations suivantes pour obtenir toutes les conditions de toutes vos taxonomies affectées au CPT prints.

Remarque: Si vous utilisez le deuxième argument ci-dessus et obtenez les objets complets, utilisez wp_list_pluck() pour extraire les noms de taxonomie.

$terms = get_terms( $taxonomies, array() );

Si vous avez besoin d'influencer l'ordre, vous pouvez utiliser les arguments orderby (default: name) et order (default: ASCendending) dans le deuxième argument/tableau de l'appel de fonction ou utiliser un filtre:

apply_filters( 'get_terms_orderby', $orderby, $args );

Comme indiqué au début, il n’existe aucun moyen par défaut d’atteindre votre objectif consistant à obtenir une publication unique avec la requête de conditions. Mais vous pouvez toujours créer votre propre requête SQL. Et il y a un filtre pour ça:

apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );

Ainsi, vous pouvez accéder, modifier la requête, inclure la table des publications, etc.

add_action( 'terms_clauses', 'wpse114800_get_terms_with_posts', 20, 3 );
function wpse114800_get_terms_with_posts( $clauses, $taxonomies, $args )
{
    // Alter the $clauses

    return $clauses;
}

Le résultat du rappel de filtre ci-dessus modifiera la requête construite par WordPress. Le défaut dans le noyau ressemble à ceci:

"SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits"

La clause JOIN est construite comme suit:

"INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"

Ce que vous devez faire maintenant est de JOIN le $wpdb->term_relationship probablement avec quelque chose comme ce qui suit:

INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id

emprunté à wp_get_object_terms() dans le noyau.

La clause WHERE ressemblera alors vraisemblablement à ceci:

$wpdb->prepare( "WHERE tt.taxonomy IN (%s)", "'".implode( "', '", $taxonomies)."'" )

À partir de là, vous devriez pouvoir JOIN la table $wpdb->posts sur la ID et interroger également une publication par terme de taxonomie.

Je recommanderais fortement de mettre en cache le résultat, de l'ajouter en tant que transitoire ou quelque chose de similaire, car la requête peut être très lente.

1
kaiser