web-dev-qa-db-fra.com

Comment lister les champs personnalisés en tant qu'en-têtes et lister toutes les pages partageant ce champ personnalisé?

J'essaie d'utiliser un champ personnalisé "État" pour répertorier toutes les pages de la ville pour les emplacements disponibles. Je peux obtenir les bons résultats, dans l'ordre (alphabétique par état), avec le code suivant:

<?php
            // query
            $the_query = new WP_Query(array(
                'post_type'         => 'page',
                'posts_per_page'    => -1,
                'meta_key'          => 'state_full',
                'orderby'           => 'meta_value',
                'order'             => 'ASC'
            ));

        ?>
        <?php if( $the_query->have_posts() ): ?>
        <ul> 
            <?php
                while( $the_query->have_posts() ) : $the_query->the_post(); 

                       $state = get_field('state_full');

            ?>
            <?php echo $state ?>
            <li>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            </li>
            <?php endwhile; ?>
        </ul>
        <?php endif; ?>

Mais le contenu apparaît comme

  • ETAT A Ville A
  • ETAT A Ville B
  • ETAT A Ville C

Quand je veux

  • ETAT A
  • Ville A
  • Ville B
  • Ville C

J'ai vu des questions similaires sur StackExchange mais je n'ai pas été en mesure de traduire ces réponses en ce dont j'avais besoin, car mes compétences en tant que PHP sont très limitées. Néanmoins, si cette question a été correctement résolue ailleurs, je vous prie de m'excuser.

Je ne peux pas modifier les URL des pages d'emplacement ni les modèles de pages. Ce sont toutes des pages de premier niveau sans enfants.

1
hellosisyphus

Ce que vous voulez faire est de créer une variable qui garde la trace de l'état "actuel", puis pour chaque publication de la boucle, vérifiez si son état est identique à l'état actuel. Si ce n'est pas le cas, sortez-le et mettez à jour l'état actuel vers le nouvel état. Cela aura pour effet de ne produire que le nom de l'état devant le premier message avec cet état.

if ( $the_query->have_posts() ) :
    /**
     * Create the variable to keep track of the current State in the loop.
     */
    $current_state = null;

    echo '<ul>';
        while( $the_query->have_posts() ) : $the_query->the_post();
            $state = get_field( 'state_full' );

            /**
             * If the state of the current post is different to the current state
             * then output the new state and update the current state.
             */
            if ( $state !== $current_state ) {
                echo '<li><strong>' . $state . '</strong></li>';
                $current_state = $state;
            }

            echo '<li><a href="' . get_the_permalink() . '">' . get_the_title() .  '</a></li>';
        endwhile;
    echo '</ul>';
endif;

J'ai légèrement modifié votre code pour qu'il soit pur PHP sans balises d'ouverture et de fermeture, mais c'est simplement parce que cela simplifie un peu la logique des modifications apportées. Vous pouvez générer le balisage comme vous le souhaitez.

0
Jacob Peattie