web-dev-qa-db-fra.com

Comment obtenir des publications de plusieurs types de publications personnalisées en fonction de ses termes de taxonomie personnalisés?

J'ai deux types de messages personnalisés et séparer taxonomies pour chacun.

  1. poste type - dramas --------- taxonomie - drama_taxonomy
  2. poste type - reality_shows - taxonomie - reality_shows_taxonomy

Pour l’instant, j’affiche les articles de type dramas_publications sur une page où il apparaît sous son nom.

le code :

<?php       
//fetching the terms for the 'drama_taxonomy' taxonomy
//HERE I WANT TO INCLUDE 'reality_shows_taxonomy' taxonomy too
$terms = get_terms( 'drama_taxonomy', array(
    'orderby'    => 'count',
    'hide_empty' => 0
) );

// now run a query for each dramas terms
foreach( $terms as $term ) {

    // Define the query
    $args = array(
        'post_type' => 'dramas', //HERE I WANT TO INCLUDE 'reality_shows' custom post type too
        'drama_taxonomy' => $term->slug
    );
    $query = new WP_Query( $args ); 
?>
<div class="white-theme">
    <div class="wrapper space">
        <div class="latest-sec">
            <div class="schedule-header">
                <ul class="nav">
                    <li class="content-title"><?php echo $term->name ?></li>
                </ul>
            </div>
            <div style="margin-top:25px;position:relative;padding:0 2%;">
                <div class="video-list-container" id="video-content">
                    <?php 
                        while ( $query->have_posts() ) : $query->the_post(); 
                        $image_id = get_post_thumbnail_id();
                        $image_url = wp_get_attachment_image_src($image_id,'drama_realityshow_home_page_thumb', true);  
                        if ( 'reality_shows' == get_post_type() ) { 
                            $terms = get_the_terms( $post->ID, 'reality_shows_taxonomy' );
                        }
                        else {
                            $terms = get_the_terms( $post->ID, 'drama_taxonomy' );
                        }
                    ?>                                                                              
                    <div class="item">
                        <a href="<?php the_permalink(); ?>" class="standard-height">
                        <img src="<?php echo $image_url[0]; ?>" width="300" height="168" class="hoverZoomLink">
                        </a>
                        <div class="new-cat">
                            <?php 
                                foreach($terms as $term) {
                                  echo $term->name; // HERE I WANT TO GET TERMS FROM BOTH TAXONOMIES
                                } ?>
                        </div>
                    </div>
                    <?php endwhile; ?>
                </div>
                <a class="load-more" href="javascript:load_more()" style="display: none;"></a>
            </div>
        </div>
    </div>
</div>
<?php } ?

Je veux aussi recevoir des articles de reality_shows et il devrait être affiché sous le nom terms.

comment puis-je modifier/mettre à jour ce code selon les besoins ci-dessus?

1
Foolish Coder

Votre meilleure solution ici serait d’exécuter une requête single où vous interrogerez

  • tous les types de poste

  • et tous post de indépendamment de la taxonomie

Une fois que vous avez tout cela, vous pouvez utiliser usort() pour trier vos résultats en conséquence. Je ne sais pas comment vous voudriez que vos types d'articles soient triés, mais supposons que vous souhaitiez les trier par type d'article et par terme

OK, regardons le code, mais avant nous, regardons quelques notes importantes

REMARQUES IMPORTANTES À CONSIDÉRER

  • Le code suivant n'a pas été testé, il est donc possible qu'il soit bogué. Il est conseillé de lancer ceci localement d'abord avec le débogage activé

  • Le code nécessite au moins PHP 5.4 et provoque des erreurs fatales sur les anciennes versions en raison d'une syntaxe de tableau courte et de la déréglementation directe d'un tableau. Si vous utilisez encore d'anciennes versions, il est recommandé de procéder à la mise à niveau. Toutes les versions antérieures à PHP 5.4 ont été supprimées, ce qui représente un risque énorme pour la sécurité de votre site si vous utilisez encore ces versions.

  • TRÈS TRÈS IMPORTANT : La fonction de tri dans usort() ne fonctionnera comme prévu que si vous avez un ou deux types de publication dans votre requête, si vous avez plus de deux types de publication, la logique de la fonction ne fonctionnera pas correctement. La logique fonctionnera également comme prévu si une taxonomie est affectée à chaque type de publication. En outre, si plusieurs postes sont affectés à un seul poste, seul le premier terme est utilisé aux fins de tri.

  • Je vais expliquer le code au fur et à mesure dans le code lui-même pour le rendre facile à comprendre

LE CODE

// Define our query arguments
$args = [
    'post_type' => ['dramas', 'reality_shows'], // Get posts from these two post types
    // Define any additional arguments here, but do not add taxonomy parameters
];
$q = new WP_Query( $args );

/**
 * We now need to sort the returned array of posts stored in $q->posts, we will use usort()
 *
 * There is a bug in usort causing the following error:
 * usort(): Array was modified by the user comparison function
 * @see https://bugs.php.net/bug.php?id=50688
 * This bug has yet to be fixed, when, no one knows. The only workaround is to suppress the error reporting
 * by using the @ sign before usort
 *
 * UPDATE FROM COMMENTS FROM @ birgire
 * The usort bug has been fixed in PHP 7, yeah!!
 */
@usort( $q->posts, function ( $a, $b )
{
    // Sort by post type if two posts being compared does not share the same post type
    if ( $a->post_type != $b->post_type )
        return strcasecmp( $a->post_type, $b->post_type ); // Swop the two variable around for desc sorting

    /**
     * I we reach this point, it means the two posts being compared has the same post type
     * We will now sort by taxonomy terms

     * The logic for the code directly below is, we have two post types, and a single post can only be assigned to 
     * one post type, so a post can only be from the dramas post type or from the reality_shows post type. We also just
     * need to check one of the two posts being compared as we know both posts are from the same post type. If they
     * they were not, we would not have been here
     *
     * The socond part of the logic is that the drama_taxonomy is only assigned to the dramas post type and the 
     * reality_shows_taxonomy is only assigned to the reality_shows post type, so we can set the taxonomy according
     * to post type
     */
    $taxonomy = ( $a->post_type == 'dramas' ) ? 'drama_taxonomy' : 'reality_shows_taxonomy';
    $terms_a = get_the_terms( $a->ID, $taxonomy );
    $array_a = ( $terms_a && !is_wp_error( $terms_a ) ) ? $terms_a[0]->name : 'zzzzz'; // zzzz is some crappy fallback

    $terms_b = get_the_terms( $b->ID, $taxonomy );
    $array_b = ( $terms_b && !is_wp_error( $terms_b ) ) ? $terms_b[0]->name : 'zzzzz'; // zzzz is some crappy fallback

    // We will now sort by terms, if the terms are the same between two posts being compared, sort by date
    if ( $array_a != $array_b ) {
        return strcasecmp( $array_a, $array_b ); // Swop the two variables around to swop sorting order
    } else {
        return $a->post_date < $b->post_date; // Change < to > to swop sorting order around
    }
}, 10, 2 );

// $q->posts is now reordered and sorted by post type and by term, simply run our loop now

Votre boucle devrait ressembler à quelque chose comme ça. Vous devrez modifier cela pour répondre à vos besoins

if ( $q->have_posts() ) {
    // Define variable to hold previous post term name
    $term_string = '';
    while ( $q->have_posts() ) {
    $q->the_post();

       // Set the taxonomy according to post type
      $taxonomy = ( 'reality_shows' == get_post_type() ) ? 'reality_shows_taxonomy' : 'drama_taxonomy';
        // Get the post terms. Use the first term's name
        $terms = get_the_terms( get_the_ID, $taxonomy );
      $term_name = ( $terms && !is_wp_error( $terms ) ) ? $terms[0]->name : 'Not assigned';
        // Display the taxonomy name if previous and current post term name don't match
        if ( $term_string != $term_name )
            echo '<h2>' . $term_name . '</h2>'; // Add styling and tags to suite your needs

        // Update the $term_string variable
        $term_string = $term_name;

        // REST OF YOUR LOOP

    }
 wp_reset_postdata();
}
4
Pieter Goosen