новый WP_query с использованием пользовательских полей

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

Я пытаюсь получить дочерние записи от двух родителей (эта часть работает хорошо),

… но теперь я хочу исключить записи, у которых meta_key равен ‘feature’ с meta_value равным ‘1’

Согласно справке Codex я пробовал несколько способов написать это, но не работает.

Вот что я написал до сих пор, я думаю, что я близок, но мне нужна помощь. Спасибо!

<?php
    $argsthis = array(
    'post_status' => 'publish',
    'post_type' => 'page',
    'order' => 'DESC',
    'posts_per_page' => '5',
    'post_parent__in' => array(10,11),
    'meta_query' => array(
      array(
            'key'     => 'feature',
            'value'   => '1',
            'compare' => '!=',
            ),
        )
    );
?>

и я пробовал, просто (с точно таким же результатом, как выше):

<?php
    $argsthis = array(
    'post_status' => 'publish',
    'post_type' => 'page',
    'order' => 'DESC',
    'posts_per_page' => '5',
    'post_parent__in' => array(10,11),
    'meta_key'     => 'feature',
    'meta_value'   => '1',
    'meta_compare' => '!=',
            ),
        )
    );
?>

Вот что работает в моем запросе:

<?php
    $argsfeature = array(
    'post_status' => 'publish',
    'post_type' => 'page',
    'order' => 'DESC',
    'posts_per_page' => '1',
    'meta_key' => 'featuring',
    'meta_value' => '1' 
    );

    ?>

и этот запрос работает:

<?php
  $argsarticles = array(
   'post_status' => 'publish',
   'post_type' => 'page',
   'order' => 'DESC',
   'posts_per_page' => '5',
   'post_parent__in' => array(10,11)
    );
 ?>

что не работает, так это “переписывание” второго запроса, указанного выше, где я могу получить дочерние страницы 10 и 11, НО НЕ страницы, которые уже были извлечены из запроса “featuring 1” – первого запроса, указанного выше.

Большое спасибо за помощь.

Ответ или решение

Чтобы решить вашу задачу с использованием WP_Query и исключением постов по пользовательскому полю feature с мета-значением 1, вам следует учесть правильное объявление параметров, как в случае с meta_query.

Давайте разберем ваш код и внесем необходимые изменения.

Основная проблема

Ваш текущий подход, использующий meta_query, выглядит правильным, но вы не включали корректные параметры в запрос, чтобы исключить посты. Вот как это должно выглядеть:

<?php
$args = array(
    'post_status'      => 'publish',
    'post_type'       => 'page',
    'order'           => 'DESC',
    'posts_per_page'  => '5',
    'post_parent__in' => array(10, 11),
    'meta_query' => array(
        array(
            'key'     => 'feature',
            'value'   => '1',
            'compare' => 'NOT EXISTS'
        ),
        array(
            'relation' => 'OR',
            array( // Условие, если 'feature' не существует
                'key'     => 'feature',
                'compare' => 'NOT EXISTS',
            ),
            array( // Условие, если 'feature' существует, но не равно '1'
                'key'     => 'feature',
                'value'   => '1',
                'compare' => '!='
            ),
        )
    ),
);

$query = new WP_Query($args);
?>

Объяснение кода

  1. Параметры запроса:

    • Мы устанавливаем post_status, post_type, order и posts_per_page, как вы это делали изначально.
    • Параметр post_parent__in следует оставить, чтобы выбирать только дочерние посты от родительских с идентификаторами 10 и 11.
  2. meta_query:

    • Здесь мы используем meta_query, чтобы задать критерии для мета-поля feature. Мы объединяем несколько условий с помощью relation.
    • Первое условие проверяет, существует ли мета-ключ feature. Если он не существует, пост будет включен в результат.
    • Второе условие проверяет, что если мета-ключ feature существует, его значение не должно быть равно 1. Это позволит исключить посты, где feature равно 1.

Проверка результатов

Не забудьте проверить результаты вашего запроса. Используйте цикл WordPress для отображения подлежащих постов:

if ($query->have_posts()) :
    while ($query->have_posts()) : $query->the_post();
        // Ваш код для отображения поста
    endwhile;
    wp_reset_postdata();
else :
    echo 'Посты не найдены.';
endif;

Заключение

Используя представленный выше код, вы должны успешно исключить посты с мета-полем feature, значение которого равно 1, при этом включая все остальные. Это обеспечит корректное выполнение вашего запроса и выдачу ожидаемых результатов. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться!

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

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