Wie kann ich Post-Daten bearbeiten, bevor sie gespeichert werden?

19

Ich habe ein Plugin und möchte den Beitragsinhalt durch einige Filter ausführen können, bevor er in der Datenbank gespeichert wird. Wenn ich mir die Plugin-API ansehe , sehe ich, dass zwei Hooks hilfreich sein könnten:

save_post
wp_insert_post

Das einzige Problem ist, dass es so aussieht, als save_postmüsste keine Variable zurückgegeben werden. Ich weiß also nicht, wie ich den Inhalt filtern soll, und es wp_insert_postsieht dokumentiert aus.

Ich würde gerne so etwas machen:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> This post was saved on '.time();
}

Ich werde etwas Nützlicheres tun, als einen Zeitstempel anzufügen, nämlich einige Regex-Filter auszuführen, aber dies ist die allgemeine Art von Filter / Aktion, die ich hinzufügen möchte.

Aktualisieren

Bitte beachten Sie, dass ich die Daten abfangen möchte, während sie in der Datenbank gespeichert werden - nicht, wenn sie im Beitrag angezeigt werden (z. B .: Nicht durch Hinzufügen eines Filters zu the_content).

cwd
quelle
Hinweis: Sie haben ein schlechtes Design :-) 1. Jedes Mal, wenn ein Beitrag gespeichert wird, wird dieser String angehängt. (wenn Sie die vorherige nicht löschen, erhalten Sie ein Los in der " This post was...„s 2. Daten , wie dies sollte man als Meta - Wert des Post gespeichert werden :-) BTW: save_postwird aufgerufen , nachdem Daten gespeichert wurden, also nach dem es wurde in der Datenbank gespeichert (nicht was Sie wollen).
jave.web

Antworten:

29

Der Filter wp_insert_post_data kann dies tun:

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

function filter_post_data( $data , $postarr ) {
    // Change post title
    $data['post_title'] .= '_suffix';
    return $data;
}
Anh Tran
quelle
2
brachte mich in die richtige Richtung, danke. Ich denke, Sie müssen tatsächlich verwenden, add_actionanstatt add_filter. auch Sie wpse35931_filter_post_dataund filter_handlersind inkongruent ...
CWD
1
Es ist definitiv ein Filter. Filter und Aktionen basieren jedoch auf derselben Funktionalität, die eine gewisse Frequenzweiche zulässt. Wenn Sie dies jedoch als Aktion verwenden, können Sie keine Daten zurückgeben, die den gesamten Punkt entfernen würden. Sie möchten die Daten filtern und dann zurückgeben.
Jake,
2
wp_insert_post_datafunktioniert, ist aber etwas überfordert für das, was OP (und vielleicht auch andere) erreichen wollen. Eine einfachere Option in dieser Situation ist content_save_predie von @drzaus empfohlene.
Rinogo
1
Entwicklerdokumente für wp_insert_post_dataFilter: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web
Wird dieser Hook aufgerufen, wenn Sie a) manuell wp_insert_post () in beispielsweise functions.php Ihres Themas aufrufen, um einen Beitrag einzufügen / zu aktualisieren, ODER b) wenn ein Beitrag auf irgendeine Weise gespeichert wird (z. B. durch das Backend, durch das Frontend) , irgendwie anders ...)?
Vadim H
2

Sie können auch nach dem Haken suchen pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
user28231
quelle
1

Fügen Sie den folgenden Code zu dem aktiven Thema zu ersetzen <shell>mit [shell]vor dem Speichern:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
Suyash Jain
quelle
0

Wenn Sie am Ende aller Beiträge nur etwas Ähnliches hinzufügen möchten, empfehle ich Ihnen, den the_contentFilter zu verwenden.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />This post was saved on '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
Joshua Abenazer
quelle
Danke, aber ich möchte die Daten tatsächlich bearbeiten, bevor sie in der Datenbank gespeichert werden.
KWD