web-dev-qa-db-ja.com

カスタムメタボックス内のHTMLエンティティを隠蔽するにはどうすればよいですか。

HTMLを受け入れるようになっているカスタムメタボックスがありますが、入力しようとしているテキストに二重引用符と一重引用符(およびアンパサンド)の両方が含まれています。末尾に余分な一重引用符(および山括弧)を挿入して複製します。私が考えていることを「閉じる」ことを試みるのは、一重引用符で囲まれていない句であり、実際にはアポストロフィであると思います。

私はアポストロフィにhtml文字コードを使うことで今すぐ一時的にこれを直すことができますが、(a)テーマがロールアウトされると他のユーザーが何を入力するかを制御できないので最終的には解決できません。ページがリロードされ、HTML文字が再びアポストロフィに置き換えられました。つまり、それ以上の変更を保存した場合は、正方形に戻ります。

では、HTMLタグを削除せずにメタボックス内のHTMLコンテンツを「エスケープ」するにはどうすればよいですか。特別なワードプレス機能/ hook/action/etcや特別なメタボックスフォーマットを使うべきでしょうか、それとも代わりにPHPマニュアルで調べるべきでしょうか。

PS:&のようなhtml文字も "削除"されています。そのため、テキストにプレーンな&があるため、投稿は正しく検証されません。

更新:
では、誰が一重引用符と二重引用符の違いを知っていて、単純なphpに違いがあるのでしょうか。私は自分のコード内の引用符を入れ替えることによって、奇妙な重複とアポストロフィの「修正」を修正することができました。

私の元のコードはこれでした:

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

結果のテキストボックスに<p>Blah &amp; blah 'blah'</p>というフレーズを保存すると、'><p>Blah & blah 'blah'</p>が返されます。

コードの中で一重引用符と二重引用符を入れ替えるだけの場合は、次のようになります。

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

それでもそれはうまく動作します(それでもまだ問題となっているhtml-entityのものは別として)。

この2行のコードを組み合わせると、引用符を省略していないことがわかります(上のものは機能しますが、下のものは機能しません)。

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

それで、今、奇妙な重複の問題は修正されました(私はなぜかわかりませんが - もしあなたが奇妙な代用をしていなければ一重引用符と二重引用符は互換性があると思いました、など)。 htmlspecialchars_decodeを適用したテキスト、またはここで何が起こっていても...

2
Amanda

私がここで私自身の質問に答えることを許されるならば:私はここのcodexによって詳述されるように<?php esc_textarea( $text ) ?>を使うことによって私のhtml実体の文字への変換を止める方法を見つけました: http://codex.wordpress.org/ Function_Reference/esc_textarea

これが正しいやり方かどうかはわからないが、それはうまくいっている。私の(断片化された)メタボックスコードは、このようになりました。

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

これは、上記の一重引用符/二重引用符と組み合わせると、今では正常に機能します。

4
Amanda

これは私のために働いた:あなたのメタボックステキストを保存するときに esc_html() を使う:

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

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

通常どおりメタボックステキストを取得します。

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