Ändern Sie den Inhalt, bevor Sie in die database schreiben

Ich habe herumgesucht, aber ich kann die Antwort dafür nicht genau bestimmen. Ich versuche, den Inhalt eines benutzerdefinierten Felds als post_data zu verwenden und in der database als solchen zu speichern, wenn ein Beitrag erstellt oder aktualisiert wird. Ich muss dies tun, um eine Frontend-Posting-Lösung mit dem Plugin Advanced Custom Fields auszuarbeiten.

Ich denke, ich brauche so etwas:

function tsv_content_save_pre( $post_id ){ global $post; $tsvpost = get_post($post_id); $tsvifempty = $tsvpost->post_content; //The "real" post_content $tsvcontent = get_field('article_content'); //The custom content if ($tsvifempty == NULL) { //Check if the "real" post content has anything in it first. $tsvargs = array('post_content' => $tsvcontent); wp_update_post ($tsvargs); } } add_filter('content_save_pre' , 'tsv_content_save_pre' ); 

Aber ich stecke dort fest. Ich bin kein Plugin-Entwickler, daher sind Filter und solche für mich schwer zu navigieren. Kann mir jemand helfen, mich in die richtige Richtung zu weisen?

Danke im Voraus.

Solutions Collecting From Web of "Ändern Sie den Inhalt, bevor Sie in die database schreiben"

Erstens, content_save_pre ist ein sehr alter Hook. Adam Brown hat eine Warnung, dass:

Dieser Hook tritt in der neuesten Version von WordPress (3.5) nicht auf. Benutze es nicht . Es ist veraltet. Sie sollten sich die Liste der “verwandten Haken” unten ansehen, um zu sehen, ob Sie herausfinden können, was sie ersetzt hat.

Ich würde eine Lösung vorschlagen, die einer ähnelt, die ich für eine Frage vorgeschlagen habe , in der es darum geht, Statusänderungen basierend auf der Anzahl von Inhaltswörtern einzuschränken .

Wenn Sie Ihrem Code sehr genau folgen, sollte die Lösung wie folgt aussehen:

 function cmeta_as_content_wpse_92012($data){ if (!empty($data['post_content'])) { $tsvcontent = get_field('article_content'); //The custom content $data['post_content'] = $tsvcontent; } return $data; } add_action('wp_insert_post_data','cmeta_as_content_wpse_92012'); 

Aber ich habe Bedenken:

  1. Ich weiß nicht, ob get_field in diesem Kontext funktioniert
  2. Wenn ich die richtigen Dokumente für get_field habe, sieht es so aus, als ob die function Daten aus der database holt, also wird es Ihnen nichts nützen, um einen Post zu aktualisieren – nun, es sei denn, Sie aktualisieren den Post und den Postmeta und laufen dann eine weitere Abfrage zum Ändern der Postdaten, die verschwenderisch erscheint. Und Ihre Frage spezifiziert “vor dem Schreiben in die database”.

Also statt des oben genannten würde ich die $_POST Daten direkt parsen.

 function cmeta_as_content_wpse_92012($data){ global $_POST; if (!empty($data['post_content']) && !empty($_POST['meta'])) { foreach ($_POST['meta'] as $v) { if ('article_content' == $v['key']) { $data['post_content'] = wp_kses( $v['value'] ); // The custom content } } } // var_dump($_POST,$data); die; // debugging return $data; } add_action('wp_insert_post_data','cmeta_as_content_wpse_92012',1); 

Noch mehr Vorbehalte:

  1. Ich kann mich nicht erinnern, in welchem ​​Schritt WordPress seine eigenen Filter anwendet, also habe ich wp_kses angewendet
  2. Artikel # 1 kann übertrieben sein
  3. Artikel # 1 ist möglicherweise nicht die gewünschte validationsfunktion
  4. Wenn mehrere benutzerdefinierte Meta-Felder mit dem gleichen Schlüssel article_content der letzte und nur der letzte verwendet.

Ich denke, Sie müssen eine Post-ID in Ihrem Array Argumente haben. Aus dem Dokument :

Das Ausfüllen des ID-Feldes ist nicht unbedingt notwendig, aber ohne sie ist es wenig sinnvoll, die function zu verwenden.

 $tsvargs = array( 'ID' => $post_id, 'post_modified' => date("Ymd H:i:s"), 'post_modified_gmt' => date("Ymd H:i:s"), 'post_content' => $tsvcontent ); $post_id = wp_update_post($tsvargs); if ($post_id == 0) { // handle error here } 

OK, über WPQuestions.com konnte ich jemanden dazu bringen, das herauszufinden. Es erfordert 2 functionen, 1 für die Buchung auf dem Front-End und ein anderes für die Buchung auf dem Back-End. Da ACF eine benutzerdefinierte function namens acf / save_post anstelle von WP native save_post verwendet, gab es zusätzliche Arbeit.

Hier ist die letzte funktionierende Lösung:

  //Save ACF field as post_content for back-end add_action('save_post', 'change_content'); function change_content($post_id) { $post_content = get_post_meta($post_id,'article_content',true); $my_post = array(); $my_post['ID'] = $post_id; $my_post['post_content'] = $post_content; remove_action('save_post', 'change_content'); wp_update_post( $my_post ); add_action('save_post', 'change_content'); } //Save ACF field as post_content for front-end add_action('acf/save_post', 'change_content_frontend'); function change_content_frontend($post_id) { $post_content = get_post_meta($post_id,'article_content',true); $my_post = array(); $my_post['ID'] = $post_id; $my_post['post_content'] = $post_content; remove_action('acf/save_post', 'change_content_frontend'); wp_update_post( $my_post ); add_action('acf/save_post', 'change_content_frontend'); } 

Hoffentlich hilft das jemandem, etwas ähnliches zu versuchen!