Head Cleaner (仮)

WordPress にプラグインをガンガンと突っ込んでいくと <head> 部に、JavaScript やら CSS やらが、ドンドン追加されて、カオスなことになってしまいます。
そんな状態の自サイトを「YSlow for Firebug」で診断してみると、とても低いスコアになったりしてガックリ来るわけです。
プラグインを外したりしたくなかったりするので、チマチマと修正したりして使っていたんですが、プラグインのバージョンアップのたびに修正するのも面倒です。

そんな折、「WordPress Head Cleaner」というプラグインを見かけました。
これは、ひょっとして <head> 部を自動でキレイにしてくれるのか?と期待してダウンロードしてみたんですが、ソースを見てガッカリ。
ついカッとなって、こんなプラグインを作ってしまいました。

ダウンロード

Head Cleaner@WordPress Plugins
または
Head Cleaner (最適化&高速化)@JSeries

[2/24 6:00 追記] コメント蘭での、ゆりこさんからの指摘により、 Safari では拡張子が .gz の css, JavaScript を認識できないことが判明。
多分 「.gz」の Content-Type が 「text/javascript」 or 「text/css」 になっていないからだと思われます。
Ver.0.3.2 以降で、Safari に対しては gzip 圧縮されたファイルを転送しないように修正しました。
なお IE, Firefox, Opera, Chrome では、問題無いようです。

[2/25 8:00 追記]Ver. 0.4.0 から CSS もすべて結合することができるようになりました。
# ただし、デフォルトでは OFF になっています。
CSS 内の画像ファイル等への相対パスはすべて絶対パスに置き換えます。
制限事項としては、media 属性を気にせずにすべて結合し、media="screen" にしてしまうため、想定外の表示になる可能性もあります。
この辺は、後々修正します。

[2/26 12:30 追記]Ver. 0.5.x から、CSS と JavaScript をそれぞれ CSSTidyjsmin-php で圧縮できるオプションを付けました。
また、コメント欄でのゆりこさんからの指摘により、ユーザエージェントに「AppleWebKit」を含むブラウザ(ただし chrome は除く)からのリクエストがあった場合は .gz ファイルを転送しないように修正しました。
あと、簡単な注意書きを書いた「readme_ja.txt」を同梱したので、読んでやってください。

[3/4 18:30 追記]正式版のリリース準備版を公開しました。
今まで、php ファイルを直接修正していた各種設定は、管理画面の「設定」>「Head Cleaner」から行えます。
また、競合が報告されているプラグインと、その対処法について「readme_ja.txt」に書いてあります。
そちらも、ご一読ください。

[3/5 23:00 追記]正式版リリースしました。

概要

<head> の中身を整形しなおします。

  • IE6 以外の時は先頭に xml 宣言を付与。
  • 重複タグや、不要なタグ、コメント、空白を削除。
  • <meta name="description" /> タグが複数ある場合、一つにまとめる
  • <meta name="keyword" /> タグが複数ある場合、一つにまとめる
  • 話題の <link rel="canonical" /> タグを追加。
  • IE コンディショナルタグを判定して、ブラウザが IE の時だけ対象タグを表示。
  • CSS, JavaScript は、ブラウザが対応していれば gzip 圧縮転送。
  • 複数ある CSS を media 属性ごとに結合して一ファイルにまとめる。
    もちろん、そのファイルには インライン CSS も含まれる。
  • CSSTidy を使用して CSS を最適化する。
  • CSSTidy の最適化オプションを管理画面で指定できる。
  • 複数ある JavaScript をすべて結合して一ファイルにまとめる。
    もちろん、そのファイルには インライン JavaScript も含まれる。
  • JSMin で、JavaScript のソースコードを圧縮する。
  • JavaScript をフッタ領域に移動することもできる。
  • フッタ領域の JavaScript も同様に結合して一ファイルにまとめる。
  • Prototype.js, jQuery, mootools が複数読み込まれている場合、1回だけ読み込むようにする。
  • Prototype.js, jQuery, mootools の読み込み順を修正して、できるだけコンフリクトが発生しないようにする。

※制限事項
・SimpleXML でパースしていますので PHP 5 以降が必須になります。
 また <head> 部が、XML的に正しくないとパース出来ないので、このプラグインは動作しません。

→ Ver. 0.3.0 で、PHP Simple HTML DOM Parser でパースするようにしたため、わりかしルーズな (X)HTML でも通ると思います。
 PHP Simple HTML DOM Parser の制限上、PHP 5 以降必須です。

適用例

どうなるかは、ビフォー・アフタを見てもらえばわかりやすいかな?

適用前

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>独断と偏見の何でもレビュー</title>
<meta name="description" content="暇人による、暇人の為の何でもレビューもしくは日常メモ。since Feb. 27, 2005" />
<link rel="stylesheet" href="https://dogmap.jp/wp-content/themes/dogmap/style.css?ver=20081006" type="text/css" media="screen" />
<link rel="shortcut icon" type="image/x-icon" href="https://dogmap.jp/favicon.ico" />
<link rel="icon" type="image/x-icon" href="https://dogmap.jp/favicon.ico" />
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="https://dogmap.jp/feed/" />
<link rel="alternate" type="application/atom+xml" title="Atom" href="https://dogmap.jp/feed/atom/" />
<link rel="alternate" type="application/rss+xml" title="ROR" href="https://dogmap.jp/sitemap.xml" />
<link rel="index" href="https://dogmap.jp/" />

<link rel="start" href="https://dogmap.jp/" title="Home" />
<link rel="appendix" href="https://dogmap.jp/about/" title="About" />
<link rel="pingback" href="https://dogmap.jp/xmlrpc.php" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://dogmap.jp/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://dogmap.jp/wp-includes/wlwmanifest.xml" /> 
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js'></script>
<script type='text/javascript' src='http://www.google.com/jsapi?key=ABQIAAAAdkdXbSzAaW3Z-fZ0VLiA-BTNLsTCkgAHG6R1rGrc2jhIZmfrTxQ-ueNTQFYw3AGOgb5OImln4sk1QA'></script>
<script type='text/javascript' src='https://dogmap.jp/wp-content/plugins/wp-autopager/js/wp-autopager-0.5.1.min.js?ver=0.5.1'></script>
<script type='text/javascript' src='https://dogmap.jp/wp-content/plugins/wp-lightpop/js/jquery.lightpop-0.7.5.min.js?ver=0.7.5'></script>
<script type='text/javascript' src='https://dogmap.jp/wp-includes/js/jquery/jquery.cookie.js?ver=1.0'></script>
<meta name="generator" content="WordPress 2.7.1" />

<style type="text/css" media="screen,tv,print,handheld"> /*<!&#91;CDATA&#91; */
div.googlemaps{width:300px;height:150px;clear:both;margin:1em auto;border:1px solid #999;line-height:1.25em;text-align:center;overflow:hidden;}
div.googlemaps img {margin:0;padding:0;border:0 none;max-width:none;max-height:none;}
div.googlemaps .infowindow {text-align:left;font-size:0.88em;}
div.googlemaps p {margin:0;text-indent:0;text-align:left;font-size:0.75em;}
/* &#93;&#93;>*/ </style>
<link rel="alternate" media="handheld" type="text/html" href="https://dogmap.jp/" />
<link href="https://dogmap.jp/wp-content/plugins/syntax-highlighter/css/shCore.css?ver=2.0.287" type="text/css" rel="stylesheet" />
<link href="https://dogmap.jp/wp-content/plugins/syntax-highlighter/css/shThemeDefault.css?ver=2.0.287" type="text/css" rel="stylesheet" />

<meta name="robots" content="index,follow" />

<style type="text/css">/*<!&#91;CDATA&#91; */
#content {width: 97.5%;display: block;}
#r_sidebar {width: 17.5%; display: none;}
/*&#93;&#93;>*/</style>

<script type="text/javascript">/*<!&#91;CDATA&#91; */
var addLoadEvent = function(func){ if(typeof jQuery!='undefined'){jQuery(document).ready(func);} else if(typeof google.setOnLoadCallback!='undefined'){google.setOnLoadCallback(func);} else if(typeof wpOnload!='function'){wpOnload=func;} else {var oldonload=wpOnload; wpOnload=function(){oldonload();func();}}};
/* &#93;&#93;>*/</script>
<script type="text/javascript">/* <!&#91;CDATA&#91; */
var googlemapsAnywhereL10n = { language:"ja",markerTitle:"Googleマップに移動",cssPath:"div.googlemaps",errMsgNoData:"エラー: ストリートビューのデータが見つかりません。",errMsgNoFlash:"エラー: お使いのブラウザは Flash に対応していないようです。",errMsgUnknown:"エラー: 不明なエラーです。"};
var lightpop={options:{ imageLoading:'/wp-content/plugins/wp-lightpop/images/lightpop-ico-loading.gif',imageBtnPrev:'/wp-content/plugins/wp-lightpop/images/lightpop-btn-prev.gif',imageBtnNext:'/wp-content/plugins/wp-lightpop/images/lightpop-btn-next.gif',imageBtnClose:'/wp-content/plugins/wp-lightpop/images/lightpop-btn-close.gif',imageBlank:'/wp-content/plugins/wp-lightpop/images/lightpop-blank.gif',flvplayer:'/wp-content/plugins/wp-lightpop/swf/mediaplayer.swf',contentFrameType:'border',overlayBgColor:'#FFF',contentBorder:'1px solid silver',setLinkToTitle:true,Image:{enabled:true,icon:'https://dogmap.jp/wp-content/plugins/wp-lightpop/images/icon-image.png',size:new Array(640,480)},Video:{enabled:true,icon:'https://dogmap.jp/wp-content/plugins/wp-lightpop/images/icon-video.png'},Contents:{enabled:true,icon:'https://dogmap.jp/wp-content/plugins/wp-lightpop/images/icon-contents.png',iframeEnabled:false},YouTube:{enabled:true,icon:'https://dogmap.jp/wp-content/plugins/wp-lightpop/images/icon-youtube.png',param:{'hl':'ja','autoplay':'1','fmt':'18'}},Metacafe:{enabled:false},LiveLeak:{enabled:false},GoogleVideo:{enabled:false},ifilm:{enabled:false},Dailymotion:{enabled:false},superdeluxe:{enabled:false},nicovideo:{enabled:false}},start:function(){}};
/* &#93;&#93;> */</script>

</head>

適用後

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta name="description" content="暇人による、暇人の為の何でもレビューもしくは日常メモ。since Feb. 27, 2005" />
<meta name="generator" content="WordPress 2.7.1" />
<meta name="robots" content="index,follow" />
<title>独断と偏見の何でもレビュー</title>
<link rel="shortcut icon" type="image/x-icon" href="https://dogmap.jp/favicon.ico" />
<link rel="icon" type="image/x-icon" href="https://dogmap.jp/favicon.ico" />
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="https://dogmap.jp/feed/" />
<link rel="alternate" type="application/atom+xml" title="Atom" href="https://dogmap.jp/feed/atom/" />
<link rel="alternate" type="application/rss+xml" title="ROR" href="https://dogmap.jp/sitemap.xml" />
<link rel="index" href="https://dogmap.jp/" />
<link rel="start" href="https://dogmap.jp/" title="Home" />
<link rel="appendix" href="https://dogmap.jp/about/" title="About" />
<link rel="pingback" href="https://dogmap.jp/xmlrpc.php" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://dogmap.jp/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://dogmap.jp/wp-includes/wlwmanifest.xml" />
<link rel="alternate" media="handheld" type="text/html" href="https://dogmap.jp/" />
<link rel="canonical" href="https://dogmap.jp/" />
<link rel="stylesheet" type="text/css" href="https://dogmap.jp/wp-content/cache/head-cleaner/css/e938e5ff38c9d1b871d3ef8006dcbfd4.css" media="screen" />
<script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAAdkdXbSzAaW3Z-fZ0VLiA-BTNLsTCkgAHG6R1rGrc2jhIZmfrTxQ-ueNTQFYw3AGOgb5OImln4sk1QA"></script>
<script type="text/javascript" src="https://dogmap.jp/wp-content/cache/head-cleaner/js/c2046402dd21ec3000596d55d75cc257.js"></script>
</head>

何ということでしょう!あんなに汚らしかった HTML コードが、こんなにもスッキリと!
しかも YSlow の結果も、適用前の F(53)と比べると、適用後は D(60)に改善されてます。

今後の予定

あとは指定タグを取り除く機能とか、xml 的に残念なソースでもそれなりにパースする機能とか、重複 JavaScript の削除機能とか付けたいですね。

あと、プラグインの名前も。
JSeries に既に「光画部」があるので、「営繕マン」とか良いかなと思いました。
「島崎くんはイルカの曲芸」です。(謎)

Head Cleaner (仮)」への84件のフィードバック

  1. MSTYL

    をかもとさま

    さっそくのご回答、ありがとうございます。
    ご指摘のとおり、jquery-1.3.2.min.jsがフォルダ内に残っていました。
    以前バージョンアップした時に、上書き?でアップロードしていたのかもしれません…
    一旦すべてを削除してアップロードしなおしたところ、どちらも問題なく動作するようになり、スッキリ解決いたしました。
    大変お手数をおかけしました。

    WP-lightpop & Head Cleanerともに、活用させていただいてます。
    ありがとうございました。

    返信
  2. MSTYL

    サイト表示が重くて困っていたのですが、導入させていただいたところ、素晴らしい効果のあるプラグインです。

    プラグイン「WP-lightpop 0.7.5」と同時に使用したところ、Head Cleanerは問題なく動作するのですが、WP-lightpopが動作しなくなりました(ポップアップしなくなりました)。
    IEの表示では「エラー:’lightpop’は宣言されていません。」と出ます。

    WP-lightpopを停止すると、エラーは解消されるようです。
    また、Head Cleanerを停止すると、WP-lightpopは元通り動作します(firefox,chromeなどでも同様です)。

    Head Cleaner設定画面で「有効なフィルタ → LightPopController::addHead → 対象外にチェック」してみましたが、変化ありませんでした(対処方法がまちがっているのかもしれませんが…)。
    ぜひともHead Cleanerを使用させていただきたいと思っていますので、設定等ありましたら、ご回答いただけると助かります。

    使用環境は↓になります。
    WordPressバージョン 2.7.1
    MySQL 5.1.22-rc

    返信
    1. をかもと 投稿作成者

      MSTYL さん、はじめまして。

      Head Cleaner, wp-lightpop 共に私の作成したプラグインですが、私が作成したプラグイン用共通ライブラリ common-controller.php を含んでいます。
      たぶん、これのバージョンが違うことから発生しているのではないかと思われます。

      Head Cleaner 1.1.5, wp-lightpop 0.7.5 にバージョンアップ後、もしプラグインフォルダの includes/js サブフォルダ内に jquery-1.3.1.min.js (or jquery-1.3.2.min.js) が含まれていたら削除してみてください。
      これで直るかも。

      返信
  3. tsu

    はじめまして 😀 tsuです。

    Head Cleaner 1.1.4にアップグレードしてから、ヘッダーのjavascriptが丸々全て出力されなくなりました。

    アップグレード直前にテーマも変えたのですが、これが原因でしょうか。

    何か解決策があれば、よろしくお願いします。

    あと基本的な質問ですが、ヘッダーにあるjavascriptは設定画面の「 部で有効な JavaScript」に表示されるんですよね?

    返信
    1. tsu

      すみません、解決しました。

      フッターにwp_footer()を加えてないという初歩的なものでした。どうもすみませんでした。

      あと、自分の場合はFlickr Managerと一緒に使ったら、一部のjavascriptが動かなくなりました。だから、Flickr Managerははずしました。

      返信
      1. をかもと 投稿作成者

        tsu さん、はじめまして。

        解決されたようで、良かったです。
        Flickr Manager の JavaScript の件は、こちらでも時間のあるときに調べてみますね。
        # ただし、調べられないかもしれないので、期待しないでいてください。

        返信
  4. CHICK

    はじめまして。

    head内の乱雑さには甚だまいっていたのでこちらのプラグインを導入させていただいたのですが、
    私のサイトでは以下のような不具合が生じました。

    サイト最上部に「Object」という文字列が(数個)表示されその分サイトのデザインもずれる。
    (head内のhtmlソースをのぞいたところlink rel=”canonical”タグの上にObjectが挿入されている)

    プラグインをすべて外してみたのですがObjectの文字は消えませんでした。
    そこで、エラーログを調べてみたところ、
    head-cleaner.phpの727行(Is JavaScript)と918行(Read file)でエラーが出ていました。
    以下のファイルを開けないようです。

    略/head-cleaner.php?f=37ebe5b4dac287b81441abf23fefd5b8&amp;t=js

    上記では見えませんが文字参照のところでamp;amp;とダブっています。
    使っているJavaScriptが原因なのでしょうか?
    対処方法などお気付きの点がございましたらアドバイスしていただけると幸いです。
    よろしくお願いいたします。

    返信
    1. をかもと 投稿作成者

      CHICK さん、はじめまして。

      サイト最上部に「Object」という文字列が(数個)表示されその分サイトのデザインもずれる。
      プラグインをすべて外してみたのですがObjectの文字は消えませんでした。

      うーん、プラグインをすべて停止してもダメですか。
      とすると、お使いのテーマと相性が悪いのも、テーマをデフォルトに変更しても「Object」が出るか、ご確認ください。
      出ないようであれば、テーマとの相性問題です。
      ご使用のテーマ名と、配布先をご連絡ください。ちょっと時間がかかるかもしれませんが確認してみます。

      また、差し支えなければ、実際に運用されているサイトのURLを教えていただけると確認作業がはかどります。
      コメント欄では差し支えがあるようでしたら、コンタクトフォーム ( https://dogmap.jp/contact/ ) から連絡いただければ、私宛にメールが届きます。

      返信
      1. とりさん

        headcleanerをありがたく使わせていただいています。
        また、をかもと様のコードを大変参考にしています。

        WebArena SuiteXにて、上記「サイト最上部に「Object」という文字列が(数個)表示されその分サイトのデザインもずれる。」という現象が出たので報告します。
        WebArena上では違うテーマに切り替えても出現し、他の環境では全く出ていません。

        963行目の以下の行を
        $tag = trim($element);

        下記のように修正したら直りました。
        $tag = trim($element->outertext);

        以上、報告を終わります。

        再現条件の詳しい報告が出来ず申し訳ありませんがよろしくお願いします。

        返信
        1. をかもと 投稿作成者

          とりさん、どもです。
          ご指摘ありがとうございます。

          修正した Ver.1.3.1 をリリースしましたので、バージョンアップしてください。

          返信
  5. をかもと 投稿作成者

    XTORT さん、はじめまして。

    IEのコンディショナルコメントなんですが、[lt],[lte],[gt],[gte]といった表記に対応していない気がします。

    すいません、すいません。そのとおりです。
    修正します。

    返信
  6. XTORT

    初めまして、XTORTと申します。

    IEのコンディショナルコメントなんですが、[lt],[lte],[gt],[gte]といった表記に対応していない気がします。

    私の検証不足かな?とも思ったんですが、正規表現に含まれていない感じです。

    ご報告まで。

    返信
  7. xscale

    xscaleです。

    head-cleaner-1.0.0-RC3に更新した後、コードを対象外に設定したところ、正常にコードが挿入されるようになりました。
    ありがとうございました。

    返信
  8. をかもと 投稿作成者

    xscale さん、どもです。

    さきほど、公開した head-cleaner-1.0.0-RC3 で、Ultimate Google Analytics でのエラーを回避可能になりました。
    # Ultimate Google Analytics の書き出すコードを Head Cleaner での整形対象外にすることが可能。

    設定方法は、同梱の readme_ja.txt をお読みください。

    返信
  9. J君

    J君です。
    ありがとうございます。
    head-cleaner最新バージョンにてバッチリ動作するようになりました。
    助かりました。

    返信
  10. をかもと 投稿作成者

    J君、どもです。

    wp-prettyphoto プラグインのソースを見ました。
    これは、このプラグインが吐き出している JavaScript が原因ですね。
    # 具体的には wp-prettyphoto.php の 156〜166 行目。

    以下に動作するように修正した wp-prettyphoto.php を置いておきますので、入れ替えてください。
    http://dl.getdropbox.com/u/110305/wp-prettyphoto.php

    返信
  11. をかもと 投稿作成者

    xscale さん、はじめまして。情報ありがとうございます。
    できれば、プラグインの配布元 url と、利用されているバージョンも報告していただけると助かります。

    現在、準備中の正式リリース版では、特定のフィルタを指定して整形対象外にできるようにしています。
    そのオプションを適切に指定して、該当するプラグインが導入するコードを整形対象外にすることで対応できると思います。

    返信
  12. xscale

    初めまして、blog.tvyweb.netの管理人のxscaleと申します。
    競合するプラグインが見つかりましたので報告させていただきます。

    競合するプラグインはUltimate Google Analyticsです。
    Head Cleaner(仮)導入後コードが挿入されなくなります。

    返信
  13. ピンバック: だい亜りー

  14. ajin

    ああなるほど、その方法がありましたか。すっかり盲点でした。
    jQueryのDOM構築後に呼び出されるreadyのfunctionでくるんでしまったほうが、一応sslなどで分岐できるのでスマートかもしれませんね。

    確かに、この状態だと結合してしまうと必ずエラーが出ますね。

    やはりそちらでも同じ結果になりましたか。一見違いがなさそうに見えるので少々不安だったのですが、少し安心しました。
    配慮していただけるとのことで、かなりホッとしています。ありがとうございました。

    返信
  15. をかもと 投稿作成者

    ajin さん、どもです。

    確かに、この状態だと結合してしまうと必ずエラーが出ますね。
    この辺に配慮して、なんとかするオプションをつける必要がありますね。

    ちなみに、私も Google Analytics を使っているのですが、_gat を jQuery を使用して DOM 構成後に呼び出すように書いているため、発覚しませんでした。

    <script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    jQuery(function(){var pageTracker = _gat._getTracker("UA-xxxx-xx");
    pageTracker._initData();
    pageTracker._trackPageview();
    });
    </script> 
    返信
  16. ajin

    まとめのほうで取り上げて頂いていたようで、ありがとうございました。
    非常に細かいことではありますが、あれから一つ気づいたことがあったのでお知らせしておきます。

    環境によって、一部Google Analyticsのga.jsを使うトラッキングコードが正しく動作しないことがあるようです。
    以下圧縮前のコード例。

    <script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    </script>
    <script type="text/javascript">
    var pageTracker = _gat._getTracker("UA-xxxx-xx");
    pageTracker._initData();
    pageTracker._trackPageview();
    </script>


    僕のサイトではプラグインでトラッキングコードを管理しているためwp_footer()に当該コードが含まれることになるのですが、これが圧縮されるとdocument.writeでスクリプトタグを書き出してから読み込みが完了するまでにタイムラグがあるのか、_gat.〜がga.js読み込み前に動作してしまいjavascriptエラーが出てしまいます。で、実際エラーが出ていた間はトラッキング出来ていないようでした。
    wordpress構築サイトで通常SSLが絡むページをトラッキングすることはないと思われますので、そのままスクリプトタグに記述することで解決出来ましたがやはりトラッキングコードはそのまま圧縮後のファイルに含めるよりもページに直接書き出されていたほうがスマートな気がします。

    そこで、可能であればGoogle Analyticsのトラッキングコードに限って圧縮と書き出しを回避するか、整形したくないコードを何かの文字列で囲むことによって整形を回避できる(整列のみ動作する)仕組みがあると嬉しいです。

    あくまで小さな要望ではありますが、頭の隅にでも気にかけて頂ければ幸いです 😮

    返信
  17. ピンバック: blog.tvyweb.net

  18. をかもと 投稿作成者

    ajin さん、どもです。

    したがって、正しくはをかもとさんとJ君さんが前述されたとおり「All in One SEO Pack」単体では「コンフリクトしない」でした。
    あまり多い環境ではないと思いますので参考にはならないかもしれませんが、こういう事例がありましたという報告にて締めさせて頂きたいと思います。お騒がせして申し訳ありませんでした。

    解決したようで何ヨリです。
    まだまだ、不具合等あると思いますので、何かあったらドシドシお知らせください。
    あと、このプラグインは CSS, JavaScript を結合していますが、それにより他のプラグインで挿入された JavaScript が正常に動作しなくなる可能性もあります。
    その辺も何かお気づきの点があれば、一方頂けると助かります。

    返信
  19. をかもと 投稿作成者

    ゆりこさん、どもです。

    たぶん、wokController のクラス変数を直接呼ぶというのが楽だと思います。wokController で WordPress のバージョン差異を吸収する処理をしているわけですから、ここに WP_CONTENT_DIR, WP_PLUGINS_URL とかと同等の内容を入れておき (すでに入っている気が……)、プラグイン内部ではこの値を使うのが素直な気がします。

    そう、すでに入っているのです。
    wokController は、私のプラグインで共通的に使っているモノをまとめた共通クラスなんですが、Head Cleaner 作成当初は、これを元にしてませんでした。
    ある程度、大きな規模になってきたので 0.5.x から、wokController を継承元にすることにしたんですが、ダブっている所も多々あり。
    ソースのクリーンアップをしなきゃだなぁ。

    返信
  20. ajin

    追記です。相変わらず理由はよく分からないのですが、症状を起こしていた原因が判明致しました。
    どうやら自前のテーマが悪さをしていたようです。お騒がせして申し訳ありませんでした。

    「All in One SEO Pack」 と同時に動かして問題ないようなので、問題は別にあるかもしれません。

    結論から言いますと、この条件下でテーマ内でquery_posts();を用いて内部クエリを操作し、二つ目のループを作成していると問題が起きるみたいです。
    「All in One SEO Pack」タイトルの書き換えうんぬんは関係ありませんでした。また、「All in One SEO Pack」の件のチェックを外しますと正常に動作するので、その処理内で行われている動作と、2つ目のループ(もしくはクエリの操作)が組み合わさることによって何らかの形で問題が引き起こっているのだと思われます。

    したがって、正しくはをかもとさんとJ君さんが前述されたとおり「All in One SEO Pack」単体では「コンフリクトしない」でした。
    あまり多い環境ではないと思いますので参考にはならないかもしれませんが、こういう事例がありましたという報告にて締めさせて頂きたいと思います。お騒がせして申し訳ありませんでした。

    返信
  21. ゆりこ

    wp_content_dir() 辺りを使ったほうが良いんですよね。あとで、まとめて修正します。

    たぶん、wokController のクラス変数を直接呼ぶというのが楽だと思います。wokController で WordPress のバージョン差異を吸収する処理をしているわけですから、ここに WP_CONTENT_DIR, WP_PLUGINS_URL とかと同等の内容を入れておき (すでに入っている気が……)、プラグイン内部ではこの値を使うのが素直な気がします。

    wp_content_dir() とかは 2.6 以降でしか使えないので、プラグイン内部でこれを使おうとすると version_compare() だらけになって、あまり見通しがよくないですし。

    返信
  22. ajin

    検証頂き、有難う御座います。

    僕が使用しているバージョンも両者とも同じです。そちらでは問題なく動作したとのことでこちらでももう一度検証してみた結果、どうやらTOPページだけ白紙になっていたことが判明致しました。
    投稿記事、ページ、カテゴリー、タグ、アーカイブ、つまりタイトルの書き換えの発生しているページでのみ正しく動作していることになります。

    ということは何故か書き換えの発生しないTOPページで相性問題が発生していることになるのですが……うーん、謎ですねぇ。
    その条件に限って他のプラグインが悪さをしているのかもしれません、もしくはob_end_flush()が適正数コールされてない?

    ちなみに件のオプションのチェックを外すとTOPページも正常に動作します。
    取り急ぎ報告まで。

    返信
  23. をかもと 投稿作成者

    ajin さん、どもです。

    私もテスト環境で 「All in One SEO Pack」 を導入して試してみたんですが、件のオプションをチェックしても問題なく動作しました。
    ちなみに、私がテストに使用した「All in One SEO Pack」のバージョンは 1.4.7、WordPress は 2.7.1 です。

    J君の所でも 「All in One SEO Pack」 と同時に動かして問題ないようなので、問題は別にあるかもしれません。

    返信

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください