ブログを運営しているとアフィリエイトでAmazonや楽天商品の購入を促すリンクを貼り付けると思います。そんなときに使うツールとして、たい氏が制作された『カッテネ』というものがあります。
他には『カエレバ』や『ヨメレバ』といった類似ツールもあるのですが、『カッテネ』が一番使いやすかったので、本ブログでは『カッテネ』を使わせて貰っています。(たい氏には圧倒的感謝)
ただ、『カッテネ』を使っていて、「ちょっと面倒だな」と感じたことがあったので、「じゃあ、プラグインを改造するか」という勢いで『カッテネ』を改良してみました。
ここでは『カッテネ』を改良したコードや、そのコーディングの解説をしたいと思います。
『カッテネ』に感じた不満
まずは私が『カッテネ』に感じた不満から。これが元で機能修正をしたので説明しておきます。
『カッテネ』はJSONを解析してリンクを生成してくれる、非常に便利で使い勝手の良いツールです。しかし、使っていて1つだけ不満がありました。
それは "url" の設定部分です。ここには「もしもアフィリエイト」などのアフィリエイトリンクを記述するのですが、ここの記述が少し面倒だなと感じていました。
たとえば、「もしもアフィリエイト」でAmazonの商品(ここではHHKBのリンクを使用)を紹介する場合、以下のようなURLになります。(もしもアフィリエイトの「どこでもリンク」で生成)
//af.moshimo.com/af/c/click?a_id=2040186&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB082TSZ27D%2F
このURLをよく見てみると、以下のように2つに分割することができます。
- アフィリエイトURL部
//af.moshimo.com/af/c/click?a_id=2040186&p_id=170&pc_id=185&pl_id=4062&url= - 商品URL部
https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB082TSZ27D%2F
アフィリエイトURL部の方は基本的に不変なので、『カッテネ』のJSONに予め設定したテンプレートとして用意しておけば、あとは商品URLを入力するだけで済みます。
ただ、商品URL部を見るとわかる通り、商品URLはURLエンコードが行われています(URLエンコードしなくても大丈夫という説もある)。
そのため、JSONの "url" に予めアフィリエイトURL部を記述しておいたテンプレートを用意したとしても、URLエンコードを噛まさなければならないので、商品URLをそのまま貼り付けるだけではだめでした。
ファイル名やクエリ文字列などの一部としては使用できない記号や文字を、使用できる文字の特殊な組み合わせにエンコード(変換)することを意味します。
『カッテネ』を改良
というわけで、商品URLを貼り付けるだけでURLエンコードまでして、アフィリエイトリンクを生成してくれるように『カッテネ』のコードを修正しました。修正したコードは以下にアップしています。
修正内容としては簡単で、『カッテネ』のJSON設定に "afi_url" という項目を追加しました。
"afi_url" にはアフィリエイトURL部 のURLを設定し、従来からある "url" の部分には商品URLを設定します。すると、"url" の部分は自動的にURLエンコードして "afi_url" と連結するという魂胆です。
この修正を行えば、"afi_url" の部分に予めアフィリエイトURL部を設定してテンプレートを用意することで、紹介したい商品URLを "url" に設定するだけでアフィリエイトリンクが完成します。(ほんの少しの手間なんだけどね…それが嫌なのよ)
既存コードと改良コードの解説
私はシステムエンジニアなのですが、畑違いなのでPHPはほとんど触ったことがないです。というわけで、とりあえず『カッテネ』のコードを読んでみることにしました。
WordPressのプラグインコードは "wp-content/plugins" にあり、『カッテネ』のコードはその中の "kattene" 配下にあります。"kattene" の下にはいくつかファイルがありますが、"plugin.php" が実際の処理コードなので、この中を見ていきます。
コードを見てみると結構シンプルなことが分かりました。 そして、今回やりたいことを実現するためには、以下の部分をイジれば良いとわかりました。(ちなみにPHPはかなり素直な言語だなと感じた。)
$str = '<div class="kattene">
<div class="kattene__imgpart"><a'.$target_blank_str.' href="'.$main["url"].'"><img' .$lazyloading_str. ' src="'.$arr["image"].'" '.$shadow_str.'></a></div>
<div class="kattene__infopart">
<div class="kattene__title"><a'.$target_blank_str.' href="'.$main["url"].'">'.$arr["title"].'</a></div>
<div class="kattene__description">'.$arr["description"].'</div>
<div class="kattene__btns '.$num_class.'">';
for( $i=0 ; $i<$cnt ; $i++ ){
$str .= '<div><a class="kattene__btn __'.$sites[$i]["color"].'"'.$target_blank_str.' href="'.$sites[$i]["url"].'">'.$sites[$i]["label"].'</a></div>';
}
$str .= '</div></div></div>';
ここで『カッテネ』がアフィリエイトリンクを生成しているわけですが、for文の中がAmazonや楽天といった、各サイト毎の購入ボタンを生成している箇所になります。
ここに "$sites[$i]["url"]" という変数がありますが、これは『カッテネ』のJSONで設定した "url" の値を取ってきています。つまり、ここで "href" に "url" の値を設定することで、アフィリエイトを経由した商品へのリンクが生成されているわけですね。
というわけで、今回は "href" に設定する値を "afi_url" と "url" を連結したものにしたいわけですが、その前に "url" をURLエンコードしなければなりません。
そこで "urlencode()" という関数を使います。PHP 4以降実装されている関数で、引数に渡された文字列をURLエンコードして、その結果を文字列として返してくれます。以下のように使います。
urlencode($sites[$i]["url"]);
あとは返ってきた文字列を "afi_url" と連結したいので、以下のようにします。(PHPでは "." (ドット)が文字列連結の演算子となります)
$url = $sites[$i]["afi_url"] . urlencode($sites[$i]["url"]);
連結した文字列を "$url" という変数に入れたので、あとはその変数の値を "href" に設定してやれば完成です。というわけで、最終的なコードを見てみましょう。
$str = '<div class="kattene">
<div class="kattene__imgpart"><a'.$target_blank_str.' href="'.$main["url"].'"><img' .$lazyloading_str. ' src="'.$arr["image"].'" '.$shadow_str.'></a></div>
<div class="kattene__infopart">
<div class="kattene__title"><a'.$target_blank_str.' href="'.$main["url"].'">'.$arr["title"].'</a></div>
<div class="kattene__description">'.$arr["description"].'</div>
<div class="kattene__btns '.$num_class.'">';
for( $i=0 ; $i<$cnt ; $i++ ){
if(array_key_exists('afi_url', $sites[$i]))
{
$url = $sites[$i]["afi_url"] . urlencode($sites[$i]["url"]);
}else{
$url = $sites[$i]["url"];
}
$str .= '<div><a class="kattene__btn __'.$sites[$i]["color"].'"'.$target_blank_str.' href="'.$url.'">'.$sites[$i]["label"].'</a></div>';
}
$str .= '</div></div></div>';
はい、ちょっと解説に無かったところがありますね。9行目~14行目の部分です。ここでは、それまで使っていた『カッテネ』のJSONと互換性を持たせるために、条件分岐を持たせています。
もし、JSON解析して "afi_url" というキーがあった場合は、"afi_url" と URLエンコードした "url" を連結します。逆に "afi_url" が存在しない場合は、"url" をそのまま使うようにします。
こうすることで、今まで設定した『カッテネ』のJSONを修正しなくても良いようにしています。そうしないと、今まで設定した『カッテネ』のJSONをすべて修正することになるので…
まとめ
『カッテネ』の修正を行ってみましたが、コードを見てみれば「なんだそんなものか」と感じたのではないでしょうか。これを機に、使っているプラグインを自分好みに改造してみたり、自分にとって便利なプラグインを作成してみてはいかがでしょうか。
コメント