christoph
  • 0
Новичок

Сортировка сообщений в алфавитном порядке по значению пользовательского поля, вставка разделителя между разными буквами

  • 0

я перечисляю все сообщения моего пользовательского типа сообщений «человек», отсортированные в алфавитном порядке по пользовательскому полю last_name на странице.

Как вставить разделитель (например, изображение буквы) перед началом диапазона букв?

Вот что я пытаюсь сделать:

алфавитный список с разделителями

Обновление:

вот код, который я использую:

<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>
Share
  1. Добавление изображения — это хорошо, но неясно, что именно вы хотите сделать или на какой странице вашего сайта вы хотите это сделать. Вы кодируете что-то внутри The Loop, все сообщения будут на одной странице и т.д. и т.п.? Можете ли вы опубликовать код, который вы сейчас пытаетесь использовать, в качестве обновления вашего вопроса? Дополнительная информация поможет.

    • 0
    • Я пытаюсь составить алфавитный список людей. Для этого я создал пользовательский тип сообщения «человек». Каждый человек — это отдельный пост. На странице я создаю список всех людей (миниатюра их сообщения). Мой вопрос в том, как я могу вставить разделители (в моем случае: зеленые изображения, содержащие букву) между миниатюрами сообщений. Может с отдельным запросом на каждую букву? Может с джаваскриптом?

      • 0
    • Привет, трусктр, спасибо! Я также думал о том, чтобы сделать 26 циклов, но я надеялся, что есть более изящное решение. Плюс: я добавляю фильтр, который заменяет фактический набор людей другим набором через вызов ajax. Я беспокоюсь о производительности.

      • 0
    • Блин, если вы используете AJAX, вы должны просто создать страницу (без верхнего или нижнего колонтитула), которая выводит всех сотрудников в алфавитном порядке. Затем (если вы используете jQuery) возьмите весь контент с этой страницы, затем выполните цикл, который проходит через заголовок каждого сообщения, и как только он встречает первый экземпляр каждой буквы, он может вставить html письма перед этим сообщением, затем введите его на свой сайт. Если делать так, то немного сложнее, но менее требовательно к серверу. Я также обновил код выше.

      • 0
    • Эй, можете ли вы дать ссылку на ваш сайт, чтобы увидеть его в действии? 😀

      • 0
  2. Попробуй это:

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

    • 0
  3. Что ж, поскольку функции сортировки WordPress не включают в себя такую ​​функциональность, вам, вероятно, следует спросить Мэтта Малленвега… ха-ха…

    Нет, но на самом деле вы, вероятно, можете использовать query_posts() для каждой буквы (другими словами, вызывать цикл до 26 раз, по одному разу для каждой буквы. Затем для каждого цикла make включает некоторый код, который будет проверять, первая буква мета_значения поста совпадает с соответствующей буквой, если постов совпадающих с этой буквой нет, то make просто пропускаем эту букву.

    В настоящее время у вас есть только один цикл. Возможно, вам придется написать цикл 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 на странице. Я не уверен, насколько это напрягает сервер, но это должно работать. Это первое, о чем я подумал. Дай мне знать, как это происходит!

    • 0

Оставить ответ

You must login to add an answer.