Можно ли запрашивать пользовательские мета-данные через WP_Query

4 окт. 2012 г., 19:37:01
Просмотры: 24.3K
Голосов: 6

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

Я использую 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.

Я знаю, что это много информации, и я действительно ценю любую обратную связь и помощь в решении этой проблемы. Если вам нужна дополнительная информация или разъяснения по чему-либо, пожалуйста, дайте мне знать. Еще раз спасибо!

1
Комментарии

Избегайте многомерных массивов

Tom J Nowell Tom J Nowell
4 окт. 2012 г. 21:11:01
Все ответы на вопрос 2
8
11

Обычно вы просто указываете 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

4 окт. 2012 г. 19:51:44
Комментарии

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

Но ни один из них не работает. Есть идеи, как мне правильно отформатировать это, чтобы попасть в эти массивы? Спасибо

yoxalld yoxalld
4 окт. 2012 г. 20:39:53

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

Tom J Nowell Tom J Nowell
4 окт. 2012 г. 21:08:53

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

Tom J Nowell Tom J Nowell
4 окт. 2012 г. 21:10:35

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

Вот почему я привел вывод $special — мне нужна помощь в доступе к информации внутри этих массивов. Извините за путаницу. Спасибо.

yoxalld yoxalld
4 окт. 2012 г. 22:10:04

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

Tom J Nowell Tom J Nowell
4 окт. 2012 г. 22:20:05

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

yoxalld yoxalld
4 окт. 2012 г. 22:46:56

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

Tom J Nowell Tom J Nowell
5 окт. 2012 г. 00:20:16

Я обновил свой ответ с учетом этого, извините, я должен был раньше заметить, что метаданные не являются отдельным значением

Tom J Nowell Tom J Nowell
5 окт. 2012 г. 00:21:57
Показать остальные 3 комментариев
0
    $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 );
22 янв. 2021 г. 14:41:24