Mam funkcję, która przechowuje status „Lubię to” dla posta jako meta postu. Chcę powiązać to „polubienie” z użytkownikiem, który go polubił, dlatego ustawiłem niestandardowe pole o nazwie „like_status_ {identyfikator_użytkownika}” (gdzie {identyfikator_użytkownika} to identyfikator aktualnie zalogowanego użytkownika), które przechowuję jako 0 lub 1. Tak więc dla postu z kilkoma „polubieniami” w db będzie kilka meta wartości, które są ustawione w ten sposób:
'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1
....i tak dalej.
W określonym poście potencjalnie są tysiące polubień. Jak uruchomiłbym zapytanie, które pokazałoby, czy komuś podobał się ten post?
Myślałem o czymś takim:
$query = new WP_Query(array(
'meta_key' => 'like_status_{user_id}',
'meta_value' => 1,
));
Próbuję przekazać powiadomienie każdemu, kto polubił post, gdy ktoś inny lubi ten post ... coś w stylu: „Hej, komuś podobał się post, który ci się podobał. Powinieneś to sprawdzić!” Potrzebuję jednak sposobu, aby dowiedzieć się, czy komuś podobał się ten post, a jeśli tak, to kim byłby, bym mógł go powiadomić.
Jeśli nie jest to możliwe, czy możesz zasugerować lepszy sposób przechowywania tych danych jako post_meta przy jednoczesnym zachowaniu wydajności szybkiego aktualizowania statusu pojedynczego użytkownika w poście?
Konkretnie trudno odpowiedzieć na twoje pytanie. Pierwsza część jest jednak łatwa. Niedawno zrobiłem coś podobnego w przypadku przepełnienia stosu
Meta-klucze są porównywane i pasują dokładnie.
WP_Query
nie mamy środków na dostosowanie tego zachowania za pomocą prostego parametru, ale zawsze możemy wprowadzić go samodzielnie, a następnie dostosowaćposts_where
klauzulę, abyLIKE
porównać meta-klucze.FILTR
To tylko podstawowy filtr, dostosuj go w razie potrzeby.
Jak widać, filtr jest uruchamiany tylko wtedy, gdy ustawimy nasz nowy parametr niestandardowy
wildcard_on_key
natrue
. Kiedy to się sprawdza, po prostu zmieniamy=
komparator naLIKE
komparatorTylko uwaga na ten temat,
LIKE
porównania są z natury droższe w porównaniu z innymi porównaniamiZAPYTANIE
Możesz po prostu wysłać zapytanie do swoich postów w następujący sposób, aby uzyskać wszystkie posty z meta-kluczami
like_status_{user_id}
INNE PYTANIE
Pola niestandardowe nie mają wpływu na wydajność, możesz przeczytać mój post na ten temat tutaj . Niepokoi mnie jednak to, że każdy post może mieć setki lub tysiące polubień. Może to wpłynąć na zwiększenie wydajności i buforowanie tak dużej ilości niestandardowych danych w terenie. Może również zapchać twoją bazę danych ogromną ilością niepotrzebnych niestandardowych danych pola, co utrudnia utrzymanie.
Nie jestem wielkim fanem przechowywania danych zserializowanych w niestandardowych polach, ponieważ nie można wyszukiwać ani zamawiać według danych szeregowych. Sugerowałbym jednak przechowywanie wszystkich identyfikatorów użytkowników w tablicy pod jednym niestandardowym polem. Możesz po prostu zaktualizować tablicę o identyfikator użytkownika, gdy użytkownik lubi post. Uzyskiwanie niestandardowych danych pola i zapętlanie tablicy identyfikatorów oraz robienie czegoś z identyfikatorami jest łatwe. Spójrz tylko
get_post_meta()
Aktualizacja pola niestandardowego jest również łatwa. W tym celu musisz zajrzeć
update_post_meta()
, nie wiem, jak tworzysz własne pola, aleupdate_post_meta()
zdecydowanie jest to coś, czego chciałbyś użyć.Jeśli musisz wysyłać e-maile lub powiadomienia push, gdy pole niestandardowe jest aktualizowane, masz do dyspozycji następujące zaczepy. ( Patrz
update_metadata()
kontekst )update_postmeta
zaktualizowano _ {$ meta_type} _meta
updated_postmeta
aktualizacja _ {$ meta_type} _meta
aktualizacja _ {$ meta_type} _metadata
WNIOSEK
Tuż przed opublikowaniem tego ponownie, zanim przejdziesz do serializowanej trasy, upewnij się, że nie będziesz musiał sortować według posortowanych danych ani wyszukiwać określonych danych w serializowanych danych.
źródło
Od wersji 5.1 można teraz używać meta-zapytań, takich jak:
źródło
Jeśli później chcesz to rozszerzyć o bardziej szczegółowe statystyki, funkcje itp., Jeszcze inną alternatywą może być: niestandardowe tabele
plusy : dostosowane do twoich potrzeb i mogą być indeksowane w celu uzyskania lepszej wydajności.
Minusy : więcej pracy
Możliwe jest także obejście problemu przy użyciu niestandardowej taksonomii, która może zapewnić lepszą wydajność zapytań niż w przypadku zapytań po meta ze względu na sposób indeksowania tabel podstawowych.
Nie jestem pewien, jakie powiadomienia tutaj masz na myśli, ale może to szybko stać się nieporęczne.
Przykład : użytkownik, który lubi ~ 1000 postów, a każdy post otrzymuje ~ 1000 polubień, wtedy w potokach jest 1 mln powiadomień, tylko dla tego użytkownika! Jeśli są to powiadomienia e-mail, dostawca hosta może nie być szczęśliwy, a użytkownik oszaleje. Może to być również kosztowne w przypadku zewnętrznej usługi e-mail.
źródło
Zgodnie z dokumentacją WP_Meta_Query można użyć
compare
argumentu wmeta_query
argumencie WP_Query. Możesz jednak porównać tylko,value
a niekey
tak, więc możesz przemyśleć, jak to ustrukturyzować.like
Argumentem będzie wyglądać następująco:Biorąc pod uwagę, że nie można przeprowadzić wyszukiwania „LIKE” na stronie
key
sugeruję, aby dodać polubione posty w meta użytkownika i przeprowadzić wyszukiwanie WP_User_Query dla użytkowników, którzy polubili ten post:źródło