Вопрос или проблема
Получить записи с несколькими значениями мета.
У меня есть поле выбора 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 'Нет постов, соответствующих критериям.';
}
Эти изменения должны помочь вам получить необходимые посты с множественными значениями мета-ключей. Если у вас остаются вопросы, не стесняйтесь задавать их!