it-swarm.com.de

Wie verhindere ich, dass HTML-Entitäten in einer benutzerdefinierten Meta-Box sind?

Ich habe eine benutzerdefinierte Meta-Box, die HTML akzeptieren soll, aber der Text, den ich versuche, enthält sowohl doppelte als auch einfache Anführungszeichen (und kaufmännisches Und), und es bringt die gespeicherten Daten durcheinander - jedes Mal, wenn ich den Beitrag neu lade, die Daten wird mit einem zusätzlichen einfachen Anführungszeichen (und einer spitzen Klammer) am Ende dupliziert. Ich vermute, es wird versucht, zu "schließen", was es für eine nicht geschlossene Phrase in einfachen Anführungszeichen hält, wenn es wirklich ein Apostroph ist.

Ich kann dies momentan vorübergehend beheben, indem ich den HTML-Zeichencode für mein Apostroph verwende, aber (a) das ist letztendlich keine Lösung, da ich nicht steuern kann, was andere Benutzer eingeben können, sobald das Thema eingeführt wurde, und (b) einmal Wenn die Seite neu geladen wird, wurde das HTML-Zeichen wieder durch ein Apostroph ersetzt. Wenn ich also weitere Änderungen speichere, bin ich wieder auf dem ersten Platz.

Wie "entkomme" ich HTML-Inhalten in einer Metabox, ohne die HTML-Tags zu entfernen? Gibt es eine spezielle WordPress-Funktion/Hook/Action/etc oder ein spezielles Metabox-Format, das ich verwenden sollte, oder sollte ich dies stattdessen nur im Handbuch PHP nachschlagen?

PS: Es "streift" auch alle HTML-Zeichen wie & heraus, so dass der Beitrag nicht richtig validiert werden kann, da sich jetzt einfacher & im Text befindet.

UPDATE:
Also, wer wusste, dass einfache und doppelte Anführungszeichen einen Unterschied in der einfachen PHP machen? Ich habe es geschafft, die seltsame Vervielfältigung und "Korrektur" von Apostroph zu beheben, indem ich meine Anführungszeichen in meinem Code ausgetauscht habe.

Mein ursprünglicher Code war dieser:

echo "<textarea class='meta-textarea' style='width: 100%;' cols='20' rows='2' name='" . $meta_box['name'] . "_value' value='" . $meta_box_value . "'>" . $meta_box_value . "</textarea><br />";

Wenn ich den folgenden Ausdruck speichere: <p>Blah &amp; blah 'blah'</p> in das resultierende Textfeld, wird '><p>Blah & blah 'blah'</p> zurückgegeben.

Wenn ich nur die einfachen und doppelten Anführungszeichen in meinem Code austausche, wie folgt:

echo '<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="' . $meta_box['name'] . '_value" value="' . $meta_box_value . '">' . $meta_box_value . '</textarea><br />';

dann funktioniert es einwandfrei (abgesehen von der HTML-Entity-Sache, die immer noch ein Problem ist).

Diese beiden Codezeilen zusammen, so dass Sie sehen können, dass ich keine Anführungszeichen weggelassen habe (oben funktioniert einer, unten nicht):

echo '<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="' . $meta_box['name'] . '_value" value="' . $meta_box_value . '">' . $meta_box_value . '</textarea><br />';
echo "<textarea class='meta-textarea' style='width: 100%;' cols='20' rows='2' name='" . $meta_box['name'] . "_value' value='" . $meta_box_value . "'>" . $meta_box_value . "</textarea><br />";

Jetzt wurde die Frage der seltsamen Vervielfältigung behoben (obwohl ich nicht verstehe, warum - ich dachte, einfache und doppelte Anführungszeichen wären austauschbar, wenn Sie keine ungeraden Substitutionen usw. durchführen. Die verbleibende Frage lautet - wie höre ich auf? Der Text von der Anwendung von htmlspecialchars_decode oder was auch immer hier passiert ...

2
Amanda

Wenn ich meine eigene Frage hier beantworten darf: Ich habe mithilfe von <?php esc_textarea( $text ) ?> eine Möglichkeit gefunden, die Konvertierung meiner HTML-Entitäten in Zeichen zu stoppen. Dies wird im folgenden Codex beschrieben: http://codex.wordpress.org/ Funktionsreferenz/esc_textarea .

Ich bin mir nicht sicher, ob dies der richtige Weg ist, aber es funktioniert. Mein (ausgeschnittener) Metabox-Code sieht jetzt so aus:

<?php 
  if ( $meta_box['type'] == "textarea" ) {
    $meta_box_value = esc_textarea( get_post_meta($post->ID, $meta_box['name'].'_value', true) );
    echo '<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="' . $meta_box['name'] . '_value">' . $meta_box_value . '</textarea><br />';
  }
?>

Dies funktioniert jetzt in Kombination mit dem obigen einfachen/doppelten Anführungszeichen.

4
Amanda

Dies hat bei mir funktioniert: Verwenden Sie esc_html () , wenn Sie Ihren Metabox-Text speichern:

$my_data = esc_html( $_POST['my_value'] );

// Update the meta field in the database.
update_post_meta( $post_id, '_my_field', $my_data );

Rufen Sie Ihren Metabox-Text wie gewohnt ab:

$value = get_post_meta( $post->ID, '_my_field', true );
0
user3159159