いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。この記事は12月1日〜24日までに僕が毎日ブログを更新する高橋文樹俺ベントカレンダーの18日目の記事です。実際の日付では20日目です。掲題の件ですが、ほぼ備忘録です。僕がまったく知らなかったために、けっこう時間かかったのですが、知ってる人は知ってるらしいですね。先日お仕事で大量の記事をインポートしていたのですが、終わったと思った後にiframeが全部消えているという事態が発生しました。「なぜ?」と思ったのですが、WordPressの次のような仕様が原因だったようです。WordPressはタグの無害化にksesというライブラリ(wp-includes/kses.php)を利用しているksesはタグのリストと属性のリストを持ち、そこに挙げられていない要素は全部除去する機能があるWordPressはksesを投稿フォームやコメントフォームなど、いたるところで使っているシングルインストールの管理者およびマルチサイトのネットワーク管理者にはunfiltered_htmlという権限があり、この権限を持つ者は上記のksesによるフィルタリングが適用されないこれ、Codexにも書いてあったんですね。これにより、次のような事態が発生します。Importerなどを利用しているのが管理者でも、iframeなどの特定のタグは消えるでは、どうすればいいのかというと、次のようなフィルターフックをかけます。して貰えばわかると思うのですが、$tagsは要素名をキーに、値として許可された属性名からなる配列を持ちます。変なタグを入れたいなという場合は、こちらのリストを修正すればいいんですね。デフォルトのタグリストはwp-includes/kses.phpを見るとわかります。僕はrubyプラグインを出しているのですが、なんどか「動きません!」みたいなことを言われてどうしても再現できず、「ブラウザの問題じゃねーの?」などと思っていたのですが、これが原因だったっぽいですね。いつも管理者だから気づきませんでした。ほんとうにすまんかった。WP-YomiganaTinyMCEで消されないようにするさて、物事を複雑にするのはですね、このタグのリストを追加する方法とは別に、TinyMCEというビジュアルエディタを動かしているJSもフィルタリングをかけるということなんですよ。ksesが走るのは投稿を保存するときなのですが、それとは別に、ビジュアルエディタとhtml入力を切り替えるときにはTinyMCEのフィルタリングが走ります。ここでも有効な要素として登録しておかないと消えてしまいます。このやり方は以前書いたWordPressのTinyMCEをチキチキにカスタマイズするという記事を参照してください。考えると、iframeやrubyなどのタグをまともに入れられるようにするには、2箇所のフックが必要ってことですね。思うに、unfiltered_htmlって必要なんですかね。Mapを貼り付けることができませんでした。私めの投稿にiframeを貼り付けていただけないでしょうか?」と頼んだとするじゃないですか。かけまくもかしこく管理者様がiframeを貼ったところで、次に投稿者が投稿を保存したらiframe消えるんですよね。したらまた投稿者が「カンリシャサマー」ですよね。なんなんですか、それ。中東の役所みたいじゃないですか。コンテンツの入力を制限する使い方ができるぞ!さて、文句ばっかり言ってもしょうがないので、この機能の有効な活用方法を考えてみましょう。僕個人は文章を書いたり読んだりするのが好きで、テキスト・オリエンテッドな考え方を持っており、「そもそもサムネイルやアイキャッチをつけないとクリック率が上がらないという現実と戦わなきゃ!」というラジカルな考え方の持ち主なのですが、WordPressをCMSとして使っていると、「HTMLを入力できる人は入力していいよ!」という決着になることがあります。itのようなサイトをWordPressで作っていて、「投稿を行う人がHTMLを入力できる」というのがそのコンテンツの核になるような場合ならばよいのですが、ほとんどの場合は折衷案として出ている結論だったりします。僕が見たり運用してきた中で、次のような条件のいずれかが存在するとHTMLで入力することになりますね。書いて、line-heightをいい感じにすれば済む話じゃないですか。大体のことには解決策があるんですよ。いえですね、僕にもそれを「技術力低いカスどもワロス」とバカにするつもりはなく、そういうことは往々にして起きうるんですよ。お金が足りないとか、人が足りないとか、時間が足りないとか、でもいまやりたい、回れよ地球とか。サイトが成功したとしましょうよ。そこで、CEOがみんなにこうやって伝えるんですよ。これまで我々はクソのようなインラインCSSを書いてきた。構造化されてレスポンシブなデザインに変えるべきだ。それにより、我々のサイトを訪れる月間ユニークユーザー200万人は、閲覧PV数を平均で20増やすだろう。すれば、我が社の収益は15%アップする。この15%は私たちが新しいことにチャレンジするための原資だ。みんなもこの新しいコンテンツ制作フローを守り、一緒に未来へと進んで欲しい。するとですね、みんな「ハイ!」って言うんですよ。その日の夜の飲み会で「今日の社長ヤバかったよね〜超熱かった」とか言うんですよ。それなのに、翌日、style属性にインラインCSSを書くんですよ。red;”を喰らえ!」つってね。なんでこんな悪夢のようなことが起きるかというと、入力できるからなんですね。入力できるのがいけないんですよ。いって、コンテンツ入力する奴なんて、全員狂ってるか敵かぐらいに思った方がいいですよ。親の仇ぐらいに思ってちょうどいいぐらいなんですよ。はい、長くなりました。要するに、style属性が入力できなければいいんですよね。そのためには、こうします。2);これでstyle属性を入力しても、保存時に削除できるようになりました。これをやるとテキストの中央寄せとか、色付けは一切動かなくなるですけどね。ここら辺のボタンはインラインCSSで実現しているあとですね、ビジュアルエディタって、HTMLとテキストで切り替えできるじゃないですか。これをオフにしてしまえばいいんですよ。2);こうすれば、style属性を書こうとも思えなくなるので、ますます減りますね。厨やbr厨にダメージを与えるためにはうってつけの手段ですよ。管理者がたくさんいたら意味ないですけど、それはまた別の問題なので。そりゃ誰だって、いままで管理者だったのにいきなり投稿者になったらいい気はしないですよ。それがWordPressのユーザー権限であったとしてもね。いうわけで、長くなったのでここらへんで。CMSは人と人とが魂となってぶつかり合う人間交差点。「つちよし」の入力やおぞましい背景色、異常に選択肢が多いクソプルダウンが今日も火花を散らしている。