閉じる

WordPressのショートコードで DOMDocumentを使って断片を吐く

まず、ショートコードはローカルスコープから読み込まれるようで*1 、普通にグローバルスコープのつもりで変数を定義するとハマるのに注意。
=>明示的にグローバルスコープの変数だと指定しましょう。

global $var;
$var=’hoge’;

HTMLの断片を作るのに DOMを使う場合、こんな感じかと。

$doc=new DOMDocument(‘1.0′,’utf-8’);
$doc->…
$contents=$doc->saveHTML();

一見何の問題もないのだけど、ソースを見ると数値参照で出力されていて非常に見づらい。
少し調べると、こう書くと良しという文献に行き当たる。

$doc=new DOMDocument(‘1.0′,’utf-8’);
$doc->…
$contents=$doc->saveHTML($doc->documentElement);

完全な HTMLを出力するのならこれでも良いのだけど、HTMLの断片の場合、最初のノードしか出力されず悩むことになる。
これは documentElementは「DOM内の最初のルートノードを示す」という仕様からくるもので、完全な HTMLなら htmlを示すので問題ないのだけど、断片だけを見るとルートノードが複数存在し(pやら divやら)、そのうちの最初のノードだけが出力されるということ。
というわけで、横着せずに断片ごとに DOMから作って出力するのが正解…だと思われ。

$contents=”;
$doc_A=new DOMDocument(‘1.0′,’utf-8’);
$doc_A->appendChild($contents_A=$doc->createElement(‘div’));
$contents.=$doc_A->saveHTML($doc->documentElement);
$doc_B=new DOMDocument(‘1.0′,’utf-8’);
$doc_B->appendChild($contents_B=$doc->createElement(‘div’));
$contents.=$doc_B->saveHTML($doc->documentElement);

まぁ 逆を言えばルートノードが一つなら問題ないわけで、断片を divなり spanなりでくくってしまうのも手。


*1 ショートコードを記述した各箇所に includeで展開される?

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)