Welcher WordPress-Hook wird ausgelöst, nachdem alle Post-Daten und Post-Meta gespeichert wurden?

Lesezeit: 7 Minuten

Benutzeravatar von M. K. Hossain
M. K. Hossain

Ich habe einen benutzerdefinierten Beitragstyp crm, und ich muss nach jedem gespeicherten oder aktualisierten crm eine E-Mail senden. Ich verwende cmb2 für einige benutzerdefinierte Metadaten wie Betreff, Benutzer usw. Ich kenne die save_post Hook feuert nach dem Post-Save (laut WordPress-Kodex) in meinem Fall, wenn ich anrufe save_post mit zwei Parametern (id und post) der Beitrag enthält keine Aktualisierungswerte. hier ist mein Code:

function send_mail_to_user($id, $post){
    $crm = $post;
    $user_email = array();
    if($crm->vc_all_vc == 'on'){
        $args = array('orderby' => 'display_name');
        $wp_user_query = new WP_User_Query($args);
        $authors = $wp_user_query->get_results();
        if (!empty($authors)) {
            foreach ($authors as $author) {
                array_push($user_email , $author->user_email );
            }
        } 
    }
    else{
        $to_users = $crm->vc_users;
        $to_program = $crm->vc_program;
        $to_group = $crm->vc_group;
        $to_excode = $crm->vc_ex_code;
        foreach ($to_users as $key => $value) {
            $user_data = get_userdata($value);
            array_push($user_email, $user_data->user_email);
        }
        foreach ($to_program as $key => $value) {
            $users = get_users( array('meta_key'     => 'programs'  ) );
            if($users){ 
                foreach ($users as $index => $data) {
                    if(in_array($value , explode('#', $data->programs))){
                        if(! in_array($data->user_email, $user_email)  )
                        {
                            array_push($user_email, $data->user_email);
                        }
                    }
                }
            }
        }
        foreach($to_group as $group) {
            $term = get_term_by('slug', esc_attr($group), 'user-group');
            $user_ids = get_objects_in_term($term->term_id, 'user-group');
            foreach($user_ids as $user_id){
                $fc_user = get_userdata($user_id);
                if(! in_array($fc_user->user_email, $user_email)  )
                {
                    array_push($user_email, $fc_user->user_email);
                }
            }   
        }
        foreach($to_excode as $codes) {
            $value = explode('*',$codes)[1];
            $users = get_users( array('meta_key'     => 'programs'  ) );
            if($users){ 
                foreach ($users as $index => $data) {
                    if(in_array($value , explode('#', $data->programs))){
                        if(! in_array($data->user_email, $user_email)  )
                        {
                            array_push($user_email, $data->user_email);
                        }
                    }
                }
            }   
        }
    }
    foreach($user_email as $index => $email){
        $to      = $email;
        $subject = $crm->vc_subject;
        $body    = $crm->post_content;
        $headers = array(
        'Content-Type: text/html; charset=UTF-8'
        );
        wp_mail($to, $subject, $body, $headers);
    }
}

add_action( 'save_post', 'send_mail_to_user', 10, 2 ); 

Und ich versuche es auch publish_post hook , das funktioniert gut, wenn ein neuer Beitrag erstellt wird, aber wenn es aktualisiert wird, funktioniert es genauso. Ich habe versucht edit_post und post_updated Hook auch, aber ich kann meine Update-Daten nie abrufen.

Also wie kann ich es lösen? Welcher Action-Hook gibt mir alle neuen Daten? vielen Dank im Voraus.

  • Mein Workaround dafür bestand darin, einen Cron-Job zu planen, um das Post-Meta etwa 10 Sekunden nach der Aktualisierung des Posts zu überprüfen. Ich muss noch einen Haken finden, den ich verwenden kann, der mir konsistent das Post-Objekt mit dem aktualisierten Meta liefert, dasselbe Problem wie Sie

    – Robobobobo

    10. Juli 2018 um 11:32 Uhr

Sie können so etwas verwenden,

function your_custom_function($meta_id, $post_id, $meta_key='', $meta_value="") {
    if($meta_key=='_edit_lock') {
        // if post meta is updated
    }
}
add_action('updated_post_meta', 'your_custom_function', 10, 4); 

  • Danke, dass du das geteilt hast! Das ist, wonach ich gesucht habe, da die anderen Aktionen/Filter mehrmals ausgelöst werden.

    – Mohammed Albanna

    12. Oktober 2019 um 2:37 Uhr

  • Da ab Version 5.6 a wp_after_insert_post Haken ist vorhanden. Überprüfen Sie diese Antwort: stackoverflow.com/a/71773904/1435770

    – Djanym

    28. April um 4:08 Uhr


Versuche es mit post_updated und verwenden $post_after Objekt.
https://codex.wordpress.org/Plugin_API/Action_Reference/post_updated

  • Funktioniert bei mir nicht, es gibt den Update-Post-Titel und post_content an, aktualisiert aber nicht das Post-Meta

    – M. K. Hossain

    13. Juni 2017 um 10:43 Uhr

  • In diesem Zusammenhang $post_after ist eine Instanz von WP_Post Klasse, also enthält es kein benutzerdefiniertes Post-Meta. Verwenden $meta = get_post_meta($crm->ID); in Ihrer Funktion, um alle Post-Meta-Felder zu erhalten.

    – Marian Mircea

    13. Juni 2017 um 11:19 Uhr


  • Ja, das habe ich schon gemacht, aber das Problem ist das meta value Ich habe nicht das Update, wahrscheinlich das CMB2-Update meta values nach post_updated Feuer. Ich vermute das nur.

    – M. K. Hossain

    14. Juni 2017 um 3:32 Uhr

  • Gute Beobachtung. Versuchen Sie, die Plug-in-Dateien zu durchsuchen add_action string, finden Sie heraus, welchen Hook verwendet wird, um Post-Metadaten zu speichern, und aktualisieren Sie dann Ihren Hook mit einer niedrigeren Priorität. Ihre Funktion sollte ausgeführt werden, nachdem das Plugin die Metawerte gespeichert hat, und hoffentlich erhalten Sie die aktualisierten Daten.

    – Marian Mircea

    14. Juni 2017 um 7:25 Uhr

  • Wenn Sie Advanced Custum Fields (ACF) verwenden, funktionieren die regulären WP-Hooks (einschließlich neuerer wie rest_after_insert_{$this->post_type}, die in Pippas Antwort erwähnt werden) nicht, Sie müssen den ACF-Hook ‘acf/save_post’ verwenden. advancedcustomfields.com/resources/acf-save_post

    – Makkabi

    25. August 2021 um 14:21 Uhr

Sie können dies verwenden save_post Haken Sie mit Ihrer Funktion. Ändern Sie Ihre Hook-Priorität auf 100, um aktualisierte Beiträge zu erhalten

add_action( 'save_post', 'send_mail_to_user', 100, 2 );

  • Ja, es gibt mir Update-Daten, nur für den Post, nicht für Post-Meta.

    – M. K. Hossain

    13. Juni 2017 um 10:42 Uhr

Das ist vielleicht etwas alt, wollte aber nur ein Update geben, da ab Version 5.6.0 ein neuer Hook verfügbar ist. Der Haken ist wp_after_insert_post und Sie können weitere Informationen finden hier . Dieser Hook wird ausgelöst, nachdem ein Beitrag erstellt oder aktualisiert wurde und alle seine Begriffe und Metadaten aktualisiert wurden. Nachfolgend finden Sie ein Beispiel:

add_action( 'wp_after_insert_post', 'send_mail_to_user', 90, 4 );

/**
 * Callback to: 'wp_after_insert_post'
 * Fires once a post, its terms and meta data has been saved
 * @param int     $post_id Post ID.
 * @param WP_Post $post    Post object.
 * @param bool    $update  Whether this is an existing post being updated.
 * @param null|WP_Post $post_before Null for new posts, the WP_Post object prior to the update for updated posts.
 *
 */
public static function sync_product_registrations_on_update( $post_id, $post, $update, $post_before ) {

    if ( 'post' !== $post->post_type ) {
        //Only to process the below when post type is 'post' else return
        return;
    }

    if ( ! in_array( $post->post_status, [ 'private', 'publish' ] ) ) {
        //To only process when status is private or publish
        return;
    }

    //The rest of your code goes here


}

Benutzeravatar von Pippa
Pippa

Du kannst den … benutzen rest_after_insert_{$this->post_type} Haken (wo $this->post_type wird durch den Beitragstyp ersetzt, zB ‘post’ oder ‘myposttype’).

Danke an Florian Brinkmann für dieser Link.

add_action('rest_after_insert_myposttype', 'myfunction', 10, 3);

function myfunction($post, $request, $creating) {
   // $creating is TRUE if the post is created for the first time,
   // false if it's an update

   //  ...
}

Siehe auch hier.

Benutzeravatar von Oded Shimoni
Oded Schimoni

Eine Problemumgehung besteht darin, $_POST zu verwenden[‘meta_field’] mit Sanitäranlagen:

$to_users = $_POST['vc_users'];
$to_program = $_POST['vc_program'];
$to_group = $_POST['vc_group'];
$to_excode = $_POST['vc_ex_code'];

$to_users = sanitize_text_field($to_users);
$to_program = sanitize_text_field($to_program);
$to_group = sanitize_text_field($to_group);
$to_excode = sanitize_text_field($to_excode);

Achten Sie auf die Feldnamen, mit ACF verwenden Sie den Feldschlüssel.

Dieses Problem ist komplizierter, als es auf den ersten Blick scheint:

Unser ‘post_updated’-Hook läuft, bevor der Beitrag aktualisiert wird, sodass jeder Versuch, Metadaten zu erhalten, mit den vorherigen Daten resultiert. Außerdem scheint WordPress (v5.7.2) keinen Haken zu haben, nachdem ein Beitrag gespeichert wurde.

Ebenfalls, ‘save_post’-Hook ist sehr kompliziert, da es für jeden gespeicherten oder erstellten Post einschließlich Revisionen ausgeführt wird und der boolesche $update-Wert immer noch nicht zuverlässig genug ist.

Benutzeravatar von Dave Hilditch
David Hilditch

Die richtige und einfachere Antwort ist die Verwendung von wp_insert_post Aktion.

https://developer.wordpress.org/reference/hooks/wp_insert_post/

Ein wichtiger Unterschied der Aktion wp_insert_post besteht darin, dass sie ausgelöst wird, nachdem update_post_meta aufgerufen wurde.

Es stehen 3 Parameter zur Verfügung – das $update-Flag sagt Ihnen, ob es sich um einen neuen oder aktualisierten Beitrag handelt.

do_action( 'wp_insert_post', int $post_ID, WP_Post $post, bool $update )

Also – um Ihren Code zu implementieren, nachdem alle Post-Meta aktualisiert wurden, verwenden Sie so etwas:

add_action('wp_insert_post', 'run_after_post_updated', 10, 3);    
function run_after_post_updated($post_ID, $post, $update ) {
   //  ...
}

  • EIN wp_after_insert_post Hook ist seit Version 5.6 verfügbar. Überprüfen Sie diese Antwort: stackoverflow.com/a/71773904/1435770

    – Djanym

    28. April um 4:11

  • Sicher – und es befindet sich an derselben Position wie wp_insert_post, außer dass wp_after_insert_post möglicherweise nicht ausgelöst wird, abhängig von Parametern, die an die Funktion wp_insert_post übergeben werden. Sehen i.imgur.com/Ou74dKy.png

    – David Hilditch

    4. Mai um 13:35 Uhr

1391440cookie-checkWelcher WordPress-Hook wird ausgelöst, nachdem alle Post-Daten und Post-Meta gespeichert wurden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy