数年前に WordPress で wp-dtree を使ってカテゴリ別に記事をツリー表示していたことがあり、久しぶりにこのウィジットを使おうと思ってインストールしてみたところ、動かん・・・。他にもツリー表示をしてくれるウィジットは色々あったので試してみたんですが、どれもイマイチ・・・。
ツリー表示は諦めるか、そのうち自作するかと考えていたんですが、たまたま wp-dtree のスクリプトエラーを見てみたら意外と問題は単純そうでした。
※その後、ふとしたタイミングでもしかしたら「未分類」カテゴリーの記事が無いために発生しているのかと思って、試しに「未分類」カテゴリーの記事を追加したら、そもそも回避コードを使わずともエラーが無くなりました・・・。
- 「未分類」カテゴリーの記事が無くて wp-dtree が表示されない場合に下記コードを検討してください。
- 自分の試した環境では「未分類」カテゴリーの記事があっても wp-dtree の動作には問題なく、ツリーノードに「未分類」が表示されました。
ブラウザのコンソールに表示されるエラーメッセージ
SyntaxError: syntax error
cat1.a(,0,'','','?p=123','','');
?cat=6 (307 行目, 7 列目)
ReferenceError: cat1 is not defined
...cript><script type='text/javascript'>cat1.openTo('-6', true); /*wp_query object ...
?cat=6 (309 行目)
SyntaxError のリンクを辿って行くと表示ページの 307 行目に移動。
var cat1 = new wpdTree('cat1', 'http://WordPressのURL','0');
cat1.config.useLines=1;
cat1.config.useIcons=0;
cat1.config.closeSameLevel=1;
cat1.config.folderLinks=0;
cat1.config.useSelection=0;
cat1.a(0,'root','','','','','');
cat1.a(-6,0,'カテゴリー1','','?cat=6','','');
cat1.a(-12,0,'カテゴリー2','','?cat=12','','');
cat1.a(-7,0,'カテゴリー3','','?cat=7','','');
cat1.a(,0,'','','?p=123','',''); //←ここで失敗
document.write(cat1);
wp-dtree のソースコードを調べてみると、この cat1 を生成しているのは wp-dtree-build.php ファイルの wpdt_build_tree 関数内で、WP-dTree 4.3.1 では 48 行目に記述があります。
$tree .= "{$t}.a({$nodedata['id']},{$nodedata['pid']},'{$nodedata['name']}','{$nodedata['title']}','{$nodedata['url']}','{$target}','{$rsspath}');\n";
おそらく id が null の時を判定して cat1 追加を行わないようにするのがいいような気がしますが、url に 'p' が含まれている場合でも判定条件に使えるので下記コードでエラーを回避しました。
// 元々のコード
// $tree .= "{$t}.a({$nodedata['id']},{$nodedata['pid']},'{$nodedata['name']}','{$nodedata['title']}','{$nodedata['url']}','{$target}','{$rsspath}');\n";
// {$nodedata['id'] が空になり $nodedata['url'] に "p" が含まれているためか、cat1 変数の作成に失敗?
// 回避コード
if (strpos($nodedata['url'],'p') == false) {
$tree .= "{$t}.a({$nodedata['id']},{$nodedata['pid']},'{$nodedata['name']}','{$nodedata['title']}','{$nodedata['url']}','{$target}','{$rsspath}');\n";
}