messages Trier par ordre alphabétique par valeur de champ personnalisé, insérer diviseur entre les différentes lettres

wordpress.stackexchange https://wordpress.stackexchange.com/questions/10561

  •  16-10-2019
  •  | 
  •  

Question

Je liste tous les messages de mon type de poste personnalisé « personne » triée par ordre alphabétique par le champ personnalisé last_name sur une page.

Comment puis-je insérer un diviseur (par exemple une image de la lettre) avant le démarrage de la gamme lettre?

Voici ce que je suis en train de faire:

liste alphabétique avec des séparations

Mise à jour: Voici le code que je utilise:

<ul class="list-ensemble">
<?php query_posts('post_type=person&post_status=publish&meta_key=last_name&orderby=meta_value&order=ASC'); 
if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
    <li data-id="<?php the_ID(); ?>">
        <a href="<?php the_permalink(); ?>" class="ensemble-single-link">
            <?php if ( has_post_thumbnail() ) { the_post_thumbnail(thumbnail); } ?>
        </a>
    </li>
<?php endwhile; // end of the loop. ?>
</ul>
Était-ce utile?

La solution

Essayez ceci:

<ul class="list-ensemble">
<?php query_posts('post_type=person&post_status=publish&meta_key=last_name&orderby=meta_value&order=ASC'); 
$current_letter = '';
if ( have_posts() ) while ( have_posts() ) : the_post();
    $last_name = get_post_meta( $post->ID, 'last_name', true );
    $letter = strtolower( substr( $last_name, 0, 1 ) );
    if ( $letter != $current_letter ) {
        $current_letter = $letter; ?>
        <li class="letter">
            <img src="<?php echo $letter; ?>.jpg" alt="<?php echo $letter; ?>" title="<?php echo $letter; ?>">
        </li>
    <?php } ?>
    <li data-id="<?php the_ID(); ?>">
        <a href="<?php the_permalink(); ?>" class="ensemble-single-link">
            <?php if ( has_post_thumbnail() ) { the_post_thumbnail( 'thumbnail' ); } ?>
        </a>
    </li>
<?php endwhile; // end of the loop. ?>
</ul>

Pour chaque poste dans la boucle, il récupère le champ postmeta de last_name (ce ne sera pas ajouter des requêtes à la page parce que WordPress met en cache la postmeta), puis vérifie la première lettre de celui-ci. Si c'est une nouvelle lettre, il fournit un élément de la liste avec une image nommée après la lettre (par exemple f.jpg).

Autres conseils

Eh bien, puisque les fonctionnalités de tri de Wordpress ne comprennent pas ce genre de fonctionnalité, vous devriez probablement demander à Matt Mullenweg ... haha ??...

Non, mais vraiment, vous pouvez probablement utiliser une fois pour chaque lettre. Ensuite, pour chaque boucle, query_posts () pour chaque lettre (en d'autres termes appellent la boucle jusqu'à 26 fois, faire inclure un code qui va vérifier à voir si la première lettre des crises post meta_value avec la lettre correspondante. S'il n'y a pas de messages qui correspondent à cette lettre, puis faire sauter simplement cette lettre.

Vous avez actuellement une seule boucle. Vous pourriez avoir à écrire une boucle for () qui sera à son tour générer chaque boucle de wordpress.

Quelque chose comme ceci (juste un brouillon):

<ul class="list-ensemble">
    <? for ($i=65; $i<91; $i++) : // 65 through 90 represent the uppercase alphabet
        query_posts('post_type=person&post_status=publish&meta_key=last_name&orderby=meta_value&order=ASC'); 
        //PUT SOME CODE HERE TO CHECK IF THE FIRST LETTER IS EQUAL TO $i
        //Set some variable $letter_matches == true if the letter matches.
    ?>
        <h3 class="letter">
            <?php //ECHO THE LETTER CORRESPONDING TO $i HERE ?>
        </h3>
        <?
        if ( have_posts() and $letter_matches ) while ( have_posts() ) : the_post(); ?>
            <li data-id="<?php the_ID(); ?>">
                <a href="<?php the_permalink(); ?>" class="ensemble-single-link">
                    <?php if ( has_post_thumbnail() ) { the_post_thumbnail(thumbnail); } ?>
                </a>
            </li>
        <?php endwhile; // end of the loop. ?>
<?endfor; ?>
</ul>

Donc, essentiellement, vous aurez jusqu'à 26 boucles de wordpress dans la page. Je ne suis pas sûr de savoir comment forcer qui est sur le serveur, mais il devrait fonctionner. C'est la première chose que je pensais. Laissez-moi savoir comment ça se passe!

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top