Une autre légère amélioration par rapport à la réponse de @sMyles.
J'ai eu des cas où les identifiants ont été stockés à la fois sous forme de chaînes (comme lorsqu'ils sont extraits d'une entrée de formulaire) et sous forme d'entiers (par exemple update_post_meta($post_id, authorized_users', array(get_current_user_id()));
). C'est un peu comme le problème bien connu avec wp_set_object_terms()
lequel vous pouvez utiliser des ID de terme pour définir les termes, mais si vous ne les convertissez pas en entiers, vous avez environ 50% de chances de créer de nouveaux termes avec ces nombres comme noms. au lieu.
Cela peut entraîner leur stockage très différent dans un tableau sérialisé, comme le montrent les extraits d'un tel cas de la base de données de mon site de test:
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
Les deux ci-dessus, une fois alimentés print_r()
, rendront
Array
(
[0] => 1
)
Pour résoudre ce problème, j'ai apporté une légère modification à l' meta_query
ajout d'une relation
et d' une autre version de la requête qui convertit la valeur en entier au lieu d'une chaîne.
Voici le résultat final:
'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: Je viens de réaliser que cette méthode pouvait courir le risque de collisions avec des index de tableau, ce qui pourrait permettre à quelqu'un d'accéder illégalement aux matériaux s'ils ne sont pas dans le tableau, mais leur ID utilisateur apparaît comme un index. En tant que tel, bien que cela fonctionne si le problème est discuté, la meilleure pratique consiste à s'assurer que toutes les valeurs que vous souhaitez rechercher sont converties en chaînes avant de les enregistrer afin que vous puissiez utiliser la méthode @sMyles à la place.