Ordenar publicaciones alfabéticamente por valor de campo personalizado, inserte divisor entre diferentes letras

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

  •  16-10-2019
  •  | 
  •  

Pregunta

Estoy enumerando todas las publicaciones de mi tipo de publicación personalizada "Persona" ordenadas alfabéticamente por el campo personalizado last_name en una página.

¿Cómo insertaría un divisor (por ejemplo, una imagen de la letra) antes de que comience un rango de letras?

Esto es lo que estoy tratando de hacer:

alphabetical list with dividers

Actualizar:
Aquí está el código que estoy usando:

<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>
¿Fue útil?

Solución

Prueba esto:

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

Para cada publicación en el bucle, recupera el last_name PostMeta Field (esto no agregará ninguna consulta a la página porque WordPress almacena en caché el postmeta), luego verifica la primera letra de ella. Si es una nueva letra, genera un elemento de lista con una imagen que lleva el nombre de la letra (por ejemplo, f.jpg).

Otros consejos

Bueno, dado que las características de clasificación de WordPress no incluyen ese tipo de funcionalidad, probablemente debería preguntarle a Matt Mullenweg ... jaja ...

No, pero en realidad, probablemente pueda usar Query_Posts () para cada letra (en otras palabras, llame al bucle hasta 26 veces, una vez para cada letra. Luego, para cada bucle, haga que incluya algún código que verifique si verá si el La primera letra de la publicación meta_value se ajusta a la carta correspondiente. Si no hay publicaciones que coincidan con esa letra, simplemente haga omitir esa letra.

Actualmente solo tienes un bucle. Es posible que deba escribir un bucle for () que a su vez generará cada bucle de WordPress.

Algo como esto (solo un borrador):

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

Así que esencialmente tendrás hasta 26 bucles de WordPress en la página. No estoy seguro de cuán tensado es eso en el servidor, pero debería funcionar. Es lo primero que pensé. ¡Déjame saber cómo va!

Licenciado bajo: CC-BY-SA con atribución
scroll top