wp-tmkm-amazon改訂版に手を加えました(管理画面での設定機能の追加)

[追記]記事公開後にプラグイン付属の検索機能が働かないことが判明し、それに関する対策も記事下部に追記してます。(2009/06/20 17:26)

このサイトで商品を紹介するのに使っているプラグイン・wp-tmkm-amazonなんですが、内部で使用しているAPIがamazon側による仕様変更でそのままでは2009年8月15日以降は使えなくなる模様です。(詳細は下記から)

Amazon アソシエイト・プログラム(アフィリエイト) 公式ブログ: Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ
Product Advertising API

私としては結構使い勝手の良いプラグインなんですが開発者の都合で開発はすでに打ち切り。それでも諦めきれず検索すると、wp-tmkm-amazonに手を加えて電子認証に対応したプラグインを改良したという記事を見つけました。記事末には欲しい人はコメントをと記載されていたので早速コメント。…といっても個人的に欲しいというよりは出来たら公開して欲しいと。その後は改良者である Romeo さんと開発者である ともかめ さんとの間で協議され、晴れて改訂版として公開されることになりました。

で、本題はここから。
改良者である Romeo さんによると当初は電子認証に必要なAccess Key ID / Secret Access Keyを管理画面から入力/設定するようにしたかったそうですが、反映されなかったとのこと。そこで早速ソースコードを確認して改良してみました。

まずはwp-tmkm-amazon.phpに手を加えます。変更するのは次の3カ所。

// add

の行、または

// add -->

で挟まれた部分を追加します。

	function WpTmkmAmazonAdmin() {
		if ( !get_option('wp_tmkm_admin_options') ){
			// create default options
			$tmkm_amazon_options = array(
				'associatesid' => '3104com-22',
				'devtoken' => '',		// add
				'secretkey' => '',		// add
				'windowtarget' => 'self',
				'jacketimgsize' => 'small',
				'goodsimgsize' => 'small',
				'layout_type' => '0',
				'devtoken' => '',
				'secretkey' => '',
			);
			update_option('wp_tmkm_admin_options', $tmkm_amazon_options);
		}
	}
		$tmkm_amazon_admin_html .=
			'<form method="post" action="' . $_SERVER['PHP_SELF'] . "?" . $_SERVER['QUERY_STRING'] . '">' .
			'<input type="hidden" name="action" value="save_options" />' .
			'<table class="form-table">' .
			'<tr>' . "\n" .
			'<th>あなたのアソシエイト ID</th>' . "\n" .
			'<td><input type="text" name="associatesid" value="' . $tmkm_amazon_options['associatesid'] . '"  /></td>' . "\n" .
			'</tr>' . "\n" .
// add -->
			'<tr>' . "\n" .
			'<th>あなたのAccess Key ID</th>' . "\n" .
			'<td><input type="text" name="devtoken" value="' . $tmkm_amazon_options['devtoken'] . '"  /></td>' . "\n" .
			'</tr>' . "\n" .
			'<tr>' . "\n" .
			'<th>あなたのSecret Access Key</th>' . "\n" .
			'<td><input type="text" name="secretkey" value="' . $tmkm_amazon_options['secretkey'] . '"  /></td>' . "\n" .
			'</tr>' . "\n" .
// add -->
			'<tr>' . "\n" .
			'<tr><th>商品リンクの動作</th>' . "\n" .
			'<td><input type="radio" name="windowtarget" value="self"' . $selfwindow . ' />&nbsp;同じウィンドウ( target 指定なし )<br />' . "\n" .
			'<input type="radio" name="windowtarget" value="newwin"' . $newwindow . ' />&nbsp;新規ウィンドウ( target="_blank" )</td>' . "\n" .
	function tmkm_amazon_save_options() {
		// create array
		$tmkm_amazon_options = array(
			'associatesid' => $_POST['associatesid'],
			'devtoken' => $_POST['devtoken'],		// add
			'secretkey' => $_POST['secretkey'],		// add
			'windowtarget' => $_POST['windowtarget'],
			'jacketimgsize' => $_POST['jacketimgsize'],
			'goodsimgsize' => $_POST['goodsimgsize'],
			'layout_type' => $_POST['layout_type'],
			'devtoken' => $_POST['devtoken'],
			'secretkey' => $_POST['secretkey'],
		);

		update_option('wp_tmkm_admin_options', $tmkm_amazon_options);
		$options_saved = true;
	}

さらにwp-tmkm-amazon-function.phpを。こちらは上記の追加箇所以外に削除箇所があります。

//erase

で示している行を削除またはコメントアウトしてください。

	function getamazonxml( $AssociatesID, $SearchString, $getmode, $SearchIndex, $ResponseGroup, $PageNum ) {
		global $tmkm_amazon_config, $tmkm_amazon_settings;
		
		// --- Build XML Link ---
/*
		$xmlFeed  = $tmkm_amazon_config['JPendpoint'];
		$xmlFeed .= '&AWSAccessKeyId=' .$tmkm_amazon_config['DevToken'];
		if( $AssociatesID == '' ) { $AssociatesID = $tmkm_amazon_config['AssociatesID']; }
		$xmlFeed .= '&AssociateTag=' . $AssociatesID;
		if( $getmode == 'single' ) {
			$xmlFeed .= '&Operation=' .$tmkm_amazon_config['OperationLookup'];
			$xmlFeed .= '&ItemId=' .$SearchString;
			$xmlFeed .= '&MerchantId=All';
			$xmlFeed .= '&Condition=All';
		} elseif( $getmode == 'plural' ) {
			$xmlFeed .= '&Operation=' .$tmkm_amazon_config['OperationSearch'];
			$xmlFeed .= '&Keywords=' .$SearchString;
			$xmlFeed .= '&SearchIndex=' .$SearchIndex;
		}
		$xmlFeed .= '&Version=' .$tmkm_amazon_config['Version'];
		$xmlFeed .= '&ContentType=' .$tmkm_amazon_config['ContentType'];
		$xmlFeed .= '&ResponseGroup=' .$ResponseGroup;
		if( $PageNum == '' ) { $PageNum = $tmkm_amazon_config['Pagenum']; }
		$xmlFeed .= '&ItemPage=' .$PageNum;
*/
//		$xmlFeed .= '&f=xml';
		//$tmkm_amazon_options = get_option('wp_tmkm_admin_options');
		$tmkm_amazon_settings = get_option('wp_tmkm_admin_options');		// add
		

		$options['Service'] = $tmkm_amazon_config['Services'];
		$options['AWSAccessKeyId'] = $tmkm_amazon_settings['devtoken'];	// add
//erase		$options['AWSAccessKeyId'] = $tmkm_amazon_config['DevToken'];
		$options['Version'] = $tmkm_amazon_config['Version'];
//erase		if( $AssociatesID == '' ) { $options['AssociateTag'] = $tmkm_amazon_config['AssociatesID']; }
		if( $AssociatesID == '' ) { $options['AssociateTag'] = $tmkm_amazon_settings['associatesid']; }		// add
		else $options['AssociateTag'] = $AssociatesID;

		if( $getmode == 'single' ) {
			$options['Operation'] = $tmkm_amazon_config['OperationLookup'];
			$options['ResponseGroup'] = $ResponseGroup;
			$options['ItemId'] = $SearchString;
		} elseif( $getmode == 'plural' ) {
			$options['Operation'] = $tmkm_amazon_config['OperationSearch'];
			$options['ResponseGroup'] = $ResponseGroup;
			$options['SearchIndex'] = $SearchIndex;
			$options['Keywords'] = $SearchString;
		}
		if( $PageNum == '' ) { $PageNum = $tmkm_amazon_config['Pagenum']; }
		$options['ItemPage'] = $PageNum;
		
		$options['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
		ksort($options);
		
		foreach($options as $key => $val) {
			$canonical_string .= "&" . $key . "=" . rawurlencode($val);
		}
		$canonical_string = substr($canonical_string, 1);
		$string_to_sign = "GET\n" . $tmkm_amazon_config['Url'] . "\n" . $tmkm_amazon_config['Endpoint'] . "\n" . $canonical_string;
		
		$signature = base64_encode(
			hash_hmac('sha256', $string_to_sign, $tmkm_amazon_settings['secretkey'], true)		// add
//erase			hash_hmac('sha256', $string_to_sign, $tmkm_amazon_config['SecretKey'], true)

この変更で取得したAccess Key ID / Secret Access Keyを管理画面から設定して反映することが出来ると思います。

本当のところ、wp-tmkm-amazon-function.phpの上記で紹介した箇所を見て「あ、試行錯誤してたんだなぁ…」って思ったんです。で、反映されていない…と仰っていたのを片隅においてみてみたら次の箇所が目に付いたんです。

		$tmkm_amazon_options = get_option('wp_tmkm_admin_options');

で、ここで取得した値をその下のコードで利用しようとしておられたのですが、どうもこの変数名とは違う

$tmkm_amazon_settings

という変数に取得したものとしてコードが進んでました。ということで、もしかするとこの

get_option()

で返ってきた値を納めているコードの

$tmkm_amazon_options

の部分を変えてやれば…と試したところ、すんなり。私自身もこういうミスって良くやってるよなぁ…と思ってしまいました。

これらの修正はさほど難しくない修正なのでwp-tmkm-amazon改訂版をより便利にしたいって思われている方はちょっと変更を加えてみてください。

[追記]
この改訂版プラグインの開発者 Romeo さんからコメントを通じて、上記の改変を施しても投稿画面に出てくるwp-tmkm-amazonの検索が有効にならないという情報をいただきました。確かに実際に検索してみると、

Fatal error: Call to undefined function get_option()

というエラーが出て検索できない状態でした。このエラーは「get_option()なんて関数、どこにあるかわかんないよん」といってるのです。

で、 WordPressに詳しい hiromasa さんにget_option()関数はプラグインは管理画面以外では使えないのかを尋ねたらそんなことはないということ。じゃぁ、get_option()関数を使えるようにインクルードしてやる必要があるか…と思っていたら、これまた hiromasa さんがwp-tmkm-amazon-search.phpに wp-load.phpをインクルードしたらと提案してくださいました。…というのも、amazon検索に使用しているwp-tmkm-amazon-search.phpがプラグインの独自プログラムだけで完結しているためとのこと。

…ということで、wp-tmkm-amazon-search.php の頭の方を次のように変更。(改変法則は上記と一緒です)

「wp-tmkm-amazon改訂版に手を加えました(管理画面での設定機能の追加)」への3件のフィードバック

  1. コメント等々ありがとうございます。

    上記方法だけでは検索フォーム側にはAccess Key ID / Secret Access Keyは反映されません。
    従って、いずれにせよwp-tmkm-amazon-function.phpへの記述が必要になるため、意味がないと判断し、今回の変更からは外した次第です。

    なお、現在問題とされている「検索キーワードを入力し、検索をかけても画面が真っ白」という現象は上記Access Key ID/Secret Access Keyが反映されていない場合に発生することがあります。
    念のため、当方指定箇所へ上記を記述してあるかご確認いただき、記述がない場合は、記述した上で再度ご確認いただければ幸いです。

    1. コメントありがとうございます。
      ブログに書いた箇所を修正して、ブログに情報が表示されたからいいやって感じにしてしまいました(汗
      仰ったとおり検索かけたら『Fatal error』なるものが発生して原因が get_option() だと。
      管理画面から設定値を入力できるのはやっぱり魅力的だと思うので、何とかならないか私の方でも模索してみます。

      ご迷惑をおかけして申し訳ありません……。

コメントを残す

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