Еще одно небольшое улучшение от ответа @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'
),
),
РЕДАКТИРОВАТЬ: Просто понял, что этот метод может столкнуться с риском столкновения с индексами массива, что может позволить кому-то незаконный доступ к материалам, если они не в массиве, но их идентификатор пользователя отображается в виде индекса. Таким образом, хотя это работает, если у вас есть обсуждаемая проблема, лучше убедиться, что любые значения, которые вы хотите найти, приводятся в виде строк перед их сохранением, чтобы вы могли вместо этого использовать метод @sMyles.