Czy w ramach akcji save_post można ustalić, czy jest to nowy post, czy istniejący wpis jest aktualizowany?
save-post
wp-update-post
hereswhatidid
źródło
źródło
Odpowiedzi:
Od wersji WordPress 3.7. - IIRC -
save_post
hook - więcej informacji na temat hooka i jego wykorzystania w Code Reference:save_post
i Codex:save_post
- ma trzeci parametr,$update
którego można użyć do określenia właśnie tego.Uwaga:
$update
nie zawszetrue
- możesz to zobaczyć i przetestować samodzielnie za pomocą poniższego kodu. Nie jest to jednak dobrze udokumentowane, być może dalekie od optymalnej nazwy, a zatem stwarza mylące oczekiwania. Poniższy kod może być użyty do debugowania, pobaw się, kiedy przechwycić wykonanie kodu, ponieważ w przeciwnym razie nie zobaczysz informacji / komunikatów. Myślę, że winowajcą jest zachowanie poprawek i automatycznych zapisów - które można wyłączyć, ale nie polecam go i nie przetestowałem. Nie jestem pewien, czy to uzasadnia bilet Trac , więc nie otworzyłem go, jeśli tak uważasz, skorzystaj z linku i zrób to sam. Oprócz tego, jak stwierdzono w komentarzach, jeśli masz konkretny problem, opublikuj nowe pytanie.źródło
$update
parametr jest ZAWSZE prawdziwy, nawet jeśli jest to nowy post. Ten parametr jest więc bezużyteczny. Nie jestem pewien, czy kiedykolwiek w ogóle działało, ale na pewno nie działa tak, jak zostało to udokumentowane w najnowszej wersji wordpress 4.8.wp_publish_post
, to tak. Ale to nie dotyczy jego użycia wwp_insert_post
. Napisałem funkcję debugowania, dodaję ją do odpowiedzi.save_post
Hak ma 3rd parametr, który jest zawsze ustawiony na true, więc nie wiem, co to ma wspólnego z innymi haki, nie mówiąc o innych haków. Mówię o haczyku w twojej odpowiedzi. To jest niepoprawne.wp_insert_post()
,wp_publish_post()
. Ten ostatni to tylko przyszłe posty,$update
zawsze będzietrue
. W przeciwnym razie, w odniesieniu dowp_insert_post()
,$update
nie zawsze tak jesttrue
.Sposób, w jaki przeprowadzam to sprawdzenie (w ramach funkcji przechwyconej) polega na porównaniu daty publikacji i daty modyfikacji (w GMT w celu standaryzacji)
Działa to, ponieważ nawet podczas tworzenia postu jest do niego dołączona data „zmodyfikowana”, która jest dokładnie taka sama jak data „utworzona”, ale dopuszczamy odchylenie 1 sekundy w obu kierunkach, w przypadku gdy sekunda tyka podczas tworzenia Poczta.
źródło
post_date_gmt
jest2019-03-12 01:31:30
ipost_modified_gmt
jest2019-03-12 01:31:31
. :(Skończyło się na sprawdzeniu istnienia niestandardowej wartości przed jej ustawieniem. W ten sposób, jeśli jest to nowo utworzony post, wartość niestandardowa jeszcze nie istniałaby.
źródło
Przykład odpowiedzi na ialocin za pomocą paremetera „update”:
źródło
if($update)
lub utrzymanie nowego bloku na pierwszym miejscu, ale użycieif( ! $update )
. Ta ostatnia wprowadzi OP do lepszej praktyki i jest preferowana w stosunku do twojej metody przez standardy kodowania WordPress w przypadkach takich jak operator trójskładnikowyMożesz użyć haka akcji pre_post_update dla kodu aktualizacji i save_post dla nowego kodu pocztowego. Działa przed aktualizacją posta.
źródło
save_post
hook jest uruchamiany zarówno po utworzeniu, jak i aktualizacji posta (po zapisaniu go przez WordPress w bazie danych).pre_post_update
jest uruchamiany, gdy post jest aktualizowany, ale przed aktualizacją postu - może to być ważne.Jak podpowiedział Darshan Thanki (a Stephen Harris dalej rozwijał), możesz skorzystać
pre_post_update
na swoją korzyść.Powodem, dla którego użyłem globałów jest to, że
function is_new_post() use ( &$new_post )
nie jest poprawne w PHP (szokujące ...), więc wciągnięcie tej zmiennej do zakresu funkcji nie działa - stąd globalne.Zauważ, że tak naprawdę można to niezawodnie wykorzystać tylko w / po
save_post
zdarzeniu (co zwykle jest wystarczające, przynajmniej do tego, co robimy).źródło
Po uruchomieniu save_post wszystkie informacje o tym poście są już dostępne, więc teoretycznie możesz ich użyć
jest to jednak niesprawdzone. =)
źródło
save_post
samego posta, byłby on już zapisany w bazie danych -get_posts
zwróci więc bieżący post.Inne podejście, które wykorzystuje wbudowaną funkcję i nie wymaga dodawania do bazy danych
get_post_status()
.Pamiętaj jednak, że może nie być właściwe, jeśli planujesz później przywrócić status „szkic” - instrukcje zostaną powtórzone przy następnej aktualizacji posta. W zależności od kontekstu warto rozważyć różne ciągi znaków, które mogą zostać zwrócone,
get_post_status()
aby zbudować bardziej odpowiedni scenariusz.Zobacz Codex dla get_post_status () i Statusu Postu
źródło
save_post()
jest wykonywany po raz pierwszy, ale podczas tego wykonania jestget_post_status()
już zwracany komunikat „publikuj”, a nie „wersja robocza”, nawet jeśli jest on dopiero publikowany.