Заказ по пустому пользовательскому полю

Вопрос или проблема

Я сортирую свои посты по пользовательскому полю 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.

Оцените материал
Добавить комментарий

Капча загружается...