Вопрос или проблема
Я пытаюсь отсортировать пользовательские записи в алфавитном порядке и только что понял, что заглавные буквы сортируются перед строчными. Два ресторана начинаются с ‘Cal’ и ‘CAT’, и ‘CAT’ возвращается как первый в алфавитном порядке.
Вот мои $args:
$args = array(
'numberposts' => -1,
'post_type' => 'chef',
'meta_key' => 'restaurant',
'orderby' => 'meta_value',
'order' => 'ASC'
);
Я также пробовал изменить ‘orderby’ на ‘LOWER(restaurant)’, но это не дало результатов.
-
Как уже упоминалось выше, ваш параметр
orderby
должен быть установлен наmeta_value
, а не наrestaurant
. -
Используя phpMyAdmin или другой инструмент, посмотрите на вашу базу данных. При любой новой установке WordPress ваши таблицы должны иметь сортировку
utf8mb4_unicode_ci
. Это означает, что таблица сохраняет свои данные в наборе символов Unicode UTF-8 на 4 байта. Это “ci” в конце означает “не чувствительно к регистру”.
Если ваша сортировка неправильная, то вам, возможно, придется конвертировать ваши данные. Это не всегда так просто, как кажется, поэтому убедитесь, что у вас есть качественная резервная копия вашей базы данных.
Похоже, вы неправильно установили порядок сортировки… вы не должны устанавливать мета-ключ и порядок сортировки одинаковыми.
Попробуйте изменить
'orderby' => 'restaurant',
на
'orderby' => 'meta_value',
эта ссылка может помочь https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters
Ответ или решение
Когда вы работаете с сортировкой заказов в WordPress, особенно с пользовательскими записями, такая проблема, как регистронезависимое упорядочивание, может стать настоящей головной болью. В вашем случае, вы сталкиваетесь с ситуацией, когда буквы верхнего регистра сортируются перед буквами нижнего регистра, что в результате приводит к неожиданным результатам. Давайте разберемся, как можно решить эту проблему.
Проблема сортировки в WordPress
Системы управления контентом, такие как WordPress, часто сортируют текстовые значения по их кодировкам. Это приводит к тому, что текстовые записи в верхнем регистре сортируются перед записями в нижнем регистре, как вы уже заметили на примере ваших ресторанов «Cal» и «CAT».
Решение с помощью WP_Query
Ваши текущие параметры WP_Query выглядят следующим образом:
$args = array(
'numberposts' => -1,
'post_type' => 'chef',
'meta_key' => 'restaurant',
'orderby' => 'meta_value',
'order' => 'ASC'
);
Чтобы добиваться ожидаемого результат при сортировке по мета-данным, необходимо обратить внимание на несколько важных моментов:
-
Правильное использование параметров
orderby
: Вы правильно указали, что необходимо использовать'orderby' => 'meta_value'
, чтобы отсортировать данные по мета-ключуrestaurant
. Обратите внимание, что в этом случае значение ключа должно точно совпадать с мета-данными, которые хранятся в базе данных. -
Кодировка и сопоставление: Как было упомянуто, убедитесь, что ваша база данных использует корректную кодировку. Для современных установок WordPress рекомендуется использовать кодировку
utf8mb4_unicode_ci
, которая обеспечивает регистронезависимость. Проверьте это в своей базе данных. -
Каверозные функции в SQL: К сожалению, в WP_Query нет встроенной функции для работы с регистронезависимой сортировкой в мета-данных. Вы можете рассмотреть возможность создания пользовательского SQL-запроса, если вам нужны более тонкие настройки при работе с данными.
Пример запроса
Если вам нужно реализовать сортировку непосредственно через SQL, вы можете использовать следующий запрос, используя функцию LOWER()
для достижения регистронезависимости:
global $wpdb;
$results = $wpdb->get_results( "
SELECT *
FROM $wpdb->posts
JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE $wpdb->posts.post_type = 'chef'
AND $wpdb->postmeta.meta_key = 'restaurant'
ORDER BY LOWER($wpdb->postmeta.meta_value) ASC
" );
Заключение
Итак, при необходимости сортировать пользовательские записи в WordPress регистронезависимо, важно учитывать несколько ключевых аспектов: адекватная конфигурация параметров orderby
, правильная кодировка таблиц и, в некоторых случаях, помощь в написании более сложных SQL-запросов. Внимательное отношение к этим деталям поможет решить вашу проблему и добиться желаемого порядка в отображении записей.
Если у вас возникнут дополнительные вопросы или потребуется более подробная консультация, не стесняйтесь обращаться за помощью!