web-dev-qa-db-fra.com

Trier les articles alphabétiquement par valeur de champ personnalisé, insérer un séparateur entre différentes lettres

je liste tous les messages de mon type de message personnalisé "personne" triés alphabétiquement par le champ personnalisé last_name sur une page.

Comment insérer un séparateur (par exemple une image de la lettre) avant le début d'une plage de lettres?

Voici ce que j'essaie de faire:

alphabetical list with dividers

Mettre à jour:
Voici le code que j'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>
3
Christoph

Essaye ça:

<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 publication de la boucle, il récupère le champ last_name postmeta (cela n'ajoutera aucune requête à la page car WordPress met en cache le postmeta), puis en vérifie la première lettre. S'il s'agit d'une nouvelle lettre, il génère un élément de liste avec une image nommée d'après la lettre (par exemple f.jpg).

5
Simon Blackbourn

Eh bien, les fonctions de tri de Wordpress n'incluant pas ce type de fonctionnalité, vous devriez probablement demander à Matt Mullenweg ... haha ​​...

Non, mais en réalité, vous pouvez probablement utiliser query_posts () pour chaque lettre (autrement dit, appelez la boucle jusqu'à 26 fois, une fois pour chaque lettre. Ensuite, pour chaque boucle, assurez-vous d'inclure du code permettant de vérifier si le La première lettre de la note meta_value correspond à la lettre correspondante.Si aucune publication ne correspond à cette lettre, faites simplement sauter cette lettre.

Vous n'avez actuellement qu'une seule boucle. Vous devrez peut-être écrire une boucle for () qui générera chaque boucle wordpress.

Quelque chose comme ça (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 wordpress dans la page. Je ne sais pas à quel point cela met à rude épreuve le serveur, mais cela devrait fonctionner. C'est la première chose à laquelle j'ai pensé. Laisse moi savoir comment ça se passe!

0
trusktr