web-dev-qa-db-fra.com

Sélectionner tout dans la catégorie parent, groupe par catégorie enfant?

J'essaye de formater un type d'article personnalisé pour une "série". Chaque publication est un épisode, chaque épisode appartient à une saison et chaque saison appartient à une série (tout comme une émission de télévision).

J'ai les éléments suivants:

  • Type de message personnalisé: "Épisodes"
  • Taxonomie personnalisée: "Série"
    • Inside Series, catégorie parente de "Real Deal"
      • Dans la catégorie "Real Deal", plusieurs sous-catégories (IE "Saison 1", "Saison 2" ..)

Je dois pouvoir sélectionner mes "épisodes" à la fois par série (IE, "Real Deal" dans ce qui précède) et par saison (IE, "Saison 1" de Real Deal).

Une image parle mille mots alors voici une rapide maquette de ce que je veux dire:

enter image description here

Ce que j'ai essayé

Voici le code que j'ai actuellement, mais je ne pense pas être sur la bonne voie pour faire ce que j'ai illustré ci-dessus. Cela me permettra d'obtenir tous les épisodes de la saison 1. Toutefois, je dois obtenir tous les épisodes de chaque saison, puis regrouper chaque saison dans son propre conteneur HTML.

<?php
  $args = [
      'post-type'   => 'episode',
      'post-status' => 'publish',
      'tax_query'   => [
          [
              'taxonomy' => 'series',
              'field'    => 'slug',
              'terms'    => 'season-1'
          ]
      ]
  ];
  $episodes = new WP_Query($args);
  if ( $episodes->have_posts() ) {
    while( $episodes->have_posts() ) {
        $episodes->the_post();
        get_template_part('content','episodes');
    }
  } else {
    get_template_part('content', 'none');
  }
?>

QUESTION

Comment structurer ma requête en A) Sélectionner tous les épisodes, regroupés par série, puis affichés par saison?

MODIFIER:

J'ai fini par utiliser l'extrait de code 3 fourni par Michael Ecklund, qui a réussi à accomplir exactement ce que je cherchais: saisir les 4 publications les plus récentes de chaque saison et les stocker dans un tableau. Merci de votre aide!

5
Prefix

Voici une solution simple et directe. Vous devez cependant disposer de la version la plus récente de WordPress. (ou au moins 4.1)

Utilisation de la requête taxonomique imbriquée.

En prenant ce que vous avez et en ajoutant un peu.

$args = array(
    'post-type'      => 'episode',
    'post-status'    => 'publish',
    'posts_per_page' => 4,
    'tax_query'      => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'series',
            'field'    => 'slug',
            'terms'    => array( 'real-deal' ),// Name of the series (in slug format)
        ),
        array(
            'taxonomy' => 'series',
            'field'    => 'slug',
            'terms'    => array( 'season-1' ),// Name of the season (in slug format)
        )
    )
);

$episodes = new WP_Query( $args );

print_r( $episodes->posts );

Cela signifie simplement que vous devez rechercher les 4 derniers épisodes publiés qui appartiennent à une série spécifique et contiennent également une saison spécifique. (c'est ce que vos maquettes visuelles semblent représenter)

Vous avez mentionné avoir besoin de "saisons" pour être dynamique.

Voici comment vous pouvez obtenir toutes les "sous-catégories" (saisons) de la catégorie parente (série), puis récupérer les 4 derniers épisodes de cette série et pour toutes les saisons possibles.

$taxonomy = 'series';

$seasons = get_terms( $taxonomy, array(
    'parent' => 1, // TERM ID OF THE SERIES
    'fields' => 'id=>slug'
) );

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

    $args = array(
        'post-type'      => 'episode',
        'post-status'    => 'publish',
        'posts_per_page' => 4,
        'tax_query'      => array(
            'relation' => 'AND',
            array(
                'taxonomy' => $taxonomy,
                'field'    => 'slug',
                'terms'    => array( 'industry-news' ),// Name of the "series" (in slug format)
            ),
            array(
                'taxonomy' => $taxonomy,
                'field'    => 'slug',
                'terms'    => array_values( $seasons ),// Name of the "seasons" (in slug format) DYNAMIC
            )
        )
    );

    $episodes = new WP_Query( $args );

    print_r( $episodes->posts );

}

Supposons que vous avez 3 saisons dans une série ... Et vous souhaitez afficher les 4 derniers épisodes de chaque saison de cette série.

$taxonomy = 'series';

$seasons = get_terms( $taxonomy, array(
    'parent' => 1, // TERM ID OF THE SERIES
    'fields' => 'id=>slug'
) );

$season_episodes = array();

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

    foreach ( array_values( $seasons ) as $season ) {

        $season_episodes[ $season ] = array();// Placeholder in-case there's no episodes found.

        $args = array(
            'post-type'      => 'episode',
            'post-status'    => 'publish',
            'posts_per_page' => 4,
            'tax_query'      => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => array( 'industry-news' ),// Name of the "series" (in slug format)
                ),
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => array( $season ),// Name of the "seasons" (in slug format) DYNAMIC
                )
            )
        );

        $episodes = new WP_Query( $args );

        if ( ! empty( $episodes->posts ) ) {
            $season_episodes[ $season ] = $episodes->posts;// Add all episodes found in this season.
        }

    }

}

if ( ! empty( $season_episodes ) ) {
    print_r( $season_episodes );
}

Cette dernière méthode prend les 4 derniers épisodes d'une série et classe ces 4 articles dans des tableaux séparés classés par saisons.

Donc, tout compte fait, vous aurez un tableau pour chaque saison de la série contenant 4 épisodes récents. Tout ce que vous avez à faire est de sortir les informations.

4
Michael Ecklund