iTunesアフィリエイトプログラムのリンクシェアURLをPHG形式へ一括置換する方法です。WordPressプラグイン『Search Regex』の正規表現を利用します。
この作業を誤るとデータベースを元に戻せなくなるリスクがあります
このエントリは @toshiya240 さんのBlogger向けエントリをWordPressユーザ向けにまとめたものです。こちらのエントリも必ず読んでください。
[sharepost url=”http://www.toshiya240.com/2013/09/blogger-linkshre-phg.html”]
リンクシェアURLの置換作業が難しい理由
- アプリ毎にidやdescription部分が異なる。
- AppHtml、AppStoreHelper等に代表されるリンクシェアURL作成ツールは、それぞれ微妙にパラメーターの並び順が異なる。
- ストアによりMedia Type(mt)が異なる。
これらの多様性を網羅的に考慮して正規表現を使って置換作業を行います。正規表現とは「パターン検索」のことで、あるパターンに合致するものを抽出して一定条件で置換することが可能になります。
一方で、正規表現を適切に定義しないと抽出漏れや部分的な置換に留まったり、誤置換が発生してしまう諸刃の剣です。
バックアップ必須の作業
Search Regexというプラグインを使ってMySQLデータベースを直接書き換えます。従って間違えると元に戻せません。作業前に必ずバックアップしてください。本プラグインの設定画面にも以下のように注釈があります。
NOTE: No liability is accepted for any damage caused. You are strongly advised to backup your database before making any changes.
なお、バックアップしても完全にその時点に戻せない場合もありますのでご注意ください。
このエントリで紹介する正規表現について
以下のツールで作成したリンクシェアURLの置換について確認しています。ただし、作業結果の保証はいたしかねますので自己責任で実施してください。
- AppHtml
- AppStoreHelper
- AppHtmlME
- MovieHtml
- MusicHtml
- iBooksHtml
- AllAppStoreHtml(MyScripts)
これらのツールやリンク等を改変している場合、あるいは既に一部を置換してしまった等の場合、以下の方法では正しく抽出・置換できませんので作業は行わないでください。
置換作業の前にリンク形式を理解する
まず、次のURLはTwitter公式クライアントのApp Storeへの通常リンク形式です。
1 |
https://itunes.apple.com/jp/app/twitter/id333903271?mt=8&uo=4 |
次にAppHtmlブックマークレットを使ったリンクシェア形式の例です。通常リンクがURLエンコードされ、パラメーターが設定されています(各ツールで異なります)。
1 |
http://click.linksynergy.com/fs-bin/stat?id=(LinkShareID)&offerid=94348&type=3&subid=0&tmpid=2192&RD_PARM1=https%253A%252F%252Fitunes.apple.com%252Fjp%252Fapp%252Ftwitter%252Fid333903271%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30 |
これを以下のようにPHGリンクに置換しなければなりません。Auto Link Makerを使うのであれば「at=(アフィリエイト・トークン)」部分は不要で通常リンクに戻すことになります。
1 |
https://itunes.apple.com/jp/app/twitter/id333903271?mt=8&uo=4&at=(PHGアフィリエイトID) |
このほか、Media Typeを考慮する必要があり、mtに続く番号には意味があります。「8」はiOSアプリ、「12」はMacアプリ、「11」はiBooksであり、これを誤ると正しいストアへ遷移しません。また、販売元(アーティスト)やMovie、Musicのようにmt番号がないURLも存在します。
Search Regexプラグインとその置換手順
管理画面のプラグインメニューにある新規追加からインストールしてください。
ツールからSearch Regexを選択し、Search patternに正規表現の検索パターン(後述)を入力、Regexのチェックボックスにチェックを入れて、Searchボタンをクリックします。
合致したリンクシェアURLがヒットします。
次にReplace patternに置換パターン(後述)を入力して、Replaceボタンをクリックします。
抽出したリンクシェアURLと置換するPHGリンクURLを比較してプレビューした状態になります。ここでいくつかサンプルチェックします。
ここから先の作業を実施すると元に戻せません
最後に「Replace & Save」ボタンをクリックして置換が完了します。
置換漏れを確認するために、Regexチェックボックスのチェックを外してSearch patternを「http://click.linksynergy.com/fs-bin/」として置換もれがないか確認します。
次から紹介する3つの正規表現を使って実行すると上記前提で作成したリンクシェア形式は全てPHG対応リンクに置換されます。
メディアタイプ(mt)指定あり
@toshiya240 さんが紹介されているBlogger向けからWP用に若干補正(特殊文字のエスケープ)を加えています。以下は、iOSアプリ、Macアプリ、iBookstoreコンテンツの置換に利用します。
Search pattern
1 |
/(["'])http:\/\/click\.linksynergy\.com\/fs-bin\/(?:stat|click)\?[^"']*RD_PARM1=([^"']+)%(?:25)?3A%(?:25)?2F%(?:25)?2Fitunes\.apple\.com%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?3Fmt%(?:25)?3D([0-9]+)%(?:25)?26uo%(?:25)?3D([0-9]+)[^"']*["']/ |
Replace pattern
1 |
$1$2://itunes.apple.com/$3/$4/$5/$6?mt=$7&uo=$8&at=11l3L9$1 |
Auto Link Makerを使う場合は「&at=アフィリエイト・トークン」を削除してください。アフィリエイト・トークンを埋め込む場合は11l3L9を自身のものに書き換えてください。
メディアタイプ(mt)指定なし
以下は、開発元URLやMovieコンテンツなどのメディアタイプの指定がないリンクシェアURLの置換に利用します。
Search pattern
1 |
/(["'])http:\/\/click\.linksynergy\.com\/fs-bin\/(?:stat|click)\?[^"']*RD_PARM1=([^"']+)%(?:25)?3A%(?:25)?2F%(?:25)?2Fitunes\.apple\.com%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?3Fuo%(?:25)?3D([0-9]+)[^"']*["']/ |
Replace pattern
1 |
$1$2://itunes.apple.com/$3/$4/$5/$6?uo=$7&at=11l3L9$1 |
Auto Link Makerを使う場合は「&at=アフィリエイト・トークン」を削除してください。アフィリエイト・トークンを埋め込む場合は11l3L9を自身のものに書き換えてください。
Songの場合
ミュージックのうちSongコンテンツは上記のURLとも異なっています。MusicHtmlを利用していなければこの作業は不要です。
Search pattern
1 |
/(["'])http:\/\/click\.linksynergy\.com\/fs-bin\/(?:stat|click)\?[^"']*RD_PARM1=([^"']+)%(?:25)?3A%(?:25)?2F%(?:25)?2Fitunes\.apple\.com%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?2F([^"']+)%(?:25)?3Fi%(?:25)?3D([0-9]+)%(?:25)?26uo%(?:25)?3D([0-9]+)[^"']*["']/ |
Replace pattern
1 |
$1$2://itunes.apple.com/$3/$4/$5/$6?i=$7&uo=$8&at=11l3L9$1 |
Auto Link Makerを使う場合は「&at=アフィリエイト・トークン」を削除してください。アフィリエイト・トークンを埋め込む場合は11l3L9を自身のものに書き換えてください。
Search Regexプラグインの致命的なバグと暫定修正
わたしは上記の方法で約900個弱のリンクシェアURLを全て置換することが出来ました。ただし、正規表現にマッチした数が多いと以下のエラーが出てしまい作業を継続することができないケースがあります。
1 |
Fatal error: Allowed memory size of XXXXXXX bytes exhausted (tried to allocate XX bytes) in /path/to/wordpress/wp-content/plugins/search-regex/searches/post_content.php on line XX |
これを回避するためSearch RegexのLimit toを使って対象エントリを一定数に限定して置換作業を行いたいところですが、正しく動作しません(少なくともWP3.5.1/3.6、プラグインの3世代前のバージョンまでは動作しませんでした)。これを指定しても全て抽出してしまい、指定しない状態と同じ振る舞いしかしません。
このバグを @toshiya240 さんが機能するように修正してくださいました。これを開発元へメールや、サポートフォーラムでも通知しております。公式対応を待つべきですが開発元の反応が全くなく近々に対応される様子もないため暫定としてバグ解消方法をご紹介します。
ライセンスやパッチの公開方法等に鑑みファイルそのものの提供は差し控えます。 /path/to/wordpress/wp-conent/plugins/search-regex/searches/ にあるpost_content.php の10行目以降を次のとおり修正してください。
(修正前)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$posts = $wpdb->get_results ( "SELECT ID, post_content, post_title FROM {$wpdb->posts} WHERE post_status != 'inherit' AND post_type IN ('post','page') ORDER BY ID $orderby" ); if ( $limit > 0 ) $sql .= $wpdb->prepare( " LIMIT %d,%d", $offset, $limit ); if (count ($posts) > 0) { foreach ($posts AS $post) { if (($matches = $this->matches ($pattern, $post->post_content, $post->ID))) { foreach ($matches AS $match) $match->title = $post->post_title; $results = array_merge ($results, $matches); } } } |
(修正後)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$posts = $wpdb->get_results ( $wpdb->prepare("SELECT ID, post_content, post_title FROM {$wpdb->posts} WHERE post_status != 'inherit' AND post_type IN ('post','page') ORDER BY ID $orderby") ); if (count ($posts) > 0) { $hit = 0; foreach ($posts AS $post) { if (($matches = $this->matches ($pattern, $post->post_content, $post->ID))) { ++$hit; foreach ($matches AS $match) $match->title = $post->post_title; $results = array_merge ($results, $matches); } if($limit>0&&$hit>=$limit) { break; } } } |
Limit toが制限するのは検索対象のエントリ数であり、検索結果数ではありません。たとえば、”Limit to 10″とした場合には検索結果でヒットするのは10エントリに含まれる正規表現に合致した数であり、それが30個あれば10ではなく30を返します。
これは非公式の修正方法です。いかなる損害についても責任を負えませんのでご理解いただける方のみご利用ください。
Identity Guideline
iTunesアフィリエイトプログラムにはアイコンやバッジの使い方などプログラム参加者本人が同意した遵守すべきルールが存在します。上記作業は過去のリンクシェアURLを有効に継続するために置換したに過ぎません。すなわち、以下の規約やガイドライン等の適用を受けることになりますので、過去分についても見直しのうえ必要に応じて修正ください。
[sharepost url=”http://www.apple.com/itunes/affiliates/resources/documentation/faq_jp.html”]
[sharepost url=”http://www.apple.com/itunes/affiliates/resources/documentation/identity-guidelines.html”]