J'ai deux types de messages personnalisés et séparer taxonomies
pour chacun.
dramas
--------- taxonomie - drama_taxonomy
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?
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
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
// 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();
}