Tengo una función que almacena el estado "Me gusta" de una publicación como meta meta. Quiero asociar ese "me gusta" con el usuario que le gustó, así que configuré un campo personalizado llamado "like_status_ {user_id}" (donde {user_id} es la identificación del usuario actualmente conectado) que almaceno como 0 o 1. Entonces, para una publicación con varios "me gusta", habría varios meta valores en la base de datos configurados de esta manera:
'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1
....y así.
Hay potencialmente miles de Me gusta en una publicación específica. ¿Cómo ejecutaría una consulta que se muestra si a alguien más también le gustó esa publicación?
Estaba pensando en algo como esto:
$query = new WP_Query(array(
'meta_key' => 'like_status_{user_id}',
'meta_value' => 1,
));
Estoy tratando de enviar una notificación a todos los que les ha gustado una publicación cuando a alguien más le gusta esa publicación ... algo así como: "Oye, a alguien más le gustó esa publicación que te gustó. ¡Deberías ir a verla!" Pero necesito una forma de averiguar si a alguien más le ha gustado esa publicación y, de ser así, quiénes serían para poder notificárselo.
Si no es posible, ¿podría sugerir una mejor manera de almacenar estos datos como post_meta mientras mantiene la eficiencia de actualizar rápidamente el estado de un solo usuario en una publicación?
Es bastante difícil responder concretamente a su pregunta. Sin embargo, la primera parte es fácil. Hace poco hice algo similar en stackoverflow
Las teclas meta se comparan y coinciden exactamente.
WP_Query
no tenemos medios para ajustar este comportamiento con un parámetro simple, pero siempre podemos presentar uno nosotros mismos y luego ajustar laposts_where
cláusula para hacer unLIKE
comparación en las teclas meta.EL FILTRO
Este es solo un filtro básico, ajústelo según sea necesario.
Como puede ver, el filtro solo se activa cuando configuramos nuestro nuevo parámetro personalizado,
wildcard_on_key
atrue
. Cuando esto se verifica, simplemente cambiamos el=
comparador alLIKE
comparadorSolo una nota sobre esto,
LIKE
comparaciones son inherentemente más caras de ejecutar que otras comparacionesLA CONSULTA
Simplemente puede consultar sus publicaciones de la siguiente manera para obtener todas las publicaciones con meta claves
like_status_{user_id}
OTRA PREGUNTA
Los campos personalizados no tienen impacto en el rendimiento, puede leer mi publicación sobre este tema aquí . Sin embargo, me preocupa que digas que cada publicación puede tener cientos o miles de Me gusta. Esto puede afectar su rendimiento al obtener y almacenar en caché una cantidad tan grande de datos de campo personalizados. También puede obstruir su base de datos con una gran cantidad de datos de campo personalizados innecesarios, lo que hace que sea bastante difícil de mantener.
No soy un gran fanático del almacenamiento de datos serializados en campos personalizados, ya que uno no puede buscar u ordenar por datos serializados. Sin embargo, sugeriría almacenar todas las ID de usuario en una matriz en un campo personalizado. Simplemente puede actualizar la matriz con la ID de usuario cuando a un usuario le gusta una publicación. Obtener los datos de campo personalizados y recorrer la matriz de ID y hacer algo con los ID es fácil. Solo echa un vistazo a
get_post_meta()
Actualizar un campo personalizado también es fácil. Para eso, tendrá que investigar
update_post_meta()
, no sé cómo crear sus campos personalizados, peroupdate_post_meta()
definitivamente es algo que querría usar.Si necesita enviar correos electrónicos o notificaciones push cuando se actualiza un campo personalizado, tiene los siguientes enlaces disponibles para trabajar. ( Ver
update_metadata()
para contexto )update_postmeta
actualizado _ {$ meta_type} _meta
updated_postmeta
actualizar _ {$ meta_type} _meta
actualizar _ {$ meta_type} _metadata
CONCLUSIÓN
Justo antes de publicar esto, nuevamente, antes de ir a la ruta serializada, asegúrese de que no necesite ordenar por los datos ordenados o buscar datos particulares dentro de los datos serializados.
fuente
Desde wordpress 5.1 ahora es posible usar metaconsulta como:
fuente
Si más adelante desea ampliar esto, con estadísticas más detalladas, características, etc., entonces otra alternativa podría ser: tablas personalizadas
Pros : adaptados a sus necesidades y pueden indexarse para un mejor rendimiento.
contras : más trabajo
También puede haber una solución alternativa utilizando una taxonomía personalizada, que podría proporcionar un mejor rendimiento de consulta que las meta meta consultas, debido a cómo se indexan las tablas principales.
No estoy seguro de qué tipo de notificaciones quiere decir aquí, pero esto puede volverse voluminoso rápidamente.
Ejemplo : un usuario al que le gustan ~ 1000 publicaciones y cada publicación obtiene ~ 1000 Me gusta, entonces hay 1 millón de notificaciones en las canalizaciones, ¡solo para ese usuario! Si se trata de notificaciones por correo electrónico, el proveedor de host podría no estar contento y el usuario se volvería loco. Eso también podría ser costoso con un servicio de correo electrónico de terceros.
fuente
Según la documentación de WP_Meta_Query , puede usar el
compare
argumento en elmeta_query
argumento de WP_Query. Sin embargo, solo puede comparar envalue
y no el,key
por lo que es posible que desee volver a pensar cómo estructurar esto.Un
like
argumento se vería así:Dado que no puede hacer una búsqueda 'ME GUSTA' en el
key
, le sugiero que agregue las publicaciones que le gustaron en el meta del usuario y realice una búsqueda WP_User_Query para los usuarios a quienes les haya gustado esa publicación:fuente