アフィリエイト商品表示・WordPressプラグインについて、設定ページとショートコードの登録
アフィリエイト商品表示・WordPressプラグインについて、以下の二つの場合に分けて処理をするPHPソースコードを、解説しています。
- ワードプレスの設定メニューに、当プラグインの設定ページを登録する。
- 当プラグインのショートコードを登録する。
当プラグインの設定ページとショートコードを、登録する
if (is_admin ()) {
// ダッシュボードまたは管理画面を表示中
require_once (GOODS_MEMO_DIR . "option/AffiliateSettingPage.php");
$settingPage = new goodsmemo\option\AffiliateSettingPage ();
} else {
// テーマを使って表示中
require_once (GOODS_MEMO_DIR . "shortcode/Shortcode.php");
// テスト環境にて、ショートコードの属性の値が壊れていた場合があった。
// 例:keyword="ダイエット"が、$attsにて、keyword=「class="marker_pink">ダイエット</span></span>」という値になった。
// add_shortcode(GOODS_MEMO_PREFIX . "_affiliate", "\goodsmemo\shortcode\Shortcode::makeAffiliateHTML");
//
// 以下の書き方にしてみる。参考:http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_shortcode
add_shortcode ( GOODS_MEMO_PREFIX . "_affiliate",
array (
'goodsmemo\shortcode\Shortcode',
'makeAffiliateHTML'
) );
// ヘッダにCSSを追加する
add_action ( 'wp_enqueue_scripts', 'addGoodsMemoAffiliateStyles' );
}
上記のプログラムコードでは、以下の二つの場合に分けて処理します。
- 当プラグインの設定ページを登録する。
- 当プラグインのショートコードを登録する。
上記のプログラムコードを作成していた当時、上記の二つの場合に分けて処理をすることについて、あんまりよくわかっていませんでした。
だけど当プラグインには、
- ワードプレスのダッシュボードの設定メニューから動作する場合、
- ワードプレスの投稿記事が表示された時に動作する場合、
この二通りがあることに気がつきました。
よって、ワードプレス側から最初に呼び出されたPHPファイルにて、二つの場合に分けて処理することになります。
当プラグインの設定ページを登録する
if (is_admin ()) {
// ダッシュボードまたは管理画面を表示中
require_once (GOODS_MEMO_DIR . "option/AffiliateSettingPage.php");
$settingPage = new goodsmemo\option\AffiliateSettingPage ();
}
is_admin()関数がtrueの場合、
ワードプレスのダッシュボード、または管理画面が表示中となります。
この時に、当プラグインの設定ページを登録します。
AffiliateSettingPageクラスのコンストラクタにて、以下の処理をします。
- ワードプレスの設定メニューに、当プラグインの設定ページを登録する。
- 当プラグインの設定ページを、 HTMLタグを出力して作成する。
staticメソッドを呼び出して設定ページを登録する方が、自然な感じになります
$settingPage = new goodsmemo\option\AffiliateSettingPage ();
上記のように、AffiliateSettingPageクラスのインスタンス変数を作成することで、
当プラグインの設定ページを登録して、設定ページのHTMLタグを出力する、
というのは、わかりにくいかもしれません。
不要な$settingPage変数を作っているのも、違和感があります。
このような場合では、staticメソッド(静的メソッド)を呼び出して設定ページを登録する方が、自然な感じになるでしょう。
設定ページの登録をするstaticメソッドの例。
goodsmemo\option\AffiliateSettingPage::addSettingPageToMenu();
ただし、AffiliateSettingPageクラスのコンストラクタでは、$thisポインタが使われています。
add_action ( 'admin_menu', array (
$this,
'add_plugin_page'
) );
よって、staticメソッド内では、self::を使うことになります。
ちなみに、上記のadd_action()関数で、self::を使って正しく動作するか、確認していません。
おそらく、AffiliateSettingPageクラスの各メソッドを、staticメソッドに書き換えることになるでしょう。
当プラグインのショートコードを登録する
add_shortcode ( GOODS_MEMO_PREFIX . "_affiliate",
array (
'goodsmemo\shortcode\Shortcode',
'makeAffiliateHTML'
) );
GOODS_MEMO_PREFIX定数の定義。
define ( "GOODS_MEMO_PREFIX", "goodsmemo" );
上記のようにadd_shortcode()関数を用いて、当プラグインのショートコードを登録します。
登録後、以下のようなショートコードを利用できるようになります。
当プラグインのショートコードの例
アマゾンの商品を表示するショートコードの例。
[goodsmemo_affiliate service="amazon" keyword="SDカード" number="1"]
- service属性:amazon
- keyword属性:SDカード
- number属性:1(商品の表示件数)
楽天市場の商品を表示するショートコードの例。
[goodsmemo_affiliate service="rakuten" keyword="SDカード" number="1"]
- service属性:rakuten
- keyword属性:SDカード
- number属性:1(商品の表示件数)
ショートコードを登録するadd_shortcode()関数の第二引数に、当プラグインの処理を行うクラス名とstaticメソッド名を、指定する
add_shortcode ( GOODS_MEMO_PREFIX . "_affiliate",
array (
'goodsmemo\shortcode\Shortcode',
'makeAffiliateHTML'
) );
add_shortcode()関数の第二引数に指定するarray()配列関数については、
当プラグインの処理を行うクラス名とstaticメソッド名を、指定します。
- クラス名:goodsmemo\shortcode\Shortcode
- staticメソッド名:makeAffiliateHTML
ショートコードを登録するadd_shortcode()関数
ワードプレスのadd_shortcode()関数は、オリジナルのショートコードを作成するために使用する関数です。
ショートコードとは、角括弧で囲まれた短いコードです。
特定の機能を実行したり、複雑なコンテンツを簡単に挿入したりできます。
ワードプレスのプラグインでは独自のショートコードを提供して、ユーザーに利用してもらうことが多いです。
add_shortcode()関数の使い方は、次のようになります。
add_shortcode( $tag, $func );
第一引数の$tagは、ショートコードの名前を指定します。
例えば、[hello]というショートコードを作りたい場合は、$tagに’hello’という文字列を渡します。
第二引数の$funcは、ショートコードが呼び出された時に実行される関数の名前を指定します。
例えば、[hello]というショートコードが呼び出された際に、
「こんにちは」と表示する関数を作りたい場合は、次のように書きます。
function hello_func() {
return 'こんにちは';
}
add_shortcode( 'hello', 'hello_func' );
上記ソースコードのようにadd_shortcode()関数を使って、ワードプレス上で独自のショートコードを作成できます。
ワードプレスのプラグインであることを示す、標準プラグイン情報
当プラグインの標準プラグイン情報。
/*
* Plugin Name: Affiliate product display wordpress plugin
* Plugin URI:
* Description: Amazonや楽天市場の商品を、アフィリエイト対象の商品として表示します。
* Version: 0.3.8
* Author:Goods Memo
* Author URI: https://programming.goods-memo.net/affiliate-product-display-wordpress-plugin/
* License: GPL v2 or later
*/
標準プラグイン情報は、ワードプレスのプラグインであることを示します。
標準プラグイン情報のコメント文(ヘッダー文)が存在することで、このPHPファイルがプラグインとして、実行されます。
このPHPファイルが、ワードプレス側から最初に呼び出されます。
最低限必要な項目は、Plugin Nameの項目です。
Plugin Nameの項目が存在すれば、プラグインであると認識されます。
標準プラグイン情報は、英文であることが望ましいそうです。
だけど日本語がわかる人に向けてプラグインを公開するなら、日本語でプラグイン情報を書いても良いそうです。
どのPHPファイルが最初に実行されるのか、わかりませんでした…
ワードプレスのプラグインを作成し始めた当初、
どのPHPファイルが最初に実行されるのか、わかりませんでした。
プラグインの作り方に関する解説記事を読んで、
標準プラグイン情報のコメント文が、最初に実行されるPHPファイルを決める、と知りました。
当初は、Javaアプリケーションのメイン関数(main()メソッド)みたいなものがあるかもしれない、と思っていました。
その予想は、外れました。
よく考えたらJavaのサーブレットにも、メイン関数はありませんでした。
例えば、HttpServletクラスのdoGet()メソッドが、呼び出されていました。
当プラグインがアンインストールされた時、当プラグインのデータを削除する
function goodsmemo_affiliate_uninstall() {
// データベースからオプションを削除する
delete_option ( "goodsmemo_option_name" );
}
register_uninstall_hook ( __FILE__, "goodsmemo_affiliate_uninstall" );
当プラグインがアンインストールされた時、
delete_option()を実行して、当プラグインに関するデータを、ワードプレスのデータベースから削除します。
データベースで使用するサイトオプション名は、一意であること
ここでは、サイトオプション名”goodsmemo_option_name”を使って、ワードプレスのデータベースからデータを削除しています。
このサイトオプション名は、すべてのプラグインにおいて一意(ユニーク)であることが、大事です。
もしも、他のプラグインと同じサイトオプション名である場合、
他のプラグインのデータを削除してしまう可能性があるからです。
たまに、ワードプレスのプラグイン同士が干渉して、
プラグインで設定済みのデータが消えてしまった、という話を聞きます。
もしかしたら、プラグイン同士で同じサイトオプション名を使っているためかもしれません。
サイトオプション名に、パスワードみたいな文字列を含めると良いかも?
もしも、サイトオプション名が一意であることにこだわるなら、
パスワードみたいなデタラメな文字列を含めておく方が、手堅いかもしれません。
例:パスワードみたいな文字列 “6.w;xY~X]+” を含めたサイトオプション名。
“goodsmemo_6.w;xY~X]+_option_name”
ちなみに、サイトオプション名にどんな文字が使えるか、例えば記号文字が使えるのか、ちょっと調べてみたのですが、わかりませんでした。
以前、デバッグ用の関数を使ってデバッグしていました
/*
* デバッグの例:
* var_dump($val);
* print_r($val);
*
* ファイルに出力する。htdocs/wp_test/print_r1.txt
* ob_start ();
* print_r ( $responseJSON );
* $buf = ob_get_contents ();
* ob_end_clean ();
* $fp = fopen ( 'print_r1.txt', 'w' );
* fputs ( $fp, $buf );
* fclose ( $fp );
*/
var_dump()関数もprint_r()関数も、変数の中身を表示する関数です。
これらの関数を、デバッグする際に使ってました。
ただし実際のところ、 PHPソースコードにデバッグ用の関数を書き込んでデバッグするのは、とても面倒です。
よって今では、PHP言語に対応した統合開発環境を使って、プログラム作成とデバッグを実行しています。
2018年から2023年4月まで、Eclipse統合開発環境を使ってました。
2023年5月から、Visual Studio Code統合開発環境を使っています。
XAMPPとXdebugを組み合わせたVisual Studio Codeを、使っています。
統合開発環境では、例えば以下の事をできるので、快適にデバッグできます。
- デバッグしたいソースコードの部分に、ブレークポイントを使用できる。
- ブレークポイントの部分で処理が中断した際、統合開発環境上で変数の中身を表示できる。
Eclipseのデバッグ環境では、情報量が多い変数の場合、すべて表示されません
※Eclipse統合開発環境を使っていた当時の話題になります。
Eclipseのデバッグ環境では、変数の中身がすべて表示されない場合がありました。
よくわからないのですが、変数の中身の最初の方から1024文字あたりまでのみ、変数を表示するウィンドウ上に表示されました。
1024文字以降の変数の中身については、Eclipseのデバッグ環境では見れないようです。
※1024文字については、1024バイトかもしれません。
1100文字前後で、変数の中身の表示が途切れている気がします。
情報量が多い変数の中身を確認したい場合、ファイルに出力します
情報量が多い変数の中身をすべて確認したい場合、
例えばprint_r()関数の出力先をファイルにします。
print_r()関数の出力先をファイルにする例。
//ファイルに出力する。htdocs/wp_test/print_r1.txt
ob_start ();
print_r ( $responseJSON );
$buf = ob_get_contents ();
ob_end_clean ();
$fp = fopen ( 'print_r1.txt', 'w' );
fputs ( $fp, $buf );
fclose ( $fp );
$responseJSON変数の中身の全てを、print_r1.txtファイルにて確認できます。
print_r1.txtファイルが作成される場所は、ワードプレスがインストールされているディレクトリーだったりします。
デバッグ用の関数を使っていたのは、XDebugを設定できなかったから
最初の頃、当プラグインの作成においては、以下の開発環境で起こなっていました。
- Local By Flywheel
- 秀丸エディター、またはPHP専用の何とかエディタ(名前を忘れました)
- クロームブラウザ
うる覚えですが、XDebugの設定の仕方や使い方がわからず、仕方なくデバッグ用の関数を使ってました。
先ほど紹介した、PHP言語に対応したEclipse統合開発環境では、最初からブレークポイントを使用できるようになっています。
なのでEclipseでは、デバッグ環境の構築に悩む必要はないです。とても便利です。
Eclipse統合開発環境については、Javaアプリケーションやサーブレットの開発で、使っていたことがありました。
Eclipseを使っていた経験があったのに、なぜだか、PHP言語による開発でEclipseを使うという発想がありませんでした。
その当時もしかしたら、EclipseとXAMPPを統合した「Pleiades All in One Eclipse」のことを、知らなかったのかもしれません。
当プラグインの作成を、やめる可能性もありました
アフィリエイト商品表示・WordPressプラグインは、ある程度完成しました。
ですが、当プラグインを作れなかった、開発を中止する可能性もありました。
10年以上前のJavaプログラミングの経験を基にして、
あんまり知らないPHP言語やワードプレスのプラグイン作成については、ネット上で調べる。
こんな状況で、プラグインを作ろうとしていたからです。
さらに当時は不眠症だったため、予定通りにプログラミングするのは難しい場合がありました。
以上より、作るのに時間がかかる場合は、プラグイン作成をやめようと考えていました。
そんな状況だったけれど、当プラグインが完成したのは、
ネット上の解説記事に役立つPHPのソースコードが公開されていたからだと、思います。
役立つサンプルコードがたくさん公開されていたから、当プラグインが完成した、と思います。
goodsmemo-affiliate.phpのソースコード
<?php
/*
* Plugin Name: Affiliate product display wordpress plugin
* Plugin URI:
* Description: Amazonや楽天市場の商品を、アフィリエイト対象の商品として表示します。
* Version: 0.3.8
* Author:Goods Memo
* Author URI: https://programming.goods-memo.net/affiliate-product-display-wordpress-plugin/
* License: GPL v2 or later
*/
define ( "GOODS_MEMO_DIR", __DIR__ . "/" );
define ( "GOODS_MEMO_PREFIX", "goodsmemo" );
function goodsmemo_affiliate_uninstall() {
// データベースからオプションを削除する
delete_option ( "goodsmemo_option_name" );
}
register_uninstall_hook ( __FILE__, "goodsmemo_affiliate_uninstall" );
function addGoodsMemoAffiliateStyles() {
$styleSheetUniqueName = GOODS_MEMO_PREFIX . "-affiliateStyles";
$pluginCssURL = plugins_url ( 'gma-style.css', __FILE__ );
wp_register_style ( $styleSheetUniqueName, $pluginCssURL );
wp_enqueue_style ( $styleSheetUniqueName );
}
if (is_admin ()) {
// ダッシュボードまたは管理画面を表示中
require_once (GOODS_MEMO_DIR . "option/AffiliateSettingPage.php");
$settingPage = new goodsmemo\option\AffiliateSettingPage ();
} else {
// テーマを使って表示中
require_once (GOODS_MEMO_DIR . "shortcode/Shortcode.php");
// テスト環境にて、ショートコードの属性の値が壊れていた場合があった。
// 例:keyword="ダイエット"が、$attsにて、keyword=「class="marker_pink">ダイエット</span></span>」という値になった。
// add_shortcode(GOODS_MEMO_PREFIX . "_affiliate", "\goodsmemo\shortcode\Shortcode::makeAffiliateHTML");
//
// 以下の書き方にしてみる。参考:http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_shortcode
add_shortcode ( GOODS_MEMO_PREFIX . "_affiliate",
array (
'goodsmemo\shortcode\Shortcode',
'makeAffiliateHTML'
) );
// ヘッダにCSSを追加する
add_action ( 'wp_enqueue_scripts', 'addGoodsMemoAffiliateStyles' );
}
/*
* デバッグの例:
* var_dump($val);
* print_r($val);
*
* ファイルに出力する。htdocs/wp_test/print_r1.txt
* ob_start ();
* print_r ( $responseJSON );
* $buf = ob_get_contents ();
* ob_end_clean ();
* $fp = fopen ( 'print_r1.txt', 'w' );
* fputs ( $fp, $buf );
* fclose ( $fp );
*/
?>