web-dev-qa-db-fra.com

Comment grouper des publications et obtenir une vue mixte et une présentation des groupes?

Disons que je dois implémenter les éléments suivants dans WordPress:

J'ai un CPT nommé 'chanson' qui sont des chansons uniques d'artistes différents. Parfois, les chansons peuvent être regroupées par albums, mais pas toujours.

Ensuite, je veux afficher les dernières versions sur ma page d'accueil, comme:

DERNIÈRES COMMUNIQUÉS

  • Chanson 1
  • chanson 2
  • Chanson 3
  • Album 1
    • Chanson 4
    • Chanson 7
    • Chanson 9
  • Chanson 6
  • Chanson 8
  • Chanson 10

etc..

La règle consiste donc à afficher tous les articles, du plus récent au plus ancien, mais s'ils appartiennent à un groupe, affichez le groupe à la place, en utilisant la date de publication la plus récente dans le groupe pour trier le groupe avec d'autres articles.

Voyez-vous comment créer cela dans WordPress? Avec une taxonomie personnalisée CTP +? Ou 2 CPT (1 album, 1 chanson)?

J'ai déjà fait cela avec 2 CPT (1 album, 1 chanson):

  • Vous pouvez ajouter un nombre quelconque de chansons à un album (avec un fichier ACF).
  • Sur l'action save_post, j'ajoutais un champ personnalisé "parent_id" à chaque enfant contenant ... l'ID de l'article parent.
  • Ensuite, je pouvais y parvenir avec un WP_Query qui demandait les deux CPT, mais excluait les publications avec le champ Cusom "parent_id" défini.

Mais cela sonnait hacky à l’époque. Voyez-vous un meilleur moyen de gérer ce comportement? Et si je veux utiliser une taxonomie au lieu d'un CPT? Pour ce qui est de l'expérience utilisateur, les utilisateurs préféreraient ajouter des étiquettes aux chansons plutôt que de créer manuellement un album et d'y ajouter des chansons.

Cela ressemble à un modèle très courant mais je ne trouve pas la bonne façon de le faire :(

1
thomascharbit

Une taxonomie personnalisée est parfaitement logique - en espérant que je n’ai pas oublié quelque chose:

$songs = get_posts(
    array(
        'post_type' => 'song',
    )
);

$index = array(); // Build an album_id => songs index
foreach ( $songs as $song ) {
    if ( $albums = get_the_terms( $song->ID, 'album' ) )
        $index[ $albums[0]->term_id ][] = $song;
    else
        $index[ count( $index ) - 1 ][] = $song; // All on it's own. Negative index will not clash with album ID
}

echo '<ul class="songs">';
foreach ( $index as $album_id => $songs ) {
    if ( count( $songs ) > 1 ) // More than one song in this album?
        echo '<li class="album">' . get_term_field( 'name', $album_id, 'album' ) . '<ul>';

    foreach ( $songs as $song )
        echo '<li>' . get_the_title( $song ) . '</li>';

    if ( count( $songs ) > 1 )
        echo '</ul></li>';
}
echo '</ul>';

$index héritera de l'ordre de $songs selon le type de requête. Quand une chanson appartient à un album, toutes les chansons suivantes de cet album sont ajoutées à la pile et apparaîtront dans la liste imbriquée où la première chanson est indexée.

0
TheDeadMedic