何も分からなかったことが分かった(WPテーマ)
Posted on 2009年11月29日 | 12 Comments
WordPress テーマを新しくしたのはいいんだけど
いろいろと困った問題が出てきた。
これらの問題の原因がテーマにあることだけは確かなんだけど
原因自体がなんなのかさっぱり分からない。
テーマの作り方を検索してみても情報がバラバラで
いろいろ試したんだけどやっぱりうまくいかない。
かなりお手上げ状態
とりあえずソースを晒しながら考えてみる。
長いよ。そして解決してないよ...orz
3つの現象は全部同じ原因なんじゃないかと安易に考えていたんだけど
いろいろ試しているうちに原因が別だということが分かった。
そもそも Stack overflow って何よ?ってのを調べると、
プログラムが動作する際に確保される一時メモリーが足りないってことらしい。
プログラムの中で呼び出す関数が多すぎるって意味。
原因として一番疑うべきは無限ループで、
次がスタック上に巨大な配列を確保しようとしている、
他にも関数呼び出しの階層数が深すぎるっていうのがあるらしい。
IEのエラーでは「Stack overflow at line:870」と出ていたので
メモリー足りないよーって言ってるのは
wp-includes/js/prototype.js の870行目なんだけど、
prototype.jsを何に使っているのか分からない...orz
ざっと見たところあらゆるものが使ってるようで、
よく重くなる頭の痛いブログパーツを1つ非表示にするだけで
Stack overflow は出なくなる。
でもブログパーツを外して対応するのは望ましくないっていうか、
今後ブログパーツとか増やせないしっていう別の頭痛がしてくるので
できればテーマ側を修正して対応したい。
無限ループってことはどこか endif を忘れているのかな?と思ったけど
そういうところは見当たらない。
巨大な配列は………確保しようとしてるかもなぁ…。
ウィジェット6つだし;
よく分からないけどとりあえず前のテーマでは平気だったんだから
前のテーマとの違いを考えてみる。
まず今までのテーマでは2つのウィジェットを使っていて、
新しくなったテーマでは6つのウィジェットを使っている。
問題が出るとしたらウィジェットだろうなということで、
functions.php を開いてウィジェットを全部コメントアウトしてプレビューする。
テーマに直書きしてあるサイドバーの中身が読み込まれるだけで
ウィジェットは動かない。
この状態ではIEでも Stack overflow は出ない。
でも Custom Smilies でコメント欄にスマイリーを入力することはできなかった。
この状態からウィジェットを2つ呼び出すようにしてみる。
このときにコメントアウトを外したコードは以下。
-
'name'=>'sidebar_full',
-
'before_widget' => '<li id="%1$s" class="sidebaritem %2$s"><div class="sidebarbox">',
-
'after_widget' => '</li>',
-
'before_title' => '<div class="widgettitle"><h2>',
-
'after_title' => '</h2></div>',
-
));
-
'name'=>'sidebar_left',
-
'before_widget' => '<li id="%1$s" class="sidebaritem %2$s"><div class="sidebarbox">',
-
'after_widget' => '</div></li>',
-
'before_title' => '<div class="widgettitle"><h2>',
-
'after_title' => '</h2></div>',
-
));
そして sidebar.php で一番上のウィジェットを呼び出すコードが以下。
これだとサイドバーの幅の広いところと、2カラムになってる左側が有効になる。
IEで確認しても Stack overflow は出ない。
サイドバーのコードは間違ってないみたいで、
ちゃんとウィジェットの中身は表示される。
大丈夫そうなのでもう1つウィジェットを有効にしてみる。
-
'name'=>'sidebar_full',
-
'before_widget' => '<li id="%1$s" class="sidebaritem %2$s"><div class="sidebarbox">',
-
'after_widget' => '</div></li>',
-
'before_title' => '<div class="widgettitle"><h2>',
-
'after_title' => '</h2></div>',
-
));
-
'name'=>'sidebar_left',
-
'before_widget' => '<li id="%1$s" class="sidebaritem %2$s"><div class="sidebarbox">',
-
'after_widget' => '</div></li>',
-
'before_title' => '<div class="widgettitle"><h2>',
-
'after_title' => '</h2></div>',
-
));
-
'name'=>'sidebar_right',
-
'before_widget' => '<li id="%1$s" class="sidebaritem %2$s"><div class="sidebarbox">',
-
'after_widget' => '</div></li>',
-
'before_title' => '<div class="widgettitle"><h2>',
-
'after_title' => '</h2></div>',
-
));
これでサイドバーの右側も表示されるようになる。
ところがこの時点でIEで Stack overflow が出てしまう。
検索して出てきたコードとなんか違うんだけど動いてるから合ってるぽい?
register_sidebar を register_sidebarsにして、
()の中にサイドバーの数を入れて…っていう方法がヒットするけど
それだと動かなかったし、多分こっちで合ってるはず。
でもスタックオーバーフローなんだよねぇ…
この段階でかなり悩んで、検索で出てきたいろんな書き方を試したんだけど
結局どの方法でも解決することができなかった。
このままではどうしようもないので、テーマとプラグインの相性が悪いのかも
っていう思考に方向転換して、負担をかけていそうなプラグインで外してもいいものを選ぶ。
で、切り捨てたのが Collapsing Links というリンクを折りたたむプラグイン。
これは導入したときにも動いたり動かなかったりしてたプラグインだし、
My Link Order で保存した並び順が反映されなくなっていたし、
疑わしい+なくても諦められるってことで無効に。
あ。Stack overflow 消えた( ゚Д゚)ポカーン
これでめでたく Stack overflow at line:870 というエラーアラートは消えた。
でもコメントのスマイリーは動かない。
コメントでご報告頂いたIE6で
「このページは、制御範囲外の情報にアクセスしています。セキュリティ上の問題がある可能性があります。続行しますか?」
と出てくるというは再現できず確認できなかった。
IETester (IEのいろんなバージョンで動作テストできるソフト)で開くと
固まってそのまま落ちてしまう...orz
ということは多分IE6では開くことすらできないんだろう
ちなみにこのブログではフレームを使って他のドメインのサイトを開いていない。
セキュリティ上の問題はないと思うので安心して続行して頂きたい。
でも残念ながらIE6では表示できない透過pngを使っているので
あまりにも酷いレイアウトになってしまう。
できればFirefoxや最新のIEなどを使って見て頂きたい。
ということで3のIE6で制御範囲外の情報に…っていうのは未確認&未修正のままとなってしまった。
IE6ユーザーの皆さん、ごめんなさい(_ _(--;(_ _(--; ペコペコ
で、結局このテーマの何かを修正できたのかってところに戻ると、
実は1行も修正できなかった。
ウィジェットを3つ以上利用すると巨大な一時メモリーが必要なのかもしれないし、
このテーマには対応していないプラグインが動いていたのかもしれない。
ともかく、1のStack overflow は未解決ながら
プラグインを無効にして出てこないようにした。
2のCustom Smilies はちょっと根が深い。
Stack overflow が消えれば直るかと思ったけどそうではなくて、
他のテーマでは動くことを確認したけどこのテーマでは動かない。
念のためプラグインの設定で
「Use the action named comment_form in comments.php if your theme support it. So you don't need to add cs_print_smilies() in comments.php manually.」
のところにチェックを入れてコードを自動挿入していたのをやめて、
テーマにコードを直接書いてみたりしたけど結果は同じだった。
他のプラグインを1つずつ無効にしてチェックしたけど、
どれを無効にしてもスマイリーは入力できるようにならなかった。
ちなみに、スマイリーはクリックしてもコメント入力欄に入力されないだけで
既に投稿されているスマイリーはちゃんと画像として表示されている。
プラグインに問題はない。…んだろうな。やっぱり。
comments.php のコメント入力欄部分のコードは前と一緒で、
textarea の id も comment になっているし、idが違うわけではない。
使えないなら諦めて無効にしてしまえ…とも思ったのだけど
これを無効にしてしまうと、今まで書いてくれたコメントからスマイリーが消えて
とかの画像が文字(コード)になってしまう。
それはあんまりにも寂しいので、コメント投稿欄にスマイリー一覧を表示させないで
Custom Smilies 自体は有効にしたまま様子を見ようと思う。
今 Custom Smilies 2.8 beta を使っているし、
beta じゃなくて正式版になったらもしかして…とか。
淡い期待を抱きつつw
全体的に ヽ(  ̄д ̄;)ノ オテアゲー! っていうのが今回の結果。
もうね、、、ぜんっぜんわかんない!
ワードプレステーマって難しいね…il||li _| ̄|○ il||li
関連記事:
この記事は 2009年11月29日日曜日 の 6:36 AM に書きました。
この記事のフィードはRSS 2.0で購読できます。


![emo[エモ]がサービス終了するので魚拓を… emo2.gif](http://yuina.lovesickly.com/wp-content/cache/wp-kougabu/c1443bca488bb4598eec3735dd8a3c96.jpg)





![ブログ専用アフィリエイト-Adgger[アドガー]- アフィリエイト](http://www.adgger.jp/img/bnr/bnr_adgger05.gif)
![完全成果報酬型SEO対策-WEB CREATION[ウェブクリエーション]- SEO対策](http://www.adgger.jp/img/bnr/bnr_vveb02.gif)




11月 29th, 2009 on 9:39 AM
(#^.^#)/おはようございます♪
とっても頑張ったね~☆
どれも凄く奥が深そうな問題ばかりで
記事を読んでいても自分はよく分からなかったよw
ホントややこしいね^^;
> 3.IE6でセキュリティ上の問題の可能性とか言われる。
については自分は
ちょっと確認してあげられないけど
実は、「このWebサイトにはセキュリティ上の問題があります」の同様な表示は
私の知るところでは以前より出ていました。
それはWiiで唯奈の病的溺愛シンドロームを見るときなんだけど
前のテーマの時での話しなので今回はニュアンスは変わりそう!
そしてWiiのブラウザはOperaなので
私のパソのやDSiのOperaではセキュリティの問題を
指摘して来ず問題なく閲覧出来ていたので
自分自身深く考えていなかったし
機器の仕様というか構成面での問題では?と
考えていたんだけど・・・
11月 29th, 2009 on 11:39 PM
>おいちさん
(*^-^*)/こんばんは~♪
あたしにもさっぱり分からないんですぅ^^;
ウィジェットが増えたくらいでこんなに苦労するとは思ってなかったんですよねぇ。
今までテーマ変更はたくさんやってきたので。
泣ける…orz
ぇ。セキュリティ上の問題って前から出てたんですか@@;
うーん…うーん…Operaのバージョンにもよるのかもしれないですね。
よく分からないですけど。
前から出ていたとするとやはり何か広告とかパーツとかが悪さしてる可能性が高いですね。
一番(;¬д¬) アヤシイのがflo:qかしら。(←何故か目の敵にしているようだw)
自分で確認できないのでどうやってテストしようかしら。。。
別PCのIE7でこのブログを開こうとしたら恐ろしく重かったので、
何か競合がありそうな気はするので、とりあえずパーツをしらみつぶしに…頑張りますw
11月 29th, 2009 on 11:20 AM
IE6で確認してみましたよ。
セキュリティ警告表示は以前のまま表示されます。
ブラウザーバージョンアップの表示タイミングでセキュリティ警告が出るので、画像もしくは、ブラウザーのチェックしているライブラリー内でSSLサイト関係が存在するのかも。
また、セキュリティ警告後、「続行」をクリックするとブラウザーがそのまま固まります。
あと、ブラウザーバージョンアップの表示が以前のレイアウトより数秒遅く表示されるようになっています。
ちなみに、Pen4メモリー1G積んでいるwin2000で確認したので、メモリー不足は考えにくいです。
javascript系で悪さをしているものがあるのかも。
以上、ご参考になればと思います。
参考になるかどうかわかりませんが、
pittaの大きいサイズのものを私も以前自分のブログに張ってみましたが、呼出し後のサイズ定義(pitta側のスクリプト)がおかしいのか、うまくサイズを収められなくて諦めたことがあります。どうも広告のサイズより大きいサイズを指定しているっぽい。
意外に広告のjavascriptっておかしなことをやっていることが多いです。
11月 29th, 2009 on 11:42 PM
>AquaSunネットサービスブログさん
動作確認ありがとうございますm(_ _”m)ペコリ
警告が出るだけならまだしも、固まるとなると大問題ですね;
以前のレイアウトよりファイルサイズは小さくなってるんですけど
透過pngをサポートしてないIE6での表示は何かと問題があるのかもしれません。
IE6用にcss作ればいいんでしょうけど………
うっ…気が重い…orz
pittaの大きいサイズでサイズ定義の問題ですか。
なるほど。
flashの広告の方は怪しいと思ってましたけど、バナー広告に問題があるとは思いませんでした。
そういうこともあるんですねぇ。
原因を突き止めるまで時間がかかりそうです><。
貴重な情報ありがとうございます!
11月 29th, 2009 on 4:33 PM
何もお役に立てないのですが、IETesterのIE6で確認しましたがエラーを1つ吐くだけで正常に見ることが出来ます。
ただスマイリーは表示されません・・( ̄  ̄;)
実は私も表示出来ない部分がたくさんあってネット検索の毎日です。
さしあたっては、アバターが表示されない。
表示されるテーマはあるんですけど、現在のテーマが出来なくて困ってます。
11月 29th, 2009 on 11:45 PM
>綾波さん
あれ。IETester動きました?
もしやあたしのマシンスペックが低すぎるのか…orz
パーツをごにょごにょやりながらリトライしてみます。
あ、スマイリーの入力欄は今表示させてません。
動かないので^^;
アバターの表示ですか。
うーん。
テーマが違うだけで動かなくなる場所っていろいろあるんですね。
難しいっすね><;
11月 30th, 2009 on 2:42 AM
ネット関連の事については分かりませんが、プログラミングでアセンブラレベルだと、スタックというのはレジスタの内容を一時的に積んでおく「棚」のようなものでして,
PUSH [レジスタ1]
PUSH [レジスタ2]
・
・
・
POP [レジスタ2]
POP [レジスタ1]
と、対で使う物です。
ちなみにサブルーチンコールの際にも、呼び出し元のアドレスをスタックに積むので、RETURNで戻らないとスタックに積みっぱなしのアドレスが残り、これを繰り返すとスタックがオーバーフローおこす事になります。
あまり参考にはならないと思いますが、一応参考まで。
11月 30th, 2009 on 7:38 PM
>cyahさん
一緒に考えて下さってありがとうございますm(_ _”m)ペコリ
すみません、、、全く分かりません…orz
returnで戻らないとっていうのは、endifで終わらせないとって感じですかね。
うーんうーん…。
閉じ忘れはなさそうなんだけど…。
スタックオーバーフローは消えたんですけど、IE7以前で固まるのは直せないでいるんですよね。
困ったなぁ><;
11月 30th, 2009 on 6:41 AM
(#^.^#)/おはよう♪

どうやらスマイリーは復活したね
ヨカッタ、ヨカッタ~
これで、ちょっとは・・・
11月 30th, 2009 on 7:39 PM
>おいちさん
(*^-^*)/こんばんは~♪
はい^^
スマイリーは復活できました。
すっごく初歩的なミスでした…orz
IE7以前で固まるという大問題が残ったままですが、これは根が深そうです;;
11月 30th, 2009 on 7:52 AM
念のため、別所でブラウザ変更しての
スマイリーの投稿試験だよw
問題なし!
これで、この問題については安心だね
11月 30th, 2009 on 7:40 PM
>おいちさん
違うブラウザでのテストありがとうございますm(_ _”m)ペコリ
スマイリーの方は大丈夫そうですね^^
お騒がせしましたm(_ _”m)ペコリ