web-dev-qa-db-fra.com

Comment puis-je empêcher les entités HTML d'une méta-boîte personnalisée d'être in-htmlentities?

J'ai une méta-boîte personnalisée supposée accepter le HTML, mais le texte que je tente de saisir contient des guillemets simples et doubles (et des esperluettes). Les données sauvegardées sont gâchées. Chaque fois que je recharge la publication, les données est dupliqué avec un guillemet simple supplémentaire (et un crochet d’angle) inséré à la fin. J'imagine qu'il essaie de "fermer" ce qu'il pense être une phrase non fermée entre guillemets simples, alors qu'en réalité c'est une apostrophe.

Je peux résoudre ce problème temporairement en utilisant le code de caractère html pour mon apostrophe, mais (a) ce n'est pas une solution en définitive, car je ne peux pas contrôler ce que les autres utilisateurs peuvent entrer une fois le thème déployé, et (b) une fois la page se recharge, le caractère html a de nouveau été remplacé par une apostrophe, ce qui signifie que si j’enregistre d’autres modifications, je suis de retour à la case départ.

Alors, comment puis-je "échapper" au contenu HTML dans une métabox sans effacer les balises html? Existe-t-il une fonction/hook/action/etc/wordpress spéciale ou un format métabox spécial que je devrais utiliser, ou devrais-je simplement regarder cela dans le manuel PHP?

PS: Il "supprime" également tous les caractères HTML tels que &, de sorte que la publication ne sera pas validée correctement car il y a maintenant un & simple dans le texte.

METTRE À JOUR:
Alors, qui savait que les guillemets simples vs doubles faisaient une différence en php simple? J'ai réussi à corriger l'étrange duplication et la "correction" de l'apostrophe en échangeant mes citations dans mon code.

Mon code d'origine était ceci:

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 />";

Si j'enregistre la phrase suivante: <p>Blah &amp; blah 'blah'</p> dans la zone de texte résultante, elle renverrait '><p>Blah & blah 'blah'</p>.

Si je remplace simplement les guillemets simples et doubles dans mon code, comme ceci:

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

alors cela fonctionne très bien (en dehors de la chose html-entity, qui est toujours un problème).

Ces deux lignes de code ensemble, vous pouvez donc voir que je n'ai omis aucune citation (la première fonctionne, mais pas le dernier):

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 />";

Donc, maintenant, la question de la duplication bizarre a été résolue (bien que je ne comprenne pas pourquoi - je pensais que les guillemets simples et doubles étaient interchangeables si vous ne faisiez pas de substitution bizarre, etc. La question qui reste est: comment puis-je arrêter le texte de l'application de htmlspecialchars_decode, ou ce qui se passe ici ...

2
Amanda

Si je suis autorisé à répondre à ma propre question ici: j'ai trouvé un moyen d'empêcher la conversion de mes entités html en caractères en utilisant <?php esc_textarea( $text ) ?>, comme détaillé par le codex ici: http://codex.wordpress.org/ Fonction_Référence/esc_textarea .

Pas sûr que ce soit la bonne façon de le faire, mais ça marche. Mon code metabox (extrait) ressemble maintenant à ceci:

<?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 />';
  }
?>

Ceci, combiné avec la chose simple/double citation ci-dessus, fonctionne bien maintenant.

4
Amanda

Cela a fonctionné pour moi: Utilisez esc_html () lorsque vous sauvegardez votre texte metabox:

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

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

Récupérez votre texte metabox comme d'habitude:

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