Ich habe eine Funktion, die den "Gefällt mir" -Status für einen Beitrag als Beitragsmeta speichert. Ich möchte dieses "Gefällt mir" dem Benutzer zuordnen, dem es gefallen hat. Daher richte ich ein benutzerdefiniertes Feld mit dem Namen "Gefällt mir_Status_ {Benutzer_ID}" (wobei {Benutzer_ID} die ID des aktuell angemeldeten Benutzers ist) ein, das ich als 0 oder speichere 1. Für einen Beitrag mit mehreren "Likes" gibt es also mehrere Meta-Werte in der Datenbank, die wie folgt eingerichtet sind:
'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1
....und so weiter.
Es gibt möglicherweise Tausende von Likes in einem bestimmten Beitrag. Wie würde ich eine Abfrage ausführen, die anzeigt, ob jemand anderes diesen Beitrag auch mag?
Ich dachte so etwas:
$query = new WP_Query(array(
'meta_key' => 'like_status_{user_id}',
'meta_value' => 1,
));
Ich versuche, eine Benachrichtigung an alle zu senden, denen ein Beitrag gefallen hat, wenn jemand anderes diesen Beitrag mag ... so etwas wie "Hey, jemand anderem hat dieser Beitrag gefallen, den Sie mögen. Sie sollten ihn sich ansehen!" Aber ich brauche einen Weg, um herauszufinden, ob jemand diesen Beitrag gemocht hat und wenn ja, wer er wäre, damit ich ihn benachrichtigen kann.
Wenn dies nicht möglich ist, können Sie eine bessere Methode zum Speichern dieser Daten als post_meta vorschlagen und gleichzeitig die Effizienz der schnellen Aktualisierung des Status eines einzelnen Benutzers in einem Beitrag beibehalten?
Es ist ziemlich schwierig, Ihre Frage konkret zu beantworten. Der erste Teil ist jedoch einfach. Ich habe kürzlich etwas Ähnliches beim Stackoverflow gemacht
Metaschlüssel werden verglichen und stimmen genau überein.
WP_Query
Ich habe keine Möglichkeit, dieses Verhalten mit einem einfachen Parameter anzupassen, aber wir können immer selbst einen einführen und dann dieposts_where
Klausel anpassen , um einenLIKE
Vergleich mit Metaschlüsseln durchzuführen.DER FILTER
Dies ist nur ein grundlegender Filter. Passen Sie ihn nach Bedarf an.
Wie Sie sehen, wird der Filter nur ausgelöst, wenn wir unseren neuen benutzerdefinierten Parameter
wildcard_on_key
auf setzentrue
. Wenn dies auscheckt, wechseln wir einfach den=
Komparator zumLIKE
KomparatorNur eine Anmerkung dazu:
LIKE
Vergleiche sind von Natur aus teurer als andere VergleicheDIE ABFRAGE
Sie können Ihre Beiträge einfach wie folgt abfragen, um alle Beiträge mit Metaschlüsseln zu erhalten
like_status_{user_id}
ANDERE FRAGE
Benutzerdefinierte Felder haben keinen Einfluss auf die Leistung. Sie können meinen Beitrag zu diesem Thema hier lesen . Ich bin jedoch beunruhigt darüber, dass Sie sagen, dass jeder Beitrag Hunderte oder Tausende von Likes haben kann. Dies kann Sie beim Abrufen und Zwischenspeichern einer so großen Menge benutzerdefinierter Felddaten beeinträchtigen. Es kann auch Ihre Datenbank mit einer großen Menge unnötiger benutzerdefinierter Felddaten verstopfen, was die Wartung ziemlich schwierig macht.
Ich bin kein großer Fan von der Speicherung von serialisierten Daten in benutzerdefinierten Feldern, da man nicht nach serialisierten Daten suchen oder bestellen kann. Ich würde jedoch vorschlagen, alle Benutzer-IDs in einem Array unter einem benutzerdefinierten Feld zu speichern. Sie können das Array einfach mit der Benutzer-ID aktualisieren, wenn ein Benutzer einen Beitrag mag. Es ist einfach, die benutzerdefinierten Felddaten abzurufen, das Array der IDs zu durchlaufen und etwas mit den IDs zu tun. Schau es dir an
get_post_meta()
Das Aktualisieren eines benutzerdefinierten Felds ist ebenfalls einfach. Dafür müssen Sie prüfen
update_post_meta()
, ich weiß nicht, wie Sie Ihre benutzerdefinierten Felder erstellen, aberupdate_post_meta()
ist definitiv etwas, das Sie verwenden möchten.Wenn Sie beim Aktualisieren eines benutzerdefinierten Felds E-Mails oder Push-Benachrichtigungen senden müssen, stehen Ihnen die folgenden Hooks zur Verfügung. ( Siehe
update_metadata()
Kontext )update_postmeta
aktualisiert _ {$ meta_type} _meta
aktualisierte_postmeta
Update _ {$ meta_type} _meta
Aktualisieren Sie _ {$ meta_type} _metadata
FAZIT
Bevor Sie dies erneut veröffentlichen, stellen Sie sicher, dass Sie nicht nach den sortierten Daten sortieren oder nach bestimmten Daten in den serialisierten Daten suchen müssen, bevor Sie den serialisierten Weg gehen.
quelle
Seit WordPress 5.1 ist es jetzt möglich, Meta-Abfragen wie folgt zu verwenden:
quelle
Wenn Sie dies später mit detaillierteren Statistiken, Funktionen usw. erweitern möchten, könnte eine weitere Alternative sein: benutzerdefinierte Tabelle (n)
Profis : Auf Ihre Bedürfnisse zugeschnitten und kann für eine bessere Leistung indiziert werden .
Nachteile : Mehr Arbeit
Möglicherweise gibt es auch eine Problemumgehung mit einer benutzerdefinierten Taxonomie, die aufgrund der Indizierung der Kerntabellen eine bessere Abfrageleistung als Post-Meta-Abfragen bietet.
Ich bin mir nicht sicher, welche Art von Benachrichtigungen Sie hier meinen, aber dies kann schnell sperrig werden.
Beispiel : Ein Benutzer, der ~ 1000 Beiträge mag und jeder Beitrag ~ 1000 Likes erhält, dann gibt es 1 Million Benachrichtigungen in den Pipes, nur für diesen Benutzer! Wenn dies E-Mail-Benachrichtigungen sind, ist der Host-Anbieter möglicherweise nicht zufrieden und der Benutzer wird verrückt. Dies kann auch bei einem E-Mail-Dienst eines Drittanbieters teuer sein.
quelle
Gemäß der WP_Meta_Query- Dokumentation können Sie das
compare
Argument immeta_query
Argument von WP_Query verwenden. Sie können jedoch nur dievalue
und nicht die vergleichen,key
sodass Sie möglicherweise überlegen möchten, wie Sie dies strukturieren.Ein
like
Argument würde so aussehen:Da Sie keine "LIKE" -Suche für das durchführen können,
key
würde ich vorschlagen, dass Sie die gewünschten Beiträge in das Benutzer-Meta einfügen und eine WP_User_Query- Suche nach Benutzern durchführen, denen dieser Beitrag gefallen hat:quelle