В настоящее время я пытаюсь вывести список названий музыки и хотел бы, чтобы сортировка игнорировала (но все еще отображала) исходную статью заголовка.
Например, если бы у меня был список полос, он будет отображаться в алфавитном порядке в WordPress следующим образом:
- Black Sabbath
- Лед Зеппелин
- Пинк Флойд
- Битлз
- Изломы
- Катящиеся камни
- Тонкая Лиззи
Вместо этого я хотел бы, чтобы он отображался в алфавитном порядке, игнорируя исходную статью «The», например:
- Битлз
- Black Sabbath
- Изломы
- Лед Зеппелин
- Пинк Флойд
- Катящиеся камни
- Тонкая Лиззи
Я нашел решение в записи блога с прошлого года , в котором предлагается следующий код functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = 'The';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( '^($matches)[[:space:]]' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( '/^(\s+)?,/', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
а затем завернуть запрос add_filter
до и remove_filter
после.
Я пробовал это, но я продолжаю получать следующую ошибку на моем сайте:
Ошибка базы данных WordPress: [Неизвестный столбец 'title2' в 'предложении заказа']
ВЫБЕРИТЕ wp_posts. * ОТ wp_posts ГДЕ 1 = 1 И wp_posts.post_type = 'release' И (wp_posts.post_status = 'publish' ИЛИ wp_posts.post_status = 'private') ЗАКАЗАТЬ ВЕРХНИЙ (title2) ASC
Я не буду врать, я довольно новичок в php-части WordPress, поэтому я не уверен, почему я получаю эту ошибку. Я вижу, что это как-то связано со столбцом title2, но, насколько я понимаю, первая функция должна позаботиться об этом. Кроме того, если есть более умный способ сделать это, я весь слух. Я гуглил и искал этот сайт, но я действительно не нашел много решений.
Мой код с использованием фильтров выглядит следующим образом:
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>
Ответы:
Эта проблема
Я думаю, что там есть опечатка:
Название фильтра
posts_fields
нетpost_fields
.Это может объяснить, почему
title2
поле неизвестно, поскольку его определение не добавляется в сгенерированную строку SQL.Альтернатива - одиночный фильтр
Мы можем переписать его, чтобы использовать только один фильтр:
где теперь вы можете активировать пользовательский заказ с
_custom
параметром orderby:Альтернатива - рекурсивная
TRIM()
Давайте реализуем рекурсивную идею Паскаля Бирчлера , прокомментированную здесь :
где мы можем, например, построить рекурсивную функцию как:
Это значит, что
сгенерирует:
Альтернатива - MariaDB
В общем, я люблю использовать MariaDB вместо MySQL . Тогда это намного проще, потому что MariaDB 10.0.5 поддерживает
REGEXP_REPLACE
:источник
functions.php
и вызывать его,orderby
когда мне это нужно. Отличное решение - спасибо :-)Более простым способом может быть просмотр и изменение слагаемого с постоянными ссылками на те посты, которые в нем нуждаются (под заголовком на экране записи поста), а затем просто использовать его для упорядочивания вместо заголовка.
то есть. использовать
post_name
неpost_title
для сортировки ...Это также означает, что ваша постоянная ссылка может отличаться, если вы используете% postname% в структуре постоянных ссылок, что может быть дополнительным бонусом.
например.
http://example.com/rolling-stones/
не даетhttp://example.com/the-rolling-stones/
РЕДАКТИРОВАТЬ : код для обновления существующих слагов, удалив нежелательные префиксы из
post_name
столбца ...источник
РЕДАКТИРОВАТЬ
Я немного улучшил код. Все блоки кода обновляются соответственно. Просто обратите внимание, что прежде чем перейти к обновлениям в ОРИГИНАЛЬНОМ ОТВЕТЕ , я настроил код для работы со следующими
Пользовательский тип сообщения ->
release
Таможенная таксономия ->
game
Убедитесь в том, чтобы установить это в соответствии с вашими потребностями
ОРИГИНАЛЬНЫЙ ОТВЕТ
В дополнение к другим ответам и опечатке, указанной @birgire, есть еще один подход.
Сначала мы установим заголовок как скрытое настраиваемое поле, но сначала удалим такие слова,
the
которые мы хотели бы исключить. Прежде чем мы это сделаем, нам нужно сначала создать вспомогательную функцию, чтобы удалить запрещенные слова из названий терминов и названий постов.Теперь, когда мы это рассмотрели, давайте посмотрим на фрагмент кода для установки нашего настраиваемого поля. Вы должны полностью удалить этот код, как только однажды загрузили любую страницу. Если у вас огромный сайт с кучей постов, вы можете настроить
posts_per_page
что-либо на100
и запускать сценарии пару раз, пока для всех постов не будет установлено настраиваемое поле для всех постов.Теперь, когда настраиваемые поля установлены для всех сообщений, а приведенный выше код удален, нам нужно убедиться, что мы установили это настраиваемое поле для всех новых сообщений или всякий раз, когда мы обновляем заголовок сообщения. Для этого мы будем использовать
transition_post_status
крючок. Следующий код может пойти в плагин ( который я рекомендую ) или в вашемfunctions.php
ЗАПРОС ВАШИХ ПОЧТ
Вы можете выполнять свои запросы как обычно без каких-либо пользовательских фильтров. Вы можете запросить и отсортировать свои сообщения следующим образом
источник
Ответы birgire хорошо работают при заказе только по этому полю. Я внес некоторые изменения, чтобы он работал при упорядочении по нескольким полям (я не уверен, что он работает правильно, когда упорядочение заголовков является основным):
источник