プラグイン製作に挑むことにしました。このページはそのテスト用です。
普通の記事ページでもいいのですが、何かあったときの影響範囲を狭めるのと、個別に開くと人気度が変化してしまうために専用の記事を使うことにしました。
メモ
カスタムフィールド
- キー
- yo_keyword
値を得る
指定の記事のカスタムフィールドの値を得る。
get_post_meta($post->ID, 'yo_keyword', true);
- $post->ID
- 記事ID
- ‘yo_keyword’
- 値がほしいキー
- true
- このキーが1つだけのときtrue。falseだとリストになる。
プラグインオプションの処理
Saving Plugin Data to the Database
get_option($option):値の取得
add_option($name, $value, $description, $autoload):新規追加
update_option($option_name, $newvalue):更新。ない場合は add_option() が呼ばれる
delete_option($name):オプションの削除
class を使う場合のオプションページ登録
class を使っている場合(OOP)、add_options_page()
の第5引数は次のようにする。
array(&$this, 'function_name')
この引数が、call_user_func_array()
の第1引数になる。これをやらないと、「First argument is expected to be a valid callback」と警告が出る。
フォームの値
フォームからの値はグローバル変数の $_POST や $_GET で得られるが、WordPressはどちらも独自の方法でエスケープしている。(/wp-settings.php
)
このエスケープは強制的に行われるため、フォームを使う場合は stripslashes によるアンエスケープが必要。
// If already slashed, strip.
if ( get_magic_quotes_gpc() ) {
$_GET = stripslashes_deep($_GET );
$_POST = stripslashes_deep($_POST );
$_COOKIE = stripslashes_deep($_COOKIE);
}
// Escape with wpdb.
$_GET = add_magic_quotes($_GET );
$_POST = add_magic_quotes($_POST );
$_COOKIE = add_magic_quotes($_COOKIE);
$_SERVER = add_magic_quotes($_SERVER);
エスケープ処理を行っている関数 add_magic_quotes()
は、/wp-includes/functions.php
で定義されている。
再起処理により、階層の深い配列にも対応するようになっている。
function add_magic_quotes($array) {
global $wpdb;
foreach ($array as $k => $v) {
if ( is_array($v) ) {
$array[$k] = add_magic_quotes($v);
} else {
$array[$k] = $wpdb->escape($v);
}
}
return $array;
}
最終的なエスケープ処理をする $wpdb->escape()
は、/wp-includes/wp-db.php で定義されている。$wpdb は クラス wpdb のインスタンス。
// ====================================================================
// Format a string correctly for safe insert under all PHP conditions
function escape($string) {
return addslashes( $string ); // Disable rest for now, causing problems
if( !$this->dbh || version_compare( phpversion(), '4.3.0' ) == '-1' )
return mysql_escape_string( $string );
else
return mysql_real_escape_string( $string, $this->dbh );
}
進行具合
デバッグ&テスト中。
本番テストということで、アフィリエイト広告のキーワードとして使ってみています。
記事のメタ情報を利用するため、記事ループの中でないと使えないことが判明。サイドバーのアフィリエイト広告に使いたかったのでちょっと残念。
TODO
オプションを保持している変数をクラスオブジェクトにする。
メソッドの引数によるオプションの上書き処理を、オプション用クラスのメソッドとして切り離す。
- 管理画面のオプション設定画面の表示を専用クラスに切り離す。
キーワードをランダムに1つ選択するメソッドの実装。
オプション設定画面の整理。
カスタムフィールドに改行で区切って複数のキーワードが入れられるようにする。
キーワードを得る方法に、配列とJSONを追加。
参考資料