新しいSEブログの1つに記事を投稿しようとしたところ、次のような問題に遭遇しました。私は作家としてリストされていますが、これは私の能力がやや制限されていることを意味します。特に、私は任意のHTMLを投稿することは許可されていません、むしろ私のエントリーは最初にksesパーサーを通して送られます。これは一般的には良いことのように思えます(私はHTMLに対して責任を負わされたくありません!)が、それはMarkdownプロセッサの1つの部分、つまり引用符を妨害します。私は書くことができません:
> this is a quote
なぜなら>
はksesルーチンによってエスケープされるからです。これを可能にするためにksesコードを修正するのはややこしく、間違った解決策です(kses
パーサがMarkdownのものにあまりにも密接に結びつくため、正しい解決策はデータを検証することですの後に処理されましたが、気にすることはありません...)。もちろん、私は<blockquote>...</blockquote>
タグを直接使用できるので、これは大きな問題ではありません。それだけがその中のMarkdownプロセッサをオフにします。私たちはPHPMarkdownExtraを使っているので(少なくとも、テストは私たちがそうであることを示しているように思われる)、私はブロッククォートの中でMarkdownをオンにするためにmarkdown="1"
偽属性を使うことができます。しかし、これは承認された属性のリストに載っていないので、ksesによって取り出されます。
しかし、markdown
を承認済み属性のリストに追加することは、> quote
構文のサポートを追加するよりもはるかに簡単に思えます。特にこの情報を保持する配列$allowedposttags
がありますので、それは明らかにその配列を単に変更することを意味します。
しかし、これが問題です。その変更を行う適切な場所はどこですか。明らかに、kses.php
を修正することは最後の手段です。私の推測は、正しい変更はmarkdown.php
ファイルがこの変更を行うためのものであると思います(これはMarkdownが使用されることを知っているファイルだからです)。 )しかし、上流で変更される可能性のあるものを変更したくない場合は、必要な変更をどこに配置すればよいですか?
(上記で「私」と言っても、SEブログでこれを変更したいので、実際に「私」という意味ではありません。そのため、Rebecca Chernoffが理解できる言語で説明してください。)
詳しくはCUSTOM_TAGS
を定義することを可能にする定数$allowedposttags, $allowedtags, $allowedentitynames
があります。
そうすれば、単にCUSTOM_TAGS
をtrueに設定して、ksesがインクルードされる前にフックされる関数でグローバルを定義することができます。
$allowedposttags
を定義するアクションを起動するために最初に利用可能なフックはmuplugins_loaded
ですが、その前または後にksesがロードされるかどうかはわかりません。
// Set custom tags to override $allowedposttags, $allowedtags, $allowedentitynames
if ( ! defined( 'CUSTOM_TAGS' ) )
define( 'CUSTOM_TAGS', true );
自明のフィルタを含むwp_kses_hook()
もあります。
apply_filters('pre_kses', $string, $allowed_html, $allowed_protocols);