Ще одне незначне покращення від відповіді @sMyles.
У мене були випадки, коли ідентифікатори зберігалися як у вигляді рядків (наприклад, узятих із введення форми), так і у вигляді цілих чисел (наприклад update_post_meta($post_id, authorized_users', array(get_current_user_id()));
). Це схоже на добре відому проблему, з якою wp_set_object_terms()
ви можете використовувати ідентифікатори термінів для встановлення термінів, але якщо ви не призначите їх як цілі числа, ви маєте приблизно 50% шансів створити нові терміни з цими числами як їх імена замість цього.
Це може призвести до того, що вони зберігаються зовсім інакше в серіалізованому масиві, як видно з уривків саме такого випадку з бази даних мого тестового сайту:
a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes
І те і інше, коли буде подано через, print_r()
буде видано як
Array
(
[0] => 1
)
Щоб виправити це, я зробив невеликий твір до параметра meta_query
, додавши ще relation
та іншу версію запиту, яка передає значення як ціле число замість рядка.
Ось кінцевий результат:
'meta_query' => array(
'relation' => 'OR', // Lets it know that either of the following is acceptable
array(
'key' => 'bcm_enm_authorized_users',
'value' => serialize(strval(get_current_user_id())), // Saved as string
'compare' => 'LIKE'
),
array(
'key' => 'bcm_enm_authorized_users',
'value' => serialize(intval(get_current_user_id())), // Saved as integer
'compare' => 'LIKE'
),
),
EDIT: Щойно зрозумів, що цей метод може ризикувати зіткненнями з індексами масиву, що може дозволити комусь забороняти доступ до матеріалів, якщо вони не є в масиві, але їх ідентифікатор користувача відображається як індекс. Таким чином, хоча це працює, якщо у вас обговорюється проблема, кращою практикою є забезпечення того, щоб будь-які значення, які ви хочете шукати, були передані як рядки перед їх збереженням, щоб ви могли замість цього використовувати метод @sMyles.