Получить записи с несколькими значениями мета.

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

Получить записи с несколькими значениями мета.

У меня есть поле выбора ACF, которое принимает несколько значений. Теперь я хочу использовать get_posts() для получения этих пользовательских записей. Мои аргументы выглядят так:

$party = 'test1';
$function = 'test1, test2';
$args = array(
    'numberposts'   => -1,
    'post_type'     => 'event',
    'meta_query'    => array(
        'relation'      => 'AND',
        array(
            'key'       => 'party',
            'compare'   => '=',
            'value'     => $party,
        ),
        array(
            'key'       => 'function',
            'compare'   => 'IN',
            'value'     => array($function),
        )
    )
);
$items = get_posts($args);

Но это не работает! Не знаю, что здесь не так!

Это не тот способ, которым вы обращались к ACF.

Параметры

<?php $field = get_field($field_name, $post_id, $format_value); ?>
  • $field_name: имя поля, которое нужно извлечь. например «page_content» (обязательно)
  • $post_id: конкретный ID записи, где было введено ваше значение. По умолчанию — ID текущей записи (не обязательно). Это может быть и опции / таксономии / пользователи / и т.д.
  • $format_value: форматировать ли значение, загруженное из БД. По умолчанию — true (не обязательно).

Использование

Получить значение из текущей записи

$value = get_field( "text_field" );

Получить значение из конкретной записи

$value = get_field( "text_field", 123 );

Проверить, существует ли значение

$value = get_field( "text_field" );

if( $value ) {

    echo $value;

} else {

    echo 'пусто';

}

Получить значение из других мест

$post_id = null; // текущая запись
$post_id = 1;
$post_id = "option";
$post_id = "options"; // то же самое, что и выше
$post_id = "category_2"; // нацелиться на конкретную категорию
$post_id = "event_3"; // нацелиться на конкретную таксономию (эта таксономия называется «событие»)
$post_id = "user_1"; // нацелиться на конкретного пользователя (ID пользователя = 1)

$value = get_field( "text_field", $post_id );

Получить значение без форматирования

В этом примере поле image является полем изображения, которое обычно возвращает объект изображения. Однако, передавая false в качестве третьего параметра функции get_field, значение никогда не форматируется и возвращается таким, каким оно есть из базы данных.

Обратите внимание, что второй параметр установлен в false, чтобы нацелиться на текущую запись.

$image = get_field('image', false, false);

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

Чтобы получить посты с несколькими мета-значениями, в том числе с использованием ACF (Advanced Custom Fields), нужно правильно сформировать аргументы meta_query в функции get_posts(). Давайте разберемся с вашим примером кода и немного его доработаем.

Ваш оригинальный код выглядит так:

$party = 'test1';
$function = 'test1, test2';
$args = array(
    'numberposts'   => -1,
    'post_type'     => 'event',
    'meta_query'    => array(
        'relation'      => 'AND',
        array(
            'key'       => 'party',
            'compare'   => '=',
            'value'     => $party,
        ),
        array(
            'key'       => 'function',
            'compare'   => 'IN',
            'value'     => array($function), // Ошибка здесь
        )
    )
);
$items = get_posts($args);

В этом коде возникает проблема, когда вы пытаетесь поместить строки в массив, который используется для meta_query. Параметр $function разделён запятыми, и поэтому в array($function) создается массив, содержащий одну строку вместо массива значений. Для корректного выполнения запроса вам нужно преобразовать значение $function в массив значений.

Вот как можно это исправить:

$party = 'test1';
$function = array('test1', 'test2'); // Преобразуем строку в массив
$args = array(
    'numberposts'   => -1,
    'post_type'     => 'event',
    'meta_query'    => array(
        'relation'      => 'AND',
        array(
            'key'       => 'party',
            'compare'   => '=',
            'value'     => $party,
        ),
        array(
            'key'       => 'function',
            'compare'   => 'IN',
            'value'     => $function, // Используем массив значений
        )
    )
);
$items = get_posts($args);

Также убедитесь, что вы используете get_posts в правильном контексте. В случае, если значения поля ACF хранятся в виде сериализованных массивов, вам потребуется использовать другие параметры для корректного получения данных.

Если поле ACF настроено как "Select" с множественным выбором, оно будет хранить значения как массив и приведенный выше код должен сработать.

Также, если вы хотите проверить, что посты действительно были возвращены, вы можете добавить следующий код после вызова get_posts():

if (!empty($items)) {
    foreach ($items as $item) {
        echo '<h2>' . esc_html($item->post_title) . '</h2>'; // Выводим заголовок
    }
} else {
    echo 'Нет постов, соответствующих критериям.';
}

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

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

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