Funkcja do wykonania po przeniesieniu postu do kosza.

9

Cześć, jest akcja, którą można wykonać, gdy post zostanie przeniesiony do kosza .... Próbowałem delete_post i delete_post. Działa, ale dwukrotnie dla każdej akcji (przed i po akcji zapisanej w kodeksie), a dane wyjściowe są wyświetlane tylko wtedy, gdy wiadomość jest usuwana z kosza. Przykład Chcę wysłać do autora wiadomość e-mail z informacją, że jego post został z jakiegoś powodu przeniesiony do kosza i zaktualizować część user_meta. jeśli użyję

add_action('deleted_post', 'emailUser');

lub

add_action('delete_post', 'emailUser');

działa tylko wtedy, gdy post zostanie usunięty z kosza. . .

Aktualizacja: sprawił, że działał dla postów w koszu za pomocą

add_action('trash_post', 'emailUser');

ale problem podwójnego wykonania funkcji wciąż istnieje. . .

Harjeet Singh
źródło
1
Napisz rozwiązanie poniżej i oznacz je jako odpowiedź
Ashfame
nie jest to właściwa odpowiedź, ponieważ nadal występuje podwójne wykonanie funkcji ...
Harjeet Singh

Odpowiedzi:

10

To załatwi sprawę!

add_action('trash_post','my_trash_post_function',1,1);
function my_trash_post_function($post_id){
    if(!did_action('trash_post')){
        // do stuff
    }
}

Tutaj dodajemy funkcję, aby zapobiec wykonywaniu haka więcej niż raz przy użyciu did

http://codex.wordpress.org/Function_Reference/did_action

Jak zawsze, te rodzaje haków przybrać formę {post_status}_{post_type}, tak trash_post, trash_page, trash_customposttype, publish_pageetc

Tom J Nowell
źródło
2

Ta akcja zostanie wywołana raz, gdy post zostanie przeniesiony do kosza, a następnie ponownie, gdy kosz zostanie opróżniony.

Twoja funkcja może sprawdzić obecność opcji z identyfikatorem postu w nazwie, jeśli opcji nie ma, wysyła wiadomość e-mail, a następnie ustawia opcję. Jeśli istnieje taka opcja (np. Jest wywoływana po raz drugi), wiadomość e-mail nie zostanie wysłana.

Pamiętaj zatem o usunięciu opcji, aby baza danych się z nimi nie zapełniła!

add_action( 'delete_post', 'emailUser' );

function emailUser( $postid ) {

   if ( ! get_option( 'user_emailed_' . $postid ) ) {
      // send email here
      update_option( 'user_emailed_' . $postid, 'anything' );
   } else {
      delete_option( 'user_emailed_' . $postid );
   }

}

Daj mi znać, czy działa!

Simon Blackbourn
źródło
możesz użyć interfejsu Transients API zamiast opcji, dzięki czemu nie będziesz musiał się martwić o usunięcie opcji z bazy danych codex.wordpress.org/Transients_API
Bainternet
Dzięki Simon, który działa świetnie. . . . nie wiem, dlaczego n tego przegapiłem. . ..
Harjeet Singh
Bainternet, widziałem transjenty i są one bardzo podobne do get_option w moim przypadku i wud trzymaj się get_option również do usuwania, ponieważ wykonanie zależałoby również od wydajności serwera i obliczenia czasu wykonania kodu przed i po usunięciu post może być trudny.
Harjeet Singh
W ogóle nie trzeba dodawać / edytować pól opcji lub stanów nieustalonych, dodając dodatkowe zapytania. Zamiast tego wystarczy zadzwonić do did_action, aby sprawdzić, czy hak już wystrzelił.
Tom J Nowell
1
add_action('trash_post', 'trash_post_function_name');

Powyższy hak nie działał dla mnie w WP 4.7.5.

To działało dla mnie

add_action('wp_trash_post', 'trash_post_function_name');
Mohamed Salem Lamiri
źródło