病的溺愛シンドローム > WordPress > テーマ > 何も分からなかったことが分かった(WPテーマ)

何も分からなかったことが分かった(WPテーマ)

Posted on 2009年11月29日 | 6 Comments| Clip to Evernote

WordPress テーマを新しくしたのはいいんだけど
いろいろと困った問題が出てきた。

  1. IEで表示したときに Stack overflow が出る。
  2. Custom Smilies が動かなくなる。
  3. IE6でセキュリティ上の問題の可能性とか言われる。

これらの問題の原因がテーマにあることだけは確かなんだけど
原因自体がなんなのかさっぱり分からない。
テーマの作り方を検索してみても情報がバラバラで
いろいろ試したんだけどやっぱりうまくいかない。
かなりお手上げ状態sad0119.gif
とりあえずソースを晒しながら考えてみる。
長いよ。そして解決してないよ…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つ呼び出すようにしてみる。
このときにコメントアウトを外したコードは以下。

[php]register_sidebar(array(
‘name’=>’sidebar_full’,
‘before_widget’ => ‘

  • ‘,
    ‘after_widget’ => ‘
  • ‘,
    ‘before_title’ => ‘

    ‘,
    ‘after_title’ => ‘

    ‘,
    ));
    register_sidebar(array(
    ‘name’=>’sidebar_left’,
    ‘before_widget’ => ‘

  • ‘,
    ‘after_widget’ => ‘
  • ‘,
    ‘before_title’ => ‘

    ‘,
    ‘after_title’ => ‘

    ‘,
    ));[/php]

    そして sidebar.php で一番上のウィジェットを呼び出すコードが以下。

    [php][/php]

    これだとサイドバーの幅の広いところと、2カラムになってる左側が有効になる。
    IEで確認しても Stack overflow は出ない。
    サイドバーのコードは間違ってないみたいで、
    ちゃんとウィジェットの中身は表示される。

    大丈夫そうなのでもう1つウィジェットを有効にしてみる。

    [php]register_sidebar(array(
    ‘name’=>’sidebar_full’,
    ‘before_widget’ => ‘

  • ‘,
    ‘after_widget’ => ‘
  • ‘,
    ‘before_title’ => ‘

    ‘,
    ‘after_title’ => ‘

    ‘,
    ));
    register_sidebar(array(
    ‘name’=>’sidebar_left’,
    ‘before_widget’ => ‘

  • ‘,
    ‘after_widget’ => ‘
  • ‘,
    ‘before_title’ => ‘

    ‘,
    ‘after_title’ => ‘

    ‘,
    ));
    register_sidebar(array(
    ‘name’=>’sidebar_right’,
    ‘before_widget’ => ‘

  • ‘,
    ‘after_widget’ => ‘
  • ‘,
    ‘before_title’ => ‘

    ‘,
    ‘after_title’ => ‘

    ‘,
    ));[/php]

    これでサイドバーの右側も表示されるようになる。
    ところがこの時点でIEで Stack overflow が出てしまう。
    検索して出てきたコードとなんか違うんだけど動いてるから合ってるぽい?
    register_sidebar を register_sidebarsにして、
    ()の中にサイドバーの数を入れて…っていう方法がヒットするけど
    それだと動かなかったし、多分こっちで合ってるはず。
    でもスタックオーバーフローなんだよねぇ…sad0012.gif

    この段階でかなり悩んで、検索で出てきたいろんな書き方を試したんだけど
    結局どの方法でも解決することができなかった。

    このままではどうしようもないので、テーマとプラグインの相性が悪いのかも
    っていう思考に方向転換して、負担をかけていそうなプラグインで外してもいいものを選ぶ。
    で、切り捨てたのが Collapsing Links というリンクを折りたたむプラグイン
    これは導入したときにも動いたり動かなかったりしてたプラグインだし、
    My Link Order で保存した並び順が反映されなくなっていたし、
    疑わしい+なくても諦められるってことで無効に。

    あ。Stack overflow 消えた( ゚Д゚)ポカーン

    これでめでたく Stack overflow at line:870 というエラーアラートは消えた。
    でもコメントのスマイリーは動かない。
    コメントでご報告頂いたIE6で
    「このページは、制御範囲外の情報にアクセスしています。セキュリティ上の問題がある可能性があります。続行しますか?」
    と出てくるというは再現できず確認できなかった。
    IETester (IEのいろんなバージョンで動作テストできるソフト)で開くと
    固まってそのまま落ちてしまう…orz
    ということは多分IE6では開くことすらできないんだろうashamed0006.gif

    ちなみにこのブログではフレームを使って他のドメインのサイトを開いていない。
    セキュリティ上の問題はないと思うので安心して続行して頂きたい。
    でも残念ながらIE6では表示できない透過pngを使っているので
    あまりにも酷いレイアウトになってしまう。
    できればFirefoxや最新のIEなどを使って見て頂きたい
    ということでのIE6で制御範囲外の情報に…っていうのは未確認&未修正のままとなってしまった。
    IE6ユーザーの皆さん、ごめんなさい(_ _(–;(_ _(–; ペコペコ

    で、結局このテーマの何かを修正できたのかってところに戻ると、
    実は1行も修正できなかった。
    ウィジェットを3つ以上利用すると巨大な一時メモリーが必要なのかもしれないし、
    このテーマには対応していないプラグインが動いていたのかもしれない。
    ともかく、のStack overflow は未解決ながら
    プラグインを無効にして出てこないようにした。

    の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が違うわけではない。

    使えないなら諦めて無効にしてしまえ…とも思ったのだけど
    これを無効にしてしまうと、今まで書いてくれたコメントからスマイリーが消えて
    sign0203.gifとかの画像が文字(コード)になってしまう。
    それはあんまりにも寂しいので、コメント投稿欄にスマイリー一覧を表示させないで
    Custom Smilies 自体は有効にしたまま様子を見ようと思う。
    今 Custom Smilies 2.8 beta を使っているし、
    beta じゃなくて正式版になったらもしかして…とか。
    淡い期待を抱きつつw

    全体的に ヽ(  ̄д ̄;)ノ オテアゲー!  っていうのが今回の結果。
    もうね、、、ぜんっぜんわかんない!
    ワードプレステーマって難しいね…il||li _| ̄|○ il||li


    この記事は 2009年11月29日日曜日 の 6:36 AM に書きました。 
    この記事のフィードはRSS 2.0で購読できます。

    « | »

    6 Comments for this entry

    • AquaSunネットサービスブログ

      IE6で確認してみましたよ。
      セキュリティ警告表示は以前のまま表示されます。
      ブラウザーバージョンアップの表示タイミングでセキュリティ警告が出るので、画像もしくは、ブラウザーのチェックしているライブラリー内でSSLサイト関係が存在するのかも。
      また、セキュリティ警告後、「続行」をクリックするとブラウザーがそのまま固まります。
      あと、ブラウザーバージョンアップの表示が以前のレイアウトより数秒遅く表示されるようになっています。

      ちなみに、Pen4メモリー1G積んでいるwin2000で確認したので、メモリー不足は考えにくいです。
      javascript系で悪さをしているものがあるのかも。

      以上、ご参考になればと思います。

      参考になるかどうかわかりませんが、
      pittaの大きいサイズのものを私も以前自分のブログに張ってみましたが、呼出し後のサイズ定義(pitta側のスクリプト)がおかしいのか、うまくサイズを収められなくて諦めたことがあります。どうも広告のサイズより大きいサイズを指定しているっぽい。
      意外に広告のjavascriptっておかしなことをやっていることが多いです。

      • 唯奈

        >AquaSunネットサービスブログさん
        動作確認ありがとうございますm(_ _”m)ペコリ
        警告が出るだけならまだしも、固まるとなると大問題ですね;
        以前のレイアウトよりファイルサイズは小さくなってるんですけど
        透過pngをサポートしてないIE6での表示は何かと問題があるのかもしれません。
        IE6用にcss作ればいいんでしょうけど………
        うっ…気が重い…orz

        pittaの大きいサイズでサイズ定義の問題ですか。
        なるほど。
        flashの広告の方は怪しいと思ってましたけど、バナー広告に問題があるとは思いませんでした。
        そういうこともあるんですねぇ。
        原因を突き止めるまで時間がかかりそうです><。
        貴重な情報ありがとうございます!

    • 綾波

      何もお役に立てないのですが、IETesterのIE6で確認しましたがエラーを1つ吐くだけで正常に見ることが出来ます。
      ただスマイリーは表示されません・・( ̄  ̄;)

      実は私も表示出来ない部分がたくさんあってネット検索の毎日です。
      さしあたっては、アバターが表示されない。
      表示されるテーマはあるんですけど、現在のテーマが出来なくて困ってます。

      • 唯奈

        >綾波さん
        あれ。IETester動きました?
        もしやあたしのマシンスペックが低すぎるのか…orz
        パーツをごにょごにょやりながらリトライしてみます。
        あ、スマイリーの入力欄は今表示させてません。
        動かないので^^;

        アバターの表示ですか。
        うーん。
        テーマが違うだけで動かなくなる場所っていろいろあるんですね。
        難しいっすね><;

    • cyah

      ネット関連の事については分かりませんが、プログラミングでアセンブラレベルだと、スタックというのはレジスタの内容を一時的に積んでおく「棚」のようなものでして,
      PUSH [レジスタ1]
      PUSH [レジスタ2]
         ・
         ・
         ・
      POP [レジスタ2]
      POP [レジスタ1]
      と、対で使う物です。
      ちなみにサブルーチンコールの際にも、呼び出し元のアドレスをスタックに積むので、RETURNで戻らないとスタックに積みっぱなしのアドレスが残り、これを繰り返すとスタックがオーバーフローおこす事になります。

      あまり参考にはならないと思いますが、一応参考まで。

      • 唯奈

        >cyahさん
        一緒に考えて下さってありがとうございますm(_ _”m)ペコリ
        すみません、、、全く分かりません…orz
        returnで戻らないとっていうのは、endifで終わらせないとって感じですかね。
        うーんうーん…。
        閉じ忘れはなさそうなんだけど…。
        スタックオーバーフローは消えたんですけど、IE7以前で固まるのは直せないでいるんですよね。
        困ったなぁ><;

    ADgger

    堅実に儲かるアフィリエイト