Google Crisis Response(Google)
災害に関する情報源や、行方不明者情報の収集と検索を行う『パーソンファインダー』を初めとするツールの提供が行われています。

2012年2月4日 土曜日

開発者必見 WordPressのデバッグモード

Filed under: WordPress,ハック,プラグイン
タグ:, , ,
時間:17時47分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

WordPressにはデバッグモードがあります。このモードでは普段抑制されている警告メッセージが表示されるようになり、非推奨APIを使用した場合にメッセージが表示されます。実装されたのは2.5からのようです。

デバッグモードにするには、定数 WP_DEBUGtrue にするための記述を wp-config.php に次のように記述します。3.0からは wp-config-sample.php に初期状態で記述があり、値は false です。

[php]
define(‘WP_DEBUG’, true);
[/php]

今までデバッグモードでの動作確認をしたことのないプラグイン開発者の方は、ぜひ1度行ってください。予想以上に警告が表示されると思います。可能であれば開発用のWordPress環境を用意し、常にデバッグモードにしておくことをお勧めします。

初期化されていない変数への参照

ありがちなのは、初期化されていない変数や配列要素への参照が行われたと言うもの。PHPは初期化しなくても変数と配列要素が使用できますが、これは警告メッセージが表示されます。

[php]
print $data; // 警告が出る
$data = ”;
print $data; // 警告は出ない
[/php]

[php]
$data = array();
print $data[0]; // 警告が出る
$data[0] = ”;
print $data[0]; // 警告は出ない
[/php]

[php]
$data = array();
print $data['i1']; // 警告が出る
$data['i1'] = ”;
print $data['i1']; // 警告は出ない
[/php]

最後のコードでは次のような内容となります。

Notice: Undefined index: i1 in ファイルのパス on line 警告対象のある行

拙作の AmazonLink では配列要素への参照でこの警告が多く出ました。例えば次のようなコードです。

[php]
if ( ” != $dataList['idx'] )
{
// 処理
}
[/php]

この場合、初期化していない $dataList['idx'] を参照すると警告が出ます。そこで、次のように変更しました。

[php]
if ( isset($dataList['idx']) and ” != $dataList['idx'] )
{
// 処理
}
[/php]

非推奨APIの使用

WordPressはAPIの整理を以前から行っており、多くのAPIが非推奨になったり特定の使用方法が非推奨となっています。デバッグモードにするといつから非推奨になったかと代替APIの有無を表示してくれますが、該当箇所として表示されるのは実際の場所ではなく、そのメッセージを表示するための関数が記述された場所になっています。自分のプログラムではないと勘違いしないよう注意が必要です。

次の例は、 get_settings が2.1から非推奨となっているので get_option を使うようにと言うものです。

Notice: get_settings is deprecated since version 2.1! Use get_option() instead. in ファイルのパス/wp-includes/functions.php on line 3237

この例ではほぼ単純な置き換えだけですのでわかりやすいのですが、中には何が悪いのかわかりにくいものがあります。

add_option

Function Reference/add option(WordPress.ORG Codex)

オプションを追加するためのAPIです。引数が4つありますが、オプションの説明を指定する3つ目の引数は2.3から非推奨となりました。メッセージだけを見るとAPI自体が非推奨になって代替APIがないように思えてしまいますが、実際には引数の1つだけが対象です。警告が表示されないようにするには、引数を空文字('')にします。

add_options_page

Function Reference/add options page(WordPress.ORG Codex)

管理画面にオプションページへのサブメニューを追加するAPIです。ややこしいのは、WP_User::has_cap での警告となること。その処理の過程で WP_User::has_cap が呼ばれるためこのようになってしまうのです。

2.0以前はユーザーレベルとして0~10の数値だった3つ目の引数が2.0で権限を示す文字列になり、3.0からは数値での指定は非推奨となりました。

なお、数値での指定をすると同じ関数にある次のAPIによって文字列に置き換えられます。

[php]
/**
* Convert numeric level to level capability name.
*
* Prepends ‘level_’ to level number.
*
* @since 2.0.0
* @access public
*
* @param int $level Level number, 1 to 10.
* @return string
*/
function translate_level_to_cap( $level ) {
return ‘level_’ . $level;
}
[/php]

置き換えられた結果得られる文字列は、権限グループに再度割り当てなおされると説明されています。単純にこの処理と同じことをすれば警告は出なくなりますが、将来のことを考えればきちんと権限または権限グループを示す文字列に置き換えるのが賢明でしょう。

Comments (0)

HTML convert time: 0.103 sec. Powered by