@Syles'in cevabından bir başka hafif gelişme.
Kimlikleri hem dizeleri (örneğin bir form girişinden alındığında) hem de tamsayılar (örneğin update_post_meta($post_id, authorized_users', array(get_current_user_id()));
) olarak saklandığı durumlarda oldu . Bu, wp_set_object_terms()
terimleri ayarlamak için terim kimliklerini kullanabileceğiniz iyi bilinen bir sorun gibidir , ancak bunları tamsayı olarak kullanmazsanız, bu numaralarla isimleri olarak yeni terimler oluşturma şansınız yaklaşık% 50'dir. yerine.
Bu, test sitemin veritabanından sadece böyle bir durumun alıntılarından görülebileceği gibi, serileştirilmiş bir dizide oldukça farklı depolanmalarına neden olabilir:
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
Yukarıdakilerin her ikisi yoluyla beslendiğinde print_r()
olarak oluşturulur
Array
(
[0] => 1
)
Bunu düzeltmek için , değeri bir dize yerine bir tamsayı olarak kullanan sorgunun ve başka bir sürümünü meta_query
ekleyerek hafif bir değişiklik yaptım relation
.
İşte nihai sonuç:
'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'
),
),
DÜZENLEME: Bu yöntemin dizi dizinleri ile çarpışma riskini taşıyabildiğini fark etti, bu da birisinin dizide bulunmaması durumunda malzemelere yasadışı erişmesine izin verebilir, ancak kullanıcı kimliği bir dizin olarak görünür. Bu süre Bunun gibi, işler Aynı sorunu ele varsa, daha iyi bir uygulama herhangi bir değerin bu kadar yerine @sMyles' yöntemi kullanabileceklerini kaydederek öncesinde dizeleri olarak dökme aramak istediğiniz sağlamaktır.