web-dev-qa-db-fra.com

Utilisation de plusieurs taxonomies pour trier les messages personnalisés

J'ai un type de message qui inclut une taxonomie pour (1) un lieu et (2) un jour de la semaine.

J'utilise la première taxonomie pour trier les articles en groupes. Voici la boucle que j'utilise:

<?php 
$terms = get_terms('cell-locations');
$argv = array(
                'orderby'       =>  'by_term',
                'hide_empty'    => false
                );
foreach ($terms as $term) {
  $wpq = array ('taxonomy'=>'cell-locations','term'=>$term->slug);
  $myquery = new WP_Query ($wpq);
  $article_count = $myquery->post_count;
  echo '<div class="accordionButton">';
  echo "<h2 class=\"cellHeader\" id=\"".$term->slug."\">";
  echo $term->name;
  echo "</h2>";
  echo '</div>';
  echo '<div class="accordionContent">';
  if ($article_count) {
     echo "<ul class='cell_list'>";
     while ($myquery->have_posts()) : $myquery->the_post();?>
                            <li class="cell-item">
                                <ul class="cell-list">
                                    <li><?php $terms_as_text = get_the_term_list( $post->ID, 'cell-days', '', ', ', '' ) ;
                                        echo strip_tags($terms_as_text);
                                    ?> </li>
                                    <li> <? echo get_post_meta(get_the_ID(), '_cell_leader', true); ?> / <?php echo get_post_meta(get_the_ID(), '_cell_apprentice', true)?></li>
                                    <li>Get in touch with <a href="mailto:<?php echo get_post_meta(get_the_ID(), '_cell_leader_email', true);?>"><?php echo get_post_meta(get_the_ID(), '_cell_leader', true);?></a></li>
                                </ul>
                            </li>

     <?php endwhile;
     echo "</ul>";
  }
  echo '</div>';
}
?>

Cela me donne une mise en page de style accordéon de Nice basée sur le terme de taxonomie, "cellules-localisation". Cela fonctionne très bien, sauf que je souhaite maintenant trier les messages de chaque emplacement en fonction de la taxonomie utilisée, "cellules-jours". J'ai utilisé un plugin pour leur donner un ordre de tri (http://wordpress.org/extend/plugins/taxonomy-terms-order/). L'API du plugin offre les arguments de requête suivants pour appeler les publications dans l'ordre:

 $argv = array(
                'orderby'       =>  'term_order',
                'hide_empty'    => false
                );
get_terms('category', $argv);

Je ne parviens pas à créer cette deuxième boucle dans la première boucle. Des pensées ou des suggestions?

6
jsumnersmith

Une partie de vos problèmes provient probablement du fait que vous utilisez la version héritée de la fonction get_terms(). Selon la documentation de cette fonction :

Depuis la version 4.5.0, les taxonomies doivent être passées via l’argument ‘taxonomy’ dans le tableau $ args:

$terms = get_terms( array(
    'taxonomy' => 'post_tag',
    'hide_empty' => false,
) );

Par conséquent, nous pouvons réécrire votre get_terms() et $argv pour la taxonomie cells-days comme suit:

$argv = array(
    'taxonomy' => 'cells-days',
    'orderby' => 'by_term',
    'hide_empty' => false
);
$cells_days_terms = get_terms( $argv );

Ensuite, vous pouvez créer une autre boucle foreach à l'intérieur de votre premier élément <li> dans ul.cell-list (du moins, cela semble être l'endroit où vous essayez de parcourir cells-days):

<ul class="cell-list">
    <li>
        <?php $i_max = count( $cells_days_terms ); $i = 0; foreach ( $cells_days_terms as $cells_days_term ): $i++; ?>
            <span class="cells-days"><?= ( $i < $i_max ? $cells_days_term->name . ', ' : $cells_days_term->name ) ?></span>
        <?php endforeach; ?>
    </li>
    <!-- The other <li> elements here -->
</ul>



Sur une note séparée, je recommande de retravailler la première partie pour utiliser HTML là où vous faites écho. Ainsi, quand tout sera dit et fait, votre code ressemblera à ceci:

<?php 
$terms = get_terms('cell-locations');
$argv = array(
    'taxonomy' => 'cells-days',
    'orderby' => 'by_term',
    'hide_empty' => false
);
$cells_days_terms = get_terms( $argv );
foreach ($terms as $term):
  $wpq = array ('taxonomy'=>'cell-locations','term'=>$term->slug);
  $myquery = new WP_Query ($wpq);
  $article_count = $myquery->post_count; ?>
  <div class="accordionButton">
    <h2 class="cellHeader" id="<?= $term->slug ?>">
        <?= $term->name ?>
    </h2>
  </div>
  <div class="accordionContent">
    <?php if ($article_count): ?>
      <ul class="cell_list">
        <?php while ( $myquery->have_posts() ) : $myquery->the_post(); ?>
          <li class="cell-item">
            <ul class="cell-list">
              <li>
                <?php $i_max = count( $cells_days_terms ); $i = 0; foreach ( $cells_days_terms as $cells_days_term ): $i++; ?>
                  <span class="cells-days"><?php echo ( $i < $i_max ? $cells_days_term->name . ', ' : $cells_days_term->name ); ?></span>
                <?php endforeach; ?>
              </li>
              <li><?php echo get_post_meta(get_the_ID(), '_cell_leader', true); ?> / <?php echo get_post_meta(get_the_ID(), '_cell_apprentice', true)?></li>
              <li>Get in touch with <a href="mailto:<?php echo get_post_meta(get_the_ID(), '_cell_leader_email', true); ?>"><?php echo get_post_meta(get_the_ID(), '_cell_leader', true); ?></a></li>
            </ul>
          </li>
        <?php endwhile; ?>
      </ul>
    <?php endif; ?>
  </div>
<?php endforeach; ?>
1
A.J. Bale