Интересную задачку тут пришлось решать.

В WordPress хотелось сделать так, чтобы массив типов постов мог одинаково хорошо работать как при отборе через get_posts, так и в базе MySQL.

При этом если указать типы постов (это слова) в массиве, то сконвертировать в MySQL для применения в конструкции IN ($list) уже не тривиально.

При этом с цифровыми значениями такой проблемы нет.

Например:

1. Получаем список ИД постов нужных нам для отбора $ids = get_posts($args);

2. ids — содержит массив ИД

3. Берем и просто конвертируем их в строку $ids = implode(«,», $ids);

Полученный результат можем спокойно применять в MySQL

WHERE table.ID IN (» . $ids . «)

Все дело в том что $ids будет выглядеть как строка вида «12, 21, 45, 98» и этого хватит в MySQL.

 

А если у нас массив слов?

При том же маневре мы получим «слово 1, слово 2, слово 3» и тут MySQL даст ошибку, потому что ему нужна экранизация слов кавычками типа так «‘слово 1’, ‘слово 2’, ‘слово 3′»

 

И обычный imlode тут уже не поможет.

Тут нужен вот такой маневр $pt = «‘».implode(«‘,'», $pt_array).»‘»;

Как видите мы ставим кавычку в начале строки, далее добавляем кавычки перед и после запятой разделителя и далее ставим кавычку в конец строки.

Все!

В итоге получаем так:

1. $pt_array = array( ‘report’, ‘cases’, ‘post’, ‘document’ );

2. $pt = «‘».implode(«‘,'», $pt_array).»‘»;

$pt начинает содержать в себе слова экранированные кавычками.

И вот такой результат уже спокойно можно передавать в запрос.

Вот так post_type in (» . $pt . «)