it-swarm.com.de

Bereinigen von `wp_editor ();` - Werten für Datenbank, Bearbeitung und Anzeige

Ich verwende benutzerdefinierte Instanzen von wp_editor();, um die Rich-Text-Bearbeitung von Post-Metas zu ermöglichen, die mit einem Post-Objekt verknüpft sind.

Ich möchte einen Großteil der gleichen Bereinigung durchführen, die mit post_content für die Werte dieser Felder durchgeführt wird.

Das habe ich mir ausgedacht:

Bitte lassen Sie mich wissen, ob dies ein akzeptabler Ansatz ist oder ob ich in einem dieser drei Schritte mehr tun sollte oder ob es einen besseren oder einfacheren Weg gibt.

On save_post:

$value = wp_filter_post_kses( sanitize_post_field( 'post_content', $value, 0, 'db' ) );

Wert an wp_editor(); übergeben:

$value = wp_unslash( sanitize_post_field( 'post_content', $value, 0, 'edit' ) );

Wert am Frontend ausgeben:

$value = wp_unslash( sanitize_post_field( 'post_content', $value, 0, 'display' ) );
3
Michael Ecklund

wp_kses zur rettung!

Mein Editor enthält alles, was ein Beitrag könnte

Führen Sie das Ergebnis auf dem Weg hinein und hinaus durch wp_kses_post, und alles sollte gut sein.

Denken Sie daran, dass hierdurch alle durch den the_content-Filter hinzugefügten Elemente entfernt werden. Verwenden Sie diese Option, um Oembeds und Shortcodes beizubehalten:

echo apply_filters( 'the_content', wp_kses_post( $content ) );

Möglicherweise möchten Sie auch esc_textarea, um das Formular auszugeben, wenn Sie <textarea>-Tags direkt verwenden

Mein Editor enthält Text, aber kein Markup

Bei der Ausgabe ist esc_html dein Freund. Verwenden Sie dies für Situationen, in denen Sie einen Textbereich haben, der niemals Markups enthält. Versuchen Sie bei der Eingabe, wp_strip_all_tags bei der Eingabe zu bereinigen. Die anderen WP APIs stellen sicher, dass keine SQL-Injektionen erfolgen

Mein Editor enthält Markup, aber eine begrenzte Teilmenge

wp_kses zur rettung wp_kses zusammen mit einem zweiten parameter, einem array, das definiert, welche tags und Attribute erlaubt sind, durchlaufen. Z.B.:

$allowed = [
    'a' => [
        'href' => [],
        'title' => []
    ],
    'br' => [],
    'em' => [],
    'strong' => [],
];

echo wp_kses( $content, $allowed );

Seien Sie vorsichtig, wenn Sie überdehnen. Wenn Sie Skript- und Iframe-Tags hinzufügen, hat es dann wirklich Sinn, wp_kses zu verwenden?

wp_editor

wp_editor gibt intern aus, es kann nicht maskiert werden, daher ist es für die Maskierung selbst verantwortlich. Versuchen Sie nicht, nicht hilfreich zu sein, indem Sie den vorab entkoppelten Inhalt weitergeben. Dies kann zu einer Verstümmelung der Ausgabe und zu einer doppelten Entkoppelung führen (eine großartige Möglichkeit, um das Entkoppeln von fehlerhaften Inhalten zu umgehen).

Die Funktion, die ausgibt, ist für die Flucht verantwortlich. Dies ermöglicht ein spätes Entkommen. Früher oder mehrmals zu entkommen ist gefährlich und bringt neue komplexe Probleme mit sich, da Sie nicht mehr mit Sicherheit wissen, was entgangen ist oder nicht.

1
Tom J Nowell

Ich denke, Sie sind auf dem richtigen Weg.

Die Funktion sanitize_post_field() ruft den Hook content_save_pre auf, der bei gegebenem DB-Kontext auch die Funktion wp_filter_post_kses aufruft .

Soweit ich an dieser Stelle feststellen kann, müssen wir nach dem Speichern in der Datenbank keine Schrägstriche für die Anzeige entfernen. Folgendes habe ich, das dem, was du bereits hattest, ziemlich ähnlich ist:

Wert sparen

update_post_meta( $post->ID, '_test', sanitize_post_field( 'post_content', $_POST['_test'], $post->ID, 'db' ) );

Übergebender Wert

$editor_content = get_post_meta( $post->ID, '_test', true );

wp_editor( $editor_content, 'editor_id_here', array(
    'textarea_name' => '_test',
) );

Wert anzeigen

$editor_content     = get_post_meta( $post->ID, '_test', true );
$display_content    = apply_filters( 'the_content', $display_content );
1
Howdy_McGee