まず、ショートコードはローカルスコープから読み込まれるようで*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で展開される?