web-dev-qa-db-fra.com

Ordre Liste des articles par termes de taxonomie?

Je me demande comment écrire du code pour commander une liste d'articles en fonction de leurs termes issus de taxonomies personnalisées?

Voici ce que j'ai jusqu'à présent :

  • J'ai une page qui répertorie toutes les publications dans un type de publication personnalisé, sur une seule page.
  • Sous chaque poste CPT, j'ai récupéré les taxonomies personnalisées à afficher.
  • J'ai permis aux postes du CPT d'être triés par Alpha, ASC et DESC.

En fin de compte, cela ressemble à ceci:  enter image description here 

L'objectif :

J'aimerais ajouter quelques liens avec ceux que j'ai déjà "Trier par titre".

Plus précisément, j'aimerais commander par (alpha) Director, Studio et Episodes, car je sais que ce sont des chaînes ou des chiffres.

Je voudrais aussi passer commande avant la saison présentée, par année, mais il se peut que je doive changer la façon dont j'ai nommé ces termes (cela ne fera probablement que cracher l'hiver 2011 et l'hiver 2012 avec la façon dont il est actuellement).

Le tri par genre est une autre affaire à laquelle je ne vais pas m'attaquer à cause des multiples termes.

Je ne sais pas trop comment procéder et je pourrais utiliser l'aide.

Le code actuel de la page :

<div class="content-container">
<a href="?sort=titleup">Sort By Title A-Z</a>
<a href="?sort=titledown">Sort By Title Z-A</a>
<hr>

<?php
$type = 'animes';
$args=array(
'post_type' => $type,
'post_status' => 'publish',
'posts_per_page' => -1,
'caller_get_posts'=> 1
);

if( isset( $_GET['sort'] ) && "titleup" == $_GET['sort'] ){
$args['orderby'] = 'title';
$args['order'] = 'ASC';
}

if( isset( $_GET['sort'] ) && "titledown" == $_GET['sort'] ){
$args['orderby'] = 'title';
$args['order'] = 'DESC';
}

$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<div class="anime-title"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?> Page"><?php the_title(); ?></a></div>

<br><span>Director:</span>
<?php 
$taxonomy = 'director';
// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';

if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {

$term_ids = implode( ',' , $post_terms );
$terms = wp_list_categories( 'title_li=&style=none&echo=0&taxonomy=' . $taxonomy . '&include=' . $term_ids );
$terms = rtrim( trim( str_replace( '<br />',  $separator, $terms ) ), $separator );

// display post categories
echo  $terms;
}
?>

<br><span>Studio:</span>
<?php 
$taxonomy = 'studio';
// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';

if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {

$term_ids = implode( ',' , $post_terms );
$terms = wp_list_categories( 'title_li=&style=none&echo=0&taxonomy=' . $taxonomy . '&include=' . $term_ids );
$terms = rtrim( trim( str_replace( '<br />',  $separator, $terms ) ), $separator );

// display post categories
echo  $terms;
}
?>

<br><span>Season Premiered:</span>
<?php 
$taxonomy = 'season';
// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';

if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {

$term_ids = implode( ',' , $post_terms );
$terms = wp_list_categories( 'title_li=&style=none&echo=0&taxonomy=' . $taxonomy . '&include=' . $term_ids );
$terms = rtrim( trim( str_replace( '<br />',  $separator, $terms ) ), $separator );

// display post categories
echo  $terms;
}
?>

<br><span>Episodes:</span>
<?php 
$taxonomy = 'episodes';
// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';

if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {

$term_ids = implode( ',' , $post_terms );
$terms = wp_list_categories( 'title_li=&style=none&echo=0&taxonomy=' . $taxonomy . '&include=' . $term_ids );
$terms = rtrim( trim( str_replace( '<br />',  $separator, $terms ) ), $separator );

// display post categories
echo  $terms;
}
 ?>


<br><span>Genres:</span>
<?php 
$taxonomy = 'genre';
// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';

if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {

$term_ids = implode( ',' , $post_terms );
$terms = wp_list_categories( 'title_li=&style=none&echo=0&taxonomy=' . $taxonomy . '&include=' . $term_ids );
$terms = rtrim( trim( str_replace( '<br />',  $separator, $terms ) ), $separator );

// display post categories
echo  $terms;
}
?>
<hr>

<?php
endwhile;
}
wp_reset_query();  // Restore global post data stomped by the_post().
?>

Autres informations :

Lorsque vous cliquez sur le titre de l'émission, le lecteur est redirigé vers une autre page qui affiche une image de l'émission, les taxonomies personnalisées répertoriées à nouveau et tous les autres articles liés à l'émission (reliés par Tag étant le nom de l'émission). . Par exemple, s'il y a un article Review ou Discussion étiqueté avec l'émission "Boys and Girls", il apparaîtra sur cette page.

En cliquant sur les termes de taxonomie, le lecteur sera dirigé vers la page qui répertorie tous les spectacles associés à ce terme. Par exemple, toutes les émissions qui ont été faites par ce studio, toutes les émissions comportant 12 épisodes, toutes les émissions classées sous le genre 'Action'.

Ce qui précède peut potentiellement remettre en question la structure générale de la manière dont je l’ai configurée. Je suis très novice en développement web et wordpress. J'ai donc fait de mon mieux en me basant sur les recherches que j'ai effectuées.

J'ai quelques autres articles sans réponse sur Stack Exchange qui vont plus loin dans les détails et des questions sur la structuration de cette partie du site. L'aide y est également appréciée, ou si vous avez besoin d'éclaircissements sur ce que j'essaie d'essayer.

Type de poste personnalisé et structure des taxonomies

Créer une table triable par termes de taxonomie

Merci beaucoup pour votre temps et l'aide que vous m'avez tous apportée jusqu'à présent.

3
Nimara

Le noyau WordPress (tel qu'exprimé par les personnes impliquées à plusieurs reprises) décourage fortement le tri par termes. Il considère les termes exclusivement comme un mécanisme grouping , sans aucune possibilité de classement.

Donc, dans votre cas particulier, WP comprendrait qu'il y a différents réalisateurs, qu'il y a des groupes d'émissions faites par ces réalisateurs, mais ne comprendra pas du tout qu'il y a quelques attentes concernant la façon dont l'ordre peut être organisé impacté par les administrateurs assignés.

Bien sûr, dans le développement pratique, les personnes do doivent trier les termes dans des circonstances différentes. En pratique, cela signifie un code SQL très personnalisé pour y arriver.

L’un des exemples les plus utiles d’application que je connaisse est couvert par Colonnes de taxonomie triables blog.

Donc, pour que cela se produise, vous devez écrire/adapter le code SQL nécessaire, puis l’intégrer à vos requêtes.

4
Rarst

Alors que la réponse de Rarst est correcte, utile et vous permet réellement de mieux comprendre le sujet, la réponse la plus courte et pratique pour commander un WP_Query à l'aide d'un custom_post_meta est la suivante:

$args = array(
    'meta_key' => 'name',  //custom field name here
    'orderby' => 'meta_value', 
    'order' => 'ASC') // the sort order
    // the rest of your arguments here...
);

Si vous avez besoin d'un ordre de tri personnalisé autre que ASC ou DESC, vous devez créer un custom Query .


UPDATE: Ma réponse n'a rien à voir avec la question. Je l'ai simplement mal lu. Pardon.

Je ne le supprimerai cependant pas, car les commentaires contiennent des informations utiles pour ceux qui n'ont pas encore décidé d'utiliser custom_post_meta ou taxonomy pour un certain attribut. Le tri par taxonomie est possible, comme l'a souligné Rarst, à l'aide de la requête de Scribu (3ème version améliorée). Mais évitez-le, car la rapidité de vos requêtes en souffrira.

Utilisez terms pour grouper et meta pour trier. Votre site sera beaucoup plus rapide, même avec beaucoup d'entrées.

2
Andrei Gheorghiu