2010年4月17日 土曜日

Head Cleaner と ImageManager は相性に問題あり

カテゴリー: WordPress, プラグイン
タグ:, , , ,
時間:19時24分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

Googleがサイトの表示速度も評価対象に加えると言う発表をしたため(現時点では米国版のみ)、対応策として Head Cleaner を導入してみました。現時点ではほとんど影響はないとのことですが、やって置いて損はないし、表示が速くなるのはいいことです。

配布サイトに書いてある説明に従って導入したところ、AddClips のスクリプトが AddClipsId の設定をしていないとエラーを出すようになって、しかもページの表示が途中で止まってしまうようになってしまいました。ソースを確認してみると、ヘッダ部分の途中に出力されている JavaScript コードが加工され、記事部分まで文字列に含まれるようになっていました。

正常な状態

HTML:
  1. <script type="text/javascript">
  2.             //<![CDATA[
  3.            
  4.                 function basename (path) { return path.replace( /.*\//, "" ); }
  5.        
  6.                 var winimg=null;
  7.                 function ps_imagemanager_popup(imgurl,title,w,h) {
  8.                     lpos=(screen.width)?(screen.width-w)/2:100;
  9.                     tpos=(screen.height)?(screen.height-h)/2:100;
  10.                     settings='width='+w+',height='+h+',top='+tpos+',left='+lpos+',scrollbars=no,location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=yes';
  11.                     winimg=window.open('about:blank','imagemanagerpopup',settings);
  12.        
  13.                     var doc = '';
  14.                     doc += '<html><head>';
  15.                     doc += '<title>' + title + ' - ' + basename(imgurl) + '(' + w + 'x' + h +')</title>';
  16.                     doc += '<style type="text/css"><!-- body { margin:0px; padding:0px; } --></style>';
  17.                     doc += '</head>';
  18.                     doc += '<body onload="self.focus();">';
  19.                     doc += '<img style="cursor:pointer;" src="' + imgurl + '" title="' + title + '" onclick="self.close();"/>';
  20.                     doc += '</body></html>';
  21.                    
  22.                     winimg.document.writeln(doc);
  23.                     winimg.document.close();
  24.                 }   
  25.                
  26.             //]]>
  27.             </script>
  28.  
  29.     </head>

異常な状態

HTML:
  1. <script type="text/javascript">
  2.             //<![CDATA[
  3.            
  4.                 function basename (path) { return path.replace( /.*\//, "" ); }
  5.        
  6.                 var winimg=null;
  7.                 function ps_imagemanager_popup(imgurl,title,w,h) {
  8.                     lpos=(screen.width)?(screen.width-w)/2:100;
  9.                     tpos=(screen.height)?(screen.height-h)/2:100; settings="width="+w+',height='+h+',top='+tpos+',left='+lpos+',scrollbars=no,location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=yes';
  10.                     winimg=window.open('about:blank','imagemanagerpopup',settings);
  11.        
  12.                     var doc = '';
  13.                     doc += '
  14. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  15. <head>';
  16.                     doc += '
  17. <title>' + title + ' - ' + basename(imgurl) + '(' + w + 'x' + h +')</title>
  18. <link rel="canonical" href="http://blog.yoshitomo.org/" />
  19. <style type="text/css" media="all">/*<![CDATA[ */
  20. /***** inline CSS *****/
  21. <!-- body { margin:0px; padding:0px; } -->
  22. /* ]]>*/</style>
  23. </head>

この部分を出力しているのは、WordPress の画像アップ機能がまだいまいちだったころの定番であった ImageManager 2.5.3 です。サムネイルをクリックしたときにポップアップウィンドウを開くためのものだと思いますが、私の場合は同じウィンドウで開くようにしているので停止させることにしました。

ちなみに、Head Cleaner の効果はなかなかのようです。設定も特にまだ変えてませんが、速度の向上が体感できました。

コメント (0)

2010年4月3日 土曜日

AmazonLink 2.0.0 beta3 リリース

カテゴリー: AmazonLink
タグ:,
時間:17時39分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

AmazonLink 2.0.0 beta3 をリリースしました。

今回のリリースのメインは、コードを1行に表示した場合に1つめしか変換されなかったバグの修正です。自分の古い記事で偶然私が見つけたのとほぼ同時期に、テンプレート方式に移行した方が記事にしていたのに気がついたのと、Twitter で @boka_kabo さんから報告をいただきました。

そのほか、Powerd by のリンク先をカテゴリーページではなく専用の固定ページに変更しました。このことはすでに先月記事にしていますが、これはなんだろうと見に来てくれた方に概要を伝えるためのポータル的な役割を持たせています。

2010年4月10日追記

WordPressが認識する部分のバージョンが古いままでした。本日11時40分以降ダウンロードした場合は正しいファイルになっています。

訂正前のファイルでも動作には問題ありませんが、気になる方は「AmazonLink.php」の差し替えまたは書き換えを行ってください。書き換える場合は7行目を次のようにします。

PHP:
  1. <?php
  2. /*
  3. Plugin Name: AmazonLink
  4. Plugin URI: http://wppluginsj.sourceforge.jp/amazonlink/
  5. Description: Amazon.co.jp の商品情報を同一の設定で表示します。ブログのデザイン変更に簡単に対応できます。
  6. Author: よしとも
  7. Version: 2.0.0 beta3
  8. Author URI: http://blog.yoshitomo.org/
  9. */

コメント (6)

2010年3月22日 月曜日

AmazonLink の案内ページを作成

カテゴリー: AmazonLink
タグ:,
時間:22時02分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

AmazonLink の Powerd by 表示からのリンク先は現在記事カテゴリーになっていますが、これの変更先として固定ページを作りました。

ダウンロード案内ページは WordPress Plugins/JSeries、実際のダウンロードは SourceForge.jp、新しい情報の通知はこのサイトとばらばらになってしまっているので、ポータル的な案内ページの形に持って行きたいと思っています。

コメント (0)

2009年9月7日 月曜日

AmazonLink 2.0.0 beta2 リリース

カテゴリー: AmazonLink
タグ:,
時間:23時30分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

すでに昨夜の話になってしまいますが、AmazonLink 2.0.0 beta2 をリリースしました。ダウンロードは、いつものようにWordPress Plugins/JSeriesのサイトからどうぞ。

ページ投稿画面での検索フォーム追加や、AmazonLink コードの変更などをしています。また、アップグレードが進むとの予測から、急いで WordPress 2.8.4 での動作検証も行いました。2.8系は投稿画面の幅が狭くなっているため、ボタンなどのレイアウトも少し変えてあります。

AmazonLinkコードの変更ですが、商品ごとにテンプレートを変える機能を思いついたためです。テンプレートは複数行になる可能性が高いため、属性値とするには不向きです。そのため、コードに挟むことができるようにしました。

なお、内部で変換処理を行っているので、今までの形式も使用することはできます。

ASIN は Amazon Standard Item Number の略で、Amazon の商品コードです。

以前の形式
CODE:
  1. [amazon]ASIN[/amazon]

新しい形式
CODE:
  1. [amazon asin="ASIN"][/amazon]
  2. [amazon asin="ASIN" /]

現在は個別のテンプレートには対応できていませんが、TODOには入れておこうと思います。手を出しすぎると切りがないので、正式リリースまでは触らない予定です。

コメント (1)

2009年9月5日 土曜日

AmazonLink のテンプレート

カテゴリー: AmazonLink
タグ:, ,
時間:16時17分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

8月14日に公開となった AmazonLink 2.0.0 beta では、テンプレート機能によってある程度自由にデザインを作ることができるようになっています。

管理画面上の説明でどこまで伝わるのか自信がないので、現在このサイトで使用しているテンプレートを公開しようと思います。

CODE:
  1. <table class="amazonLink" width="468">
  2.     <tr>
  3.         <td colspan="2">
  4.             <strong><span class="itemName"><a href="[DETAIL_PAGE_URL]">[ITEM_NAME]</a></span>[IF_AUTHOR/] <span class="author">[AUTHOR]</span>[/IF_AUTHOR]</strong><br />
  5.             [IF_PUBLISHER/]発売:[PUBLISHER][IF_RELEASE_DATE/] [RELEASE_DATE][/IF_RELEASE_DATE] [/IF_PUBLISHER]
  6.             販売数ランク:[SALES_RANK]
  7.         </td>
  8.     </tr>
  9.     <tr>
  10.         <td rowspan="3" width="[MEDIUM_IMAGE_WIDTH]" valign="top">
  11.             <a href="[DETAIL_PAGE_URL]"><img src="[MEDIUM_IMAGE_URL]" width="[MEDIUM_IMAGE_WIDTH]" height="[MEDIUM_IMAGE_HEIGHT]" alt="『[ITEM_NAME]』の商品写真" /></a>
  12.         </td>
  13.         <td valign="top">
  14. [IF_CREATOR/]
  15.             <ul class="creator">
  16. [CREATOR/]        <li>[CREATOR_ROLE][CREATOR_NAME]</li>
  17. [/CREATOR]
  18.             </ul>
  19. [/IF_CREATOR]
  20.         </td>
  21.     </tr>
  22.         <td valign="top">
  23. [IF_REVIEW/]
  24. 平均評価:<img src="/wp-content/themes/custom01/images/evaluation_[AVERAGE_RATING].gif" width="59" height="11" alt="[AVERAGE_RATING]">
  25.             <ul class="evaluation">
  26. [REVIEW/]            <li><img src="/wp-content/themes/custom01/images/evaluation_[REVIEW_RATING].0.gif" width="59" height="11" alt="評価:[REVIEW_RATING]"> [REVIEW_SUMMARY]</li>
  27. [/REVIEW]
  28.             </ul>
  29. [/IF_REVIEW]
  30.         </td>
  31.     </tr>
  32.     <tr>
  33.         <td valign="bottom">
  34.             <span class="powerdBy">[POWERD_BY]</span>
  35.         </td>
  36.     </tr>
  37. </table>

テーブルの幅が固定であったりしますが、別のサイトにも流用可能かと思います。WordPress や プラグイン同様に GPL ライセンスとしますので、ご自由にお使いください。

コメント (1)

2009年8月14日 金曜日

AmazonLink 2.0.0 beta リリース

カテゴリー: AmazonLink, アフィリエイト
タグ:, ,
時間:18時33分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

JSeries サイトの更新はまだですが、先ほど AmazonLink 2.0.0 beta をリリースしました。
現在 SourceForge.JP の以下のアドレスからダウンロードができるようになっています。

http://sourceforge.jp/projects/wppluginsj/downloads/43119/AmazonLink-2.0.0beta.zip/

19時25分追記

Jseries サイトを更新しました。メジャーバージョンアップと言うことで、新規にページを作成してあります。
http://wppluginsj.sourceforge.jp/amazonlink2/

コメント (2)

2009年8月9日 日曜日

AmazonLink 2.0 beta もうすぐ・・・

カテゴリー: AmazonLink
タグ:, , , ,
時間:18時28分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

平日は忙しくてまったく時間はないわ、休日は平日できてないことをやってると終わってしまうわでほぼ停止状態でしたが、昨日と今日で AmazonLink を Amazon の Product Advertising API に対応させました。

ついでに WordPress 2.7 にも対応させたので、近いうちにベータ版として公開することができそうです。2.8 は未テストなので、対象外の予定です。

また、サイドバーでやってたアンケートの結果を元に、今回から動作環境条件として PHP 5.1 以上とします。これにより、Amazon とのやり取りの処理が PHP のネイティブ関数を使えるようになるので処理が早くできるはずです。PHP 4.x の環境しかない方はごめんなさい。

ベータ版として公開したあとの予定ですが、プログラムの整理と PHP 5.x らしい書き方への変更をしたいと思っています。一緒に WordPress 2.8 にも対応したいですね。

今後も使っていただけるという方は、Product Advertising API アカウントの取得をしておいてください。8月15日以降は、アカウントがないと投稿画面での検索ができなくなります。

コメント (0)

2009年5月31日 日曜日

PHPバージョンアンケート

カテゴリー: AmazonLink, プログラミング
タグ:,
時間:3時21分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録
Popularity: 12%
by Popularity Contest 日本語版

AmazonLink を Product Advertising API(旧 Amazon アソシエイト Web サービス)に対応させるに当たり、PHPのバージョンの傾向を知るためのアンケートを開始しました。アンケートはサイドバーにも掲載されます。

PHPは4.x がすでに公式に開発終了となっていますが、まだまだ生き残っています。5.x に移行するべきではありますが、サーバー側で対応していなければどうしようもありません。大手レンタルサーバーはすでにかなり対応していますが、4.x しか使えないところも残っているようです。

現時点でどれくらいのサーバーが移行できているのかを知ることが目的です。ご協力よろしくお願いします。

メインサーバーで使えるPHPのバージョンは?
View Results
コメント (0)

2009年5月10日 日曜日

”Amazon アソシエイト Web サービス”が”Product Advertising API”に

カテゴリー: AmazonLink, アフィリエイト, プログラミング
タグ:, , , , ,
時間:17時46分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録
Popularity: 18%
by Popularity Contest 日本語版

Amazon.co.jp からいろいろな情報を取得することができる”Amazon アソシエイト Web サービス”というサービスがありますが、”Product Advertising API”という名称に変わるとのことです。そして、情報のリクエストには署名による認証が必要になるとのこと。

拙作 WordPress プラグインの AmazonLink でもこのサービスを使用しているので他人事ではありません。

基本方式はほとんど変わらないとのことですが、認証で使用する電子署名の作成には、開発者登録をしたときに作成した Secret Access Key というものが必要になるようです。リクエスト時のデータによって変わるため、電子署名データだけをプログラムに埋め込んでおくことができません。また、Secret Access と言うくらいなのでこれを公開するのも駄目でしょう。

詳しい情報がまだ得られていないのでなんとも言えませんが、ただ使うだけの人にも開発者登録をしてもらわないと駄目になるかもしれません。

今のところは、たつをさんによる記事が一番詳しそう。

電子署名データの作成には RFC 2104-compliant HMAC with the SHA256 hash algorithm という変換処理のようなものが必要で、これを行うための関数である hash は PHP5 でないと標準では使用できません。PHP4 はすでに終了宣言が出ているのですが、まだ PHP5 が使用できないサーバーもあるので悩みどころです。

コメント (0)

2008年11月29日 土曜日

WordPress 用プラグイン monthchunks のバグを修正

カテゴリー: WordPress, ハック, プラグイン
タグ:, , ,
時間:3時45分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録
Popularity: 25%
by Popularity Contest 日本語版

 このブログでは、月ごとアーカイブをコンパクトに表示してくれるプラグイン monthchunks を使用していますが、記事がないのに表示されている月があることが判明しました。

 問題の月は、2006年の9月。Google ウェブマスターツールのリンクエラー報告によると、76箇所で表示されているとのこと。さすがに数が多いので、本腰を入れて調べてみることにしました。久しぶりのプラグインハックです。

 何はともあれ、まずはプラグインのコードを読みます。使用しているバージョンは、最新の2.1。関数が1つ定義してあるだけでコメントを含めても154行と非常に短いので、初めてのハックにはお勧めかもしれません。

 大まかな流れは、SQL 文を生成して実行するだけ。オプションによって多少分岐がありますが、上から追いかけていけば大したことはありません。101行目からと114行目(110行目から始まる foreach の中)からの2箇所でデータベースにアクセスしています。1箇所目は記事のある年度の取得、2箇所目は各年度別に記事のある月の取得をしています。

PHP:
  1. // get an array of the years in which there are posts
  2.     $wpdb->query("SELECT DATE_FORMAT(post_date, '%Y') as post_year
  3.                   FROM $wpdb->posts
  4.                   WHERE post_status = 'publish'
  5.                   GROUP BY post_year
  6.                   HAVING post_year <> '0000'
  7.                   ORDER BY post_year $year_order");
  8.     $years = $wpdb->get_col();

PHP:
  1. // get an array of months for the current year without leading zero
  2.         // sort by month with leading zero
  3.         $months = $wpdb->get_results("SELECT DATE_FORMAT(post_date, '%c') as post_month,
  4.                                       $month_format AS display_month,
  5.                                       DATE_FORMAT(post_date, '%M') as post_month_name
  6.                                       FROM $wpdb->posts
  7.                                       WHERE DATE_FORMAT(post_date, '%Y') = $year
  8.                                       AND post_status = 'publish'
  9.                                       GROUP BY DATE_FORMAT(post_date, '%m')
  10.                                       ORDER BY post_date");

 今回問題になっているのは月の情報なので、2箇所目を詳しく見ていきます。PHP のコードと SQL が混在してわかりにくいので、最終的な SQL 文を記述してみます。オプションを特に指定しない場合は、次のようなものが出来上がります。(改行やインデントなどを加えてあります)

SQL:
  1. SELECT
  2.     DATE_FORMAT(`post_date`, '%c') AS `post_month`,
  3.     DATE_FORMAT(`post_date`, '%c') AS `display_month`,
  4.     DATE_FORMAT(`post_date`, '%M') AS `post_month_name`
  5. FROM `wp_posts`
  6. WHERE
  7.     DATE_FORMAT(`post_date`, '%Y') = 2006
  8.     AND post_status = 'publish'
  9. GROUP BY DATE_FORMAT(`post_date`, '%m')
  10. ORDER BY `post_date`;

 実際にこの SQL 文を手がかりに検索してみると、記事ではなく固定ページが見つかりました。記事と固定ページを区別していないため、固定ページしかない月も表示してしまっていたのです。

 ここまでわかればあとは簡単。検索条件に記事であることを加えればいいのです。記事の場合は post_type というフィールドの値が post となるので(WordPress 2.1以降)、post_type = 'post' を加えます。変更後は次のようになります。私は120行目に加えました。

PHP:
  1. // get an array of months for the current year without leading zero
  2.         // sort by month with leading zero
  3.         $months = $wpdb->get_results("SELECT DATE_FORMAT(post_date, '%c') as post_month,
  4.                                       $month_format AS display_month,
  5.                                       DATE_FORMAT(post_date, '%M') as post_month_name
  6.                                       FROM $wpdb->posts
  7.                                       WHERE DATE_FORMAT(post_date, '%Y') = $year
  8.                                       AND post_status = 'publish'
  9.                                       AND post_type = 'post'
  10.                                       GROUP BY DATE_FORMAT(post_date, '%m')
  11.                                       ORDER BY post_date");

 これにより、その年の公開されている記事という条件で絞り込むことができるようになりました。現在2006年の9月は表示されなくなっています。

2010年6月21日追記

prioさんからコメントをいただきましたので、年度の表示についても追記します。確認はしていませんので、参考程度にどうぞ。

100行目からの年度のコードを見ると、月の取得同様に固定ページも含むようになっています。SQLにしてみるとこんな感じ。

SQL:
  1. SELECT
  2.     DATE_FORMAT(post_date, '%Y') AS post_year
  3. FROM `wp_posts`
  4. WHERE
  5.     post_status = 'publish'
  6. GROUP BY post_year
  7. HAVING post_year <> '0000'
  8. ORDER BY post_year DESC

記事の投稿に限定する条件を加えると次のようになります。

PHP:
  1. // get an array of the years in which there are posts
  2.     $wpdb->query("SELECT DATE_FORMAT(post_date, '%Y') as post_year
  3.                   FROM $wpdb->posts
  4.                   WHERE post_status = 'publish'
  5.                   AND post_type = 'post'
  6.                   GROUP BY post_year
  7.                   HAVING post_year <> '0000'
  8.                   ORDER BY post_year $year_order");
  9.     $years = $wpdb->get_col();

104行目が追加した行です。意味については、月の場合と同じです。

コメント (2)
次ページへ »

HTML convert time: 1.372 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo