カスタムフィールド値でアルファベット順に投稿を並べ替え、異なる文字の間に仕切りを挿入します

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

  •  16-10-2019
  •  | 
  •  

質問

カスタムポストタイプの「パーソン」のすべての投稿をリストしています。カスタムフィールドでアルファベット順にソート last_name ページ上。

文字範囲が開始される前に、仕切り(レターの画像など)を挿入するにはどうすればよいですか?

これが私がやろうとしていることです:

alphabetical list with dividers

アップデート:
これが私が使用しているコードです:

<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>
役に立ちましたか?

解決

これを試して:

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

ループ内の各投稿について、それは last_name Postmetaフィールド(WordPressがPostmetaをキャッシュするため、これはページにクエリを追加しません)、最初の文字をチェックします。それが新しい文字の場合、それは文字にちなんで名付けられた画像のあるリスト要素を出力します(例: f.jpg).

他のヒント

WordPressのソート機能にはそのような機能が含まれていないので、おそらくMatt Mullenwegに尋ねるべきです...ハハ...

いいえ、しかし、実際には、おそらく各文字にquery_posts()を使用できます(言い換えれば、各文字に対して1回、最大26回ループを呼び出します。その後、各ループに、いくつかのコードを作成して、チェックするコードを確認します。 Post Meta_Valueの最初の文字は、対応する文字に適合します。その文字に一致する投稿がない場合は、その文字をスキップするだけです。

現在、ループは1つしかありません。 for()ループを作成する必要がある場合があります。これにより、各WordPressループが生成されます。

このようなもの(大まかなドラフト):

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

したがって、本質的には、ページに最大26のWordPressループがあります。それがサーバー上でどれほど緊張しているかはわかりませんが、機能するはずです。それは私が最初に考えたことです。レムはそれがどうなるか知っています!

ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top