Kolejna niewielka poprawa w stosunku do odpowiedzi @sMyles.
Miałem przypadki, w których identyfikatory były przechowywane zarówno jako ciągi znaków (np. Gdy zostały pobrane z danych wejściowych formularza), jak i jako liczby całkowite (np update_post_meta($post_id, authorized_users', array(get_current_user_id()));
.). Jest to rodzaj dobrze znanego problemu polegającego na tym, wp_set_object_terms()
że można używać identyfikatorów terminów do ustawiania warunków, ale jeśli nie użyjesz ich jako liczb całkowitych, masz około 50% szansy na utworzenie nowych warunków z tymi liczbami jako ich nazwami zamiast.
Może to spowodować, że będą one przechowywane zupełnie inaczej w szeregowej tablicy, co można zobaczyć na podstawie fragmentów takiego przypadku z bazy danych mojej witryny testowej:
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
Oba powyższe, po przejściu print_r()
będą renderowane jako
Array
(
[0] => 1
)
Aby to naprawić, wprowadziłem niewielką modyfikację meta_query
, dodając relation
kolejną wersję zapytania, która rzuciła wartość jako liczbę całkowitą zamiast ciągu.
Oto końcowy wynik:
'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'
),
),
EDYCJA: Właśnie zdałem sobie sprawę, że ta metoda może narazić na ryzyko kolizji z indeksami tablic, co może umożliwić komuś nielegalny dostęp do materiałów, jeśli nie ma go w tablicy, ale jego identyfikator użytkownika pojawia się jako indeks. W związku z tym, chociaż działa to w przypadku omówienia problemu, lepszą praktyką jest dopilnowanie, aby wszystkie wartości, które chcesz wyszukać, były rzutowane jako ciągi przed zapisaniem ich, aby zamiast tego można było użyć metody @sMyles.