it-swarm.com.de

Wie liste ich benutzerdefinierte Felder als Überschriften auf und liste alle Seiten auf, die dieses benutzerdefinierte Feld darunter teilen?

Ich versuche, ein benutzerdefiniertes Feld für "Bundesstaat" zu verwenden, um alle Stadtseiten für verfügbare Standorte aufzulisten. Mit diesem Code kann ich die richtigen Ergebnisse in der richtigen Reihenfolge (alphabetisch nach Status) erzielen:

<?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; ?>

Aber der Inhalt zeigt sich gerne

  • STAAT A Stadt A
  • STAAT A Stadt B
  • STAAT A Stadt C

Wenn ich will

  • STAAT A
  • Stadt A
  • Stadt B
  • Stadt C

Ich habe ähnliche Fragen zu StackExchange gesehen, konnte diese Antworten jedoch nicht auf meine Anforderungen übertragen, da meine Fähigkeiten in PHP sehr begrenzt sind. Dennoch, wenn diese Frage an anderer Stelle angemessen beantwortet wurde, entschuldige ich mich.

Ich kann die URLs für die Standortseiten oder die Vorlagen der Seiten nicht ändern, und es handelt sich um Seiten der ersten Ebene ohne untergeordnete Elemente.

1
hellosisyphus

Sie möchten eine Variable erstellen, die den aktuellen Status verfolgt. Überprüfen Sie dann für jeden Post in der Schleife, ob sein Status dem aktuellen Status entspricht. Wenn dies nicht der Fall ist, geben Sie es aus und aktualisieren Sie den aktuellen Status auf den neuen Status. Dies hat zur Folge, dass nur der Statusname vor dem ersten Beitrag mit diesem Status ausgegeben wird.

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;

Ich habe Ihren Code ein wenig optimiert, damit er nur PHP ist, ohne Tags zu öffnen und zu schließen, aber das liegt nur daran, dass es ein bisschen einfacher ist, die Logik der von mir vorgenommenen Änderungen zu erkennen. Sie können das Markup beliebig ausgeben.

0
Jacob Peattie