Вопрос или проблема
Я сортирую свои посты по пользовательскому полю faq-order. Это работает для меня:
$faqArgs = array(
'post_type' => 'faq',
'meta_key' => 'faq-order',
'order' => 'ASC',
'orderby' => 'meta_value_num',
);
$faq = new WP_Query($faqArgs);
Но пост исчезает из результатов, если это поле faq-order пустое. Как я могу это исправить? Как я могу использовать значение по умолчанию (например, 0), если это поле пустое?
Существует два решения этой проблемы:
1. Убедитесь, что все посты имеют установленное это поле.
Вы можете сделать это легко – просто используйте save_post
хук и установите его в значение по умолчанию. (Вы также должны добавить значения по умолчанию для уже существующих постов, у которых это поле не установлено.)
2. Используйте немного измененный запрос
$faqArgs = array(
'post_type' => 'faq',
'meta_key' => 'faq-order',
'order' => 'ASC',
'orderby' => 'meta_value_num',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'faq-order',
'value' => 'bug #23268',
'compare' => 'NOT EXISTS'
)
)
);
$faq = new WP_Query($faqArgs);
Ответ или решение
Для решения проблемы с сортировкой постов по пользовательскому полю faq-order
, в случае если это поле оказывается пустым, можно предложить два подхода.
1. Убедитесь, что все посты имеют установленное поле
Первый способ заключается в том, чтобы гарантировать, что все создаваемые и существующие посты содержат значение для поля faq-order
. Для этого можно использовать хук save_post
. При создании или обновлении поста вы можете установить это поле в значение по умолчанию, например, 0
, если оно не было заранее указано. Вот пример кода, который можно использовать для автоматической установки значения:
function set_default_faq_order($post_id) {
// Проверяем, является ли это пост типом 'faq'
if (get_post_type($post_id) === 'faq') {
// Получаем текущее значение поля
$faq_order = get_post_meta($post_id, 'faq-order', true);
// Если значение пустое, устанавливаем его в 0
if (empty($faq_order)) {
update_post_meta($post_id, 'faq-order', 0);
}
}
}
add_action('save_post', 'set_default_faq_order');
Для существующих постов, которым не было назначено значение, вам необходимо будет выполнить дополнительно скрипт, который пройдет по всем постам и установит значение по умолчанию для поля faq-order
, если оно отсутствует.
2. Использование модифицированного запроса
Другой подход — это изменение запроса WP_Query, чтобы учесть посты, у которых поле faq-order
отсутствует или является пустым. Вы можете использовать meta_query
для решения этой задачи. Приведенный ниже код позволяет получить посты таким образом, чтобы они сортировались как по заданному значению faq-order
, так и по умолчанию, если значение отсутствует:
$faqArgs = array(
'post_type' => 'faq',
'order' => 'ASC',
'orderby' => 'meta_value_num',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'faq-order',
'compare' => 'NOT EXISTS'
),
array(
'key' => 'faq-order',
'value' => '',
'compare' => '='
),
),
);
$faq = new WP_Query($faqArgs);
Данный запрос позволяет получить посты, у которых поле faq-order
отсутствует или является пустым, при этом результат будет сортироваться по полю faq-order
, если таковое существует. Это позволяет учитывать все посты и избегать их исчезновения из результата.
Заключение
Оба предложенных метода эффективны и могут быть использованы в зависимости от ваших требований и предпочтений. Первый метод обеспечивает более структурированный подход с явной установкой значений, тогда как второй метод позволяет сохранить гибкость и динамичность вашего запроса. Важно лишь выбирать тот подход, который более всего соответствует вашей стратегии управления контентом в WordPress.