J'ai une fonction qui stocke le statut "like" pour un post en tant que meta post. Je veux associer ce "j'aime" à l'utilisateur qui l'a aimé, j'ai donc configuré un champ personnalisé appelé "like_status_ {user_id}" (où {user_id} est l'ID de l'utilisateur actuellement connecté) que je stocke en tant que 0 ou 1. Donc, pour un article avec plusieurs "j'aime", il y aurait plusieurs méta-valeurs dans la base de données qui sont configurées comme ceci:
'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1
....etc.
Il y a potentiellement des milliers de likes sur un post spécifique. Comment pourrais-je exécuter une requête qui montre si quelqu'un d'autre a également aimé ce message?
Je pensais à quelque chose comme ça:
$query = new WP_Query(array(
'meta_key' => 'like_status_{user_id}',
'meta_value' => 1,
));
J'essaie de pousser une notification à tous ceux qui ont aimé un post quand quelqu'un d'autre aime ce post ... quelque chose comme, "Hé, quelqu'un d'autre a aimé ce post que vous avez aimé. Vous devriez aller le vérifier!" Mais j'ai besoin d'un moyen de savoir si quelqu'un d'autre a aimé ce message et si oui, qui il serait afin que je puisse le notifier.
Si ce n'est pas possible, pourriez-vous suggérer un meilleur moyen de stocker ces données en tant que post_meta tout en conservant l'efficacité de la mise à jour rapide du statut similaire d'un utilisateur unique sur un message?
Il est assez difficile de répondre concrètement à votre question. La première partie est cependant facile. J'ai récemment fait quelque chose de similaire sur stackoverflow
Les méta-clés sont comparées et correspondent exactement.
WP_Query
n'avons aucun moyen d'ajuster ce comportement avec un paramètre simple, mais nous pouvons toujours en introduire un nous-mêmes puis ajuster laposts_where
clause pour faire uneLIKE
comparaison sur les méta-clés.LE FILTRE
Ce n'est qu'un filtre de base, ajustez-le selon vos besoins.
Comme vous pouvez le voir, le filtre n'est déclenché que lorsque nous définissons notre nouveau paramètre personnalisé,
wildcard_on_key
surtrue
. Lorsque cela vérifie, nous changeons simplement le=
comparateur enLIKE
comparateurJuste une note à ce sujet, les
LIKE
comparaisons sont intrinsèquement plus coûteuses à exécuter que les autres comparaisonsLA REQUÊTE
Vous pouvez simplement interroger vos messages comme suit pour obtenir tous les messages avec des méta-clés
like_status_{user_id}
AUTRE QUESTION
Les champs personnalisés n'ont pas d'impact sur les performances, vous pouvez lire mon article sur ce sujet ici . Je suis cependant troublé par le fait que vous dites que chaque message peut avoir des centaines ou des milliers de likes. Cela peut vous nuire à l'obtention et à la mise en cache de performances d'une telle quantité de données de champ personnalisé. Il peut également obstruer votre base de données avec une énorme quantité de données de champ personnalisées inutiles, ce qui le rend assez difficile à maintenir.
Je ne suis pas un grand fan du stockage de données sérialisées dans des champs personnalisés car on ne peut pas rechercher ou commander par des données sérialisées. Je suggérerais cependant de stocker tous les ID utilisateur dans un tableau sous un champ personnalisé. Vous pouvez simplement mettre à jour le tableau avec l'ID utilisateur lorsqu'un utilisateur aime un message. Obtenir les données de champ personnalisées et boucler sur le tableau des ID et faire quelque chose avec les ID est facile. Jetez un œil à
get_post_meta()
La mise à jour d'un champ personnalisé est également facile. Pour cela, vous devrez vous pencher sur
update_post_meta()
, je ne sais pas comment vous créez vos champs personnalisés, maisupdate_post_meta()
c'est certainement quelque chose que vous voudriez utiliser.Si vous devez envoyer des e-mails ou des notifications push lorsqu'un champ personnalisé est mis à jour, vous disposez des crochets suivants pour travailler. ( Voir
update_metadata()
pour le contexte )update_postmeta
_ {$ meta_type} _meta mis à jour
updated_postmeta
mettre à jour _ {$ meta_type} _meta
mettre à jour _ {$ meta_type} _metadata
CONCLUSION
Juste avant de poster ceci, encore une fois, avant de suivre la route sérialisée, assurez-vous que vous n'auriez pas besoin de trier par les données triées ou de rechercher des données particulières à l'intérieur des données sérialisées.
la source
Depuis wordpress 5.1, il est maintenant possible d'utiliser une méta-requête comme:
la source
Si plus tard vous souhaitez étendre cela, avec des statistiques plus détaillées, des fonctionnalités, etc., alors une autre alternative pourrait être: des tables personnalisées
Avantages : Adapté à vos besoins et indexable pour de meilleures performances.
inconvénients : Plus de travail
Il peut également y avoir une solution de contournement utilisant une taxonomie personnalisée, qui pourrait donner de meilleures performances de requête que post-méta-requêtes, en raison de la façon dont les tables principales sont indexées.
Vous ne savez pas de quel type de notifications vous parlez ici, mais cela peut rapidement devenir volumineux.
Exemple : Un utilisateur qui aime ~ 1000 publications et chaque publication obtient ~ 1000 likes, alors il y a 1M de notifications dans les tuyaux, uniquement pour cet utilisateur! S'il s'agit de notifications par e-mail, le fournisseur d'hébergement pourrait ne pas être satisfait et l'utilisateur deviendrait fou. Cela peut également coûter cher avec un service de messagerie tiers.
la source
Selon la documentation WP_Meta_Query , vous pouvez utiliser l'
compare
argument dans l'meta_query
argument de WP_Query. Cependant, vous ne pouvez comparer que sur levalue
et non sur le,key
donc vous voudrez peut-être repenser la façon dont vous structurez cela.Un
like
argument ressemblerait à ceci:Étant donné que vous ne pouvez pas faire de recherche "LIKE" sur le,
key
je vous suggère d'ajouter les messages aimés dans la méta utilisateur et de faire une recherche WP_User_Query pour les utilisateurs qui ont aimé ce message:la source