Отображение всех записей, начинающихся с заданной буквы?

5 окт. 2012 г., 18:54:50
Просмотры: 14.6K
Голосов: 12

Я пытаюсь создать словарь на основе WordPress, по сути он будет содержать 26 страниц (по одной на каждую букву):

А Б В ... Э Ю Я

И каждая страница должна отображать все записи, начинающиеся с заданной буквы. Например, при открытии страницы "А" должно отображаться что-то вроде:

абажур

абордаж

абрикос

(...) яшма

Сначала я думал о пользовательских типах записей, но создание и поддержка 26 типов кажется избыточным.

Какой будет наиболее эффективный способ сортировки записей таким образом? Запрос к базе данных, разделение цикла с помощью PHP? Я планирую работать с тысячами записей (да, это должно быть именно WordPress :)).

0
Все ответы на вопрос 3
8
10

Не используйте типы записей, используйте таксономии и термины!

При сохранении устанавливайте термины объекта в таксономии A-Z, используя первую букву заголовка записи. Обязательно приводите буквы к верхнему или нижнему регистру для единообразия. Убедитесь, что созданы термины для каждой буквы алфавита, а также отдельный термин для цифр и других неалфавитных символов.

Это будет быстрее, чем запрашивать первую букву каждого заголовка записи, и даст вам таксономию, с которой можно делать больше вещей, например облака тегов или виджеты списка терминов! Это также гораздо более быстрый способ определения того, какие буквы имеют связанные записи и сколько их, без принудительного подсчета в базе данных, и вы можете использовать стандартные WordPress API терминов "из коробки" для выполнения более сложных запросов, например записей, начинающихся с гласных

5 окт. 2012 г. 19:02:00
Комментарии

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

Michael Ecklund Michael Ecklund
5 окт. 2012 г. 21:20:48

Да, это ОГРОМНЫЙ недостаток — эти посты будут добавлять СОВЕРШЕННО несведущие люди, и я не могу рассчитывать на них в плане правильного указания таксономии при создании нового поста. Не уверен, будет ли эффективным запрашивать все посты и обновлять их каждый раз, когда кто-то редактирует/создает что-то?

Wordpressor Wordpressor
5 окт. 2012 г. 21:46:58

Нет, это вообще не проблема — скройте интерфейс и автоматизируйте процесс. Делайте это на хуках сохранения и обновления поста, делать это вручную было бы абсурдно затратно.

Tom J Nowell Tom J Nowell
5 окт. 2012 г. 22:05:11

Tom J Nowell, всё работает отлично, но у меня есть одна серьёзная проблема, и я не уверен, как с ней справиться - некоторые слова начинаются с букв типа http://en.wikipedia.org/wiki/Ą - я не могу задать термины для таких слов. Вот код и объяснение: http://pastebin.com/cHxbjVFH , почему так происходит? Я использую WP пакет, предназначенный для этого языка.

Wordpressor Wordpressor
10 окт. 2012 г. 23:18:02

ты говоришь про акценты, умлауты и тому подобное? Если да, то это тема для отдельного вопроса, и вопрос совсем не тривиальный. Скорее всего, это также общий вопрос по PHP, так что Stack Overflow будет лучшим местом, чтобы задать его

Tom J Nowell Tom J Nowell
11 окт. 2012 г. 01:25:39

Спасибо, друг, я разобрался, оказывается, когда вы используете substr(), эти символы ведут себя как 2, а не 1 символ :) Спасибо!

Wordpressor Wordpressor
11 окт. 2012 г. 09:30:54

А, это многобайтовые кодировки! Для работы с ними в PHP существуют соответствующие функции с префиксом mb

Tom J Nowell Tom J Nowell
11 окт. 2012 г. 12:02:14

Отличное решение для поиска по начальной букве. Вместо того чтобы переусложнять с включением всех возможных символов, я считаю более элегантным использовать A-Z и # для всего остального.

brett brett
27 февр. 2020 г. 01:43:19
Показать остальные 3 комментариев
2

Если вы не хотите использовать предпочтительный метод таксономических терминов, сделайте следующее:

<ul class="posts">
         <?php 
         global $wpdb; 
         $request = "a" // можно указать любую нужную букву
         $results = $wpdb->get_results(
                "
                SELECT * FROM $wpdb->posts
                WHERE post_title LIKE '$request%'
                AND post_type = 'post'
                AND post_status = 'publish'; 
                "
         ); 
         if ( $results ) 
         {
            foreach ( $results as $post ) 
            {
                setup_postdata ( $post ); 
                ?> 
                <li>
                    ... здесь цикл (the_title, the_permalink) ... 
                </li>
                <?php 
            }
         } 
         else 
         {
            ?> 
            <div class="alert">Не найдено клубов на эту букву. Пожалуйста, попробуйте другую или воспользуйтесь поиском вверху.</div>
            <?php
         }
         ?>
    </ul>
9 окт. 2012 г. 21:26:59
Комментарии

можешь объяснить, как это работает? разве это не будет возвращать любую запись, содержащую эту букву?

Tintinabulator Zea Tintinabulator Zea
18 дек. 2018 г. 07:56:29

не будет. mysql использует % как подстановочный знак. однако я никогда не встречал $ в mysql запросах. правильно должно быть WHERE post_title LIKE 'request%'

brett brett
27 февр. 2020 г. 01:45:12
0

Ознакомьтесь с этой статьей: query_post по заголовку?

Или вы можете создать вспомогательную функцию предварительного сохранения, используя фреймворк PODS 2, и сохранить первую букву заголовка записи в отдельном поле, а затем использовать простое условие WHERE.

Либо создать выпадающий список (другой pod/тип контента) со всеми буквами и установить связь с вашим существующим типом записей (в pods 2 это возможно). Таким образом, перед сохранением термина словаря вы выбираете из выпадающего списка букву, которую хотите назначить этому термину.

В Pods 2 вы можете добавить дополнительное поле к существующему типу записей. Этот плагин/фреймворк, который чем-то напоминает CCK + Views в мире Drupal, действительно потрясающий.

Pods 2 — очень полезный плагин.

5 окт. 2012 г. 19:06:54