Несколько значений, сохраненных в виде массива в мета-запросе


Я немного запутался в том, как лучше всего сохранять значения множественного выбора в мета-полях.

Предполагая

<select multiple name="_casestudypost[]">

- это мое поле формы

Если я сохраню $_POST['_casestudypost'] в метаключе с тем же именем? (который возвращает массив) - как я могу узнать, когда 281 находится в этом массиве. Я пробовал:

$args = array(
            'meta_query'=> array(
                array(
                    'key'=>'_casestudypost',
                    'value'=>  281,
                    'compare' => 'IN',
                    'type' => 'NUMERIC'
                )
            ),
            'post_type'=>'case_studies',
            'post_status' => 'publish'
        );

Однако сгенерированный SQL, который Wordpress генерирует под капотом, похоже, задает вопрос: значение meta_value (13,281,45) в 281, а не 281 в мета_значение (13,281,45).

Author: Squiggs., 2013-01-21

2 answers

Запрос IN не является запросом сравнения строк. Это больше похоже на набор OR утверждений.

... WHERE tablename.animal IN ('cat','dog','ferret')

Будет таким же, как

...WHERE tablename.animal = 'cat'
      OR tablename.animal = 'dog'
      OR tablename.animal = 'ferret'

$_POST['_casestudypost'] будет массивом, и если вы сохранили его как одно значение в postmeta, это будет serialize d. Массив array("animal" => "cat"); при сериализации будет выглядеть примерно как a:1:{s:6:"animal";s:3:"cat";}. Ваше фактическое значение $_POST['_casestudypost'] будет аналогичным образом преобразовано. Это очень далеко от того, что вам нужно.

Если вы собираетесь тянуть по значениям или парам ключ/значение храните каждое из выбранных вами значений $_POST['_casestudypost'] отдельно в базе данных - каждое значение в отдельной строке, а не в виде отдельной пары ключ/значение, содержащей сериализованный массив.

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

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

 4
Author: s_ha_dum, 2013-01-22 06:19:51

Значение по умолчанию compare в meta_query равно =, что вам и нужно. Предполагая, что я правильно понимаю ваш вопрос, вы хотите следующего.

$args = array(
            'meta_query'=> array(
                array(
                    'key'=>'_casestudypost',
                    'value'=>  281,
                    'type' => 'NUMERIC'
                )
            ),
            'post_type'=>'case_studies',
            'post_status' => 'publish'
        );

compare (string) - Operator to test the 'meta_value'. Possible values are '!=', '>', '>=', '<', or '<='. Default value is '='. ( перефразировано для решения мета_запроса)

 0
Author: Dan, 2013-01-22 06:35:43