Intereting Posts
Уменьшение использования ЦП и БД в wordpress Всплывающая страница разбойника продолжает появляться Скрытие стилей из Facebook Настройка пользовательских файлов cookie в WordPress Внутри текстового редактора мои изображения галереи предварительного просмотра находятся в полном размере wp_create_user hook Можно ли изменить тип персонализированного сообщения с "hierarchical: false" на "hierarchical: true"? wp_list _table У вас недостаточно прав для доступа к этой странице. Невозможно использовать пользовательскую таксономию с формой переднего конца Как вставить содержимое из другого настраиваемого типа сообщений в сообщение? Хотите, чтобы редактор сообщений помнил последнюю позицию редактирования Я разбил разбивку на страницы, те же сообщения на всех страницах (index.php) Аутентификация пользовательского поля при входе в систему Уведомление о том, что администратор подключен к сети Перемещенный мой сайт WordPress, и теперь он не может прочитать тему

Список алфавитов категории

В версии 3.6.1 и ниже это сработало. После обновления WordPress до версии 3.9.1 мой список категорий разбит

В версии 3.6.1 мой список категорий выглядел следующим образом:

A|B|C (A) (B) (C) Apple Bat Cat 

После обновления до версии 3.9.1 он выглядит следующим образом:

 A|B|C (A) (B) (C) Apple Apple Apple Bat Bat Bat Cat Cat Cat 

Это код, который работал в 3.6.1. Может ли кто-нибудь предложить решение для этой работы в версии 3.9.1?

 <?php $a = array('name__like' => "a", 'order' => 'ASC', 'title_li' => '0', 'use_desc_for_title' => '0'); $b = array('name__like' => "b", 'order' => 'ASC', 'title_li' => '0', 'use_desc_for_title' => '0'); ?> <div class="menu-alpha"> <ul> <li><a href="#A">A</a></li> <li><a href="#B">B</a></li> </ul> </div> <div id="left-side"> <div class="alpha"><a name="A">A</a></div> <ul> <?php wp_list_categories($a); ?> </ul> <div class="alpha"><a name="B">B</a></div> <ul> <?php wp_list_categories($b); ?> </ul> 

Вы используете wp_list_categories() с параметром name__like но этот параметр недействителен для этой функции (я не думаю, что ваш код работает так, как вы описываете в WP 3.6+). Вы можете использовать get_terms . Например:

  <?php function cyb_get_categories_list_name_like($letter) { $categories = get_terms( 'category', array('name__like' => $letter) ) ; $list = ''; if( !empty( $categories ) && !is_wp_error( $categories ) ) { $list = '<ul>'; foreach( $categories as $cat ) { $list .= '<li><a href="'.get_term_link($cat).'">'.$cat->name.'</a></li>'; } $list = '</ul>'; } return $list; } <div class="menu-alpha"> <ul> <li><a href="#A">A</a></li> <li><a href="#B">B</a></li> </ul> </div> <div id="left-side"> <div class="alpha"><a name="A">A</a></div> <?php cyb_get_categories_list_name_like('a'); ?> <div class="alpha"><a name="B">B</a></div> <?php cyb_get_categories_list_name_like('b'); ?> </div> ?> 

Как указал Питер Гоузен, нужен фильтр, чтобы параметр name__like соответствовал только первой букве слова:

  //Credit here @s_ha_dum function old_style_name_like_wpse_123298($clauses) { remove_filter('term_clauses','old_style_name_like_wpse_123298'); $pattern = '|(name LIKE )\'%(.+%)\'|'; $clauses['where'] = preg_replace($pattern,'$1 \'$2\'',$clauses['where']); return $clauses; } add_filter('terms_clauses','old_style_name_like_wpse_123298'); 

ANSWER REVISITED

Я только что сделал тот же ответ на SO и сделал еще один маршрут, который быстрее, чем мой первоначальный ответ. Я подумал, что было бы неплохо пересмотреть этот ответ и опубликовать мой новый подход в интересах этого сайта.

В WordPress 3.7 был изменен параметр get_terms . Он больше не возвращает имена терминов с указанным первым письмом, но получает имя термина, если оно имеет указанную букву, где-то в названии

Кроме того, если вы попытаетесь запустить код 26 раз, у вас будут проблемы со временем загрузки страницы

Вот мой подход и результаты теста

Результаты теста: 1 запрос в 0.01074 секунд.

Тестовый результат: ( Обратите внимание, что мой тестовый сайт находится на африкаанс, все имена – это имена терминов )

введите описание изображения здесь

Вот код, который делает это

 $terms = get_terms('pa_manufacturer'); if ( !empty( $terms ) && !is_wp_error( $terms ) ){ $term_list = []; foreach ( $terms as $term ){ $first_letter = strtoupper($term->name[0]); $term_list[$first_letter][] = $term; } unset($term); echo '<ul class="my_term-archive">'; foreach ( $term_list as $key=>$value ) { echo '<h2 class="term-letter">' . $key . '</h2>'; foreach ( $value as $term ) { echo '<li><a href="' . get_term_link( $term ) . '" title="' . sprintf(__('View all post filed under %s', 'my_localization_domain'), $term->name) . '">' . $term->name . '</a></li>'; } } echo '</ul>'; } с $terms = get_terms('pa_manufacturer'); if ( !empty( $terms ) && !is_wp_error( $terms ) ){ $term_list = []; foreach ( $terms as $term ){ $first_letter = strtoupper($term->name[0]); $term_list[$first_letter][] = $term; } unset($term); echo '<ul class="my_term-archive">'; foreach ( $term_list as $key=>$value ) { echo '<h2 class="term-letter">' . $key . '</h2>'; foreach ( $value as $term ) { echo '<li><a href="' . get_term_link( $term ) . '" title="' . sprintf(__('View all post filed under %s', 'my_localization_domain'), $term->name) . '">' . $term->name . '</a></li>'; } } echo '</ul>'; } 

КАК РАБОТАЕТ КОД

Лучший подход здесь состоит в том, чтобы получить все условия, чтобы избежать ненужных удалений db. Теперь вы можете передать результат get_terms через цикл foreach .

Здесь вы собираетесь использовать свои условия. Первое, что нужно сделать, это создать новый массив, $term_list , получить первую букву имени каждого имени и затем присвоить это письмо как ключ в новом массиве. Значения для каждого ключа будут содержать массив термина info

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