Можно ли запрашивать пользовательские мета-данные через WP_Query
Хорошо, мой вопрос немного сложный, поэтому я попытаюсь дать общее объяснение, а затем перейти к деталям.
Я использую WordPress 3.4.2 с плагинами WCK Post Type Creator и WCK Custom Fields Creator для создания пользовательского типа записей и пользовательских полей.
Я пытаюсь запросить записи из пользовательского типа 'business', у которых есть пользовательское поле 'special'. Моя проблема в том, что я хотел бы быть более конкретным и получать только определенный тип специального предложения (который установлен в плагине Custom Fields Creator), но я не знаю, возможно ли это и как это сделать, используя аргумент meta_query для WP_Query.
То, что у меня есть сейчас, будет извлекать записи из типа записи, но затем мне приходится использовать get_post_meta() для поиска пользовательских полей и циклически проходить через них, выполняя проверки того, что мне нужно. Вот что у меня есть сейчас:
<?php
$args = array(
'post_type' => 'business',
'meta_query' => array(
array(
'key' => 'specials'
)
)
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$specials = get_post_meta( $post->ID, 'specials');
//Цикл по массиву специальных предложений
foreach( $specials as $special){
//Цикл по каждому специальному предложению
foreach($special as $individual){
//Проверяем, есть ли специальное предложение на напитки
if ($individual ['type-of-special'] == 'Drink' ) {
//Выполняем действия
}//individual
}//special
} //specials
endwhile; ?>
Итак, что я делаю здесь - это извлекаю записи, а затем для каждой записи получаю мета-данные 'specials' и прохожу циклически через различные массивы, чтобы проверить, какой тип специального предложения, а затем отображаю информацию, если это правильный тип специального предложения. Есть ли способ быть более конкретным в моем WP_query, чтобы возвращать только записи определенного типа специального предложения?
Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как достаточно глубоко проникнуть в многомерные массивы, которые имеет пользовательское поле 'specials', чтобы проверить значения с помощью аргумента meta_query для WP_Query.
Если я выведу $special в foreach($specials as $special), я получу это:
Array
(
[0] => Array
(
[type-of-special] => Drink
[name-of-special] => Pumpkin Latte
[price] => 2.00
[day-of-the-week] => Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
)
)
Поэтому я не знаю, как добраться до ключа [type-of-special], чтобы проверить его значение через meta_query.
Я знаю, что это много информации, и я действительно ценю любую обратную связь и помощь в решении этой проблемы. Если вам нужна дополнительная информация или разъяснения по чему-либо, пожалуйста, дайте мне знать. Еще раз спасибо!

Обычно вы просто указываете meta_value, например:
$args = array(
'post_type' => 'business',
'meta_query' => array(
array(
'key' => 'specials',
'value' => 'это не те спецпредложения, которые вы ищете - Оби Ван Кеноби'
)
)
);
Однако, поскольку ваши мета-данные записи фактически представляют собой структуру данных (сериализованный массив/объект PHP), это невозможно.
Вы можете прочитать об этом подробнее здесь:
http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

Я не уверен, как правильно форматировать поле 'value', так как информация, которую мне нужно проверить, содержится в массиве. Я пробовал следующие варианты: 'value' => 'Drink' 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')
Но ни один из них не работает. Есть идеи, как мне правильно отформатировать это, чтобы попасть в эти массивы? Спасибо

Зачем вам делать 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')? Просто обращайтесь к нужному полю в массиве, это базовый PHP. Например, чтобы получить 5-й элемент массива 'stuff', сделайте $thefifthvalueinstuff = $stuff[5];

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

Я думаю, проблема в том, как WCK Custom Fields Creator хранит созданные произвольные поля. Пользовательская мета-бокс называется 'specials', но 'Drink' — это просто информация внутри этого поля, поэтому meta_query не распознает его как 'ключ'.
Вот почему я привел вывод $special — мне нужна помощь в доступе к информации внутри этих массивов. Извините за путаницу. Спасибо.

Но ваш meta_query выполняется до цикла, у вас еще нет этих данных, поэтому вы не можете использовать их в аргументах запроса.

Хорошо, я продолжу делать проверки внутри цикла. Я не был уверен, есть ли более правильный способ, чем тот, который я использовал. Очень ценю вашу помощь! Спасибо.

А, извините, только что дошло, вам придется хранить метаданные записи по-другому, поскольку значения метаданных записи являются сериализованными объектами

$args = array(
'post_type' => "ваш_тип_записи",
'meta_key' => 'имя_мета_ключа',
'meta_compare' => '=', // см. документацию по параметрам сравнения
'meta_value ' => 'значение_для_поиска'
);
$posts = new WP_Query( $args );
https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters
Если вам нужно найти записи с непустыми значениями
$args = array(
'post_type' => "ваш_тип_записи",
'meta_key' => 'имя_мета_ключа',
'meta_compare' => '!=',
'meta_value ' => ''
);
$posts = new WP_Query( $args );
