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).


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;
}

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) {

}

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);
 }

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' );

Danke, aber ich möchte die Daten tatsächlich bearbeiten, bevor sie in der Datenbank gespeichert werden.
KWD
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.