自作プラグインをWordPrss公式サイトへ登録申請したら拒否された話

## Calling core loading files directly

## Calling file locations poorly

[上] WordPressのコアファイルを直接読み込んでいるから絶対ダメ!
[下] ローカルファイルの読込方法がよくありません。

上記2つのエラーはお互いに関わっていて、今回の間違いで一番変更を加えた部分です。

これらのエラーはWordPressでのAJAXの使用におけるルールから逸脱していた故のエラーでした。

という事でWordpressでのAJAXのルール通りにすれば必然と解消される不具合なので、以下はWordpressのAJAX使用方法の手順です。

[php]
/*
AJAX呼び出し側
! url : admin-ajax.php を呼び出す(nonceが要るのか分かりません)
! action : admin-ajaxで使用する特別な変数でオリジナルの値を入れておく
*/
<script type="text/javascript">
jQuery.ajax({
url: <?php echo wp_nonce_url( bloginfo( ‘wpurl’ ) . ‘/wp-admin/admin-ajax.php’, ‘isp_users_guide’ ); ?>,
data: {
action: ‘isp_users_guide’,
code: code
},
dataType: ‘json’,
type: ‘POST’,
success: function(data) {
…(何らかの処理)…
}
});
</script>

/*
AJAX受け取り側(PHP)
*/
// pluginファイル
<?php
// AJAXのactionで指定した値の先頭に「wp_ajax_」を付加する(ここではwp_ajax_isp_users_guide)
add_action( ‘wp_ajax_isp_users_guide’, ‘ug_ajax’ );

function ug_ajax() {
include_once( dirname(__FILE__) . "/ajax.php" );
die();
// 当然ですが、わざわざAJAX用のファイル(ajax.php)を呼び出さなくてもこの中で処理できます
// 最後のdie()は必要
}
?>

// AJAX用ファイル
<?php
if ( ! defined( ‘ABSPATH’ ) ) exit;

// nonceの検証
$nonce = $_REQUEST[‘_wpnonce’];
if ( ! wp_verify_nonce( $nonce, ‘isp_users_guide’ ) ) {
die( ‘セキュリティーチェック エラー’ );
}
…(何らかの処理)…
?>
[/php]

Javascript側のポイントは

  • AJAXのurlは「admin-ajax.php」を呼び出すこと
  • 必ず「action」という属性を含めること

PHP側のポイントは

  • 送付されたactionの値の先頭に「wp_ajax_」を付加して「add_action( ‘wp_ajax_値’, ‘関数’ )」で呼び出すこと
  • 処理の完了時に必ず「die」関数を行うこと

これでWordpressのルールに則ったAJAX処理が可能です。

ちなみに最後の「die」関数が無い場合、処理後に0が出力されるのでjs側でエラーが出る可能性があります。

尚、WordPress CODEXの説明では「SACKライブラリ」を利用しています。知らなかったので調べてみると簡単にAJAX処理が行えるWordpress付属のライブラリらしいです。

私もSACKライブラリの使用を検討していたのですが、どうもPHP側でjavascriptコードを直接出力する必要がありそうでした。

[php]
echo ‘alert("Hello World!");’;
[/php]

こんなゾッとするような事はしたくない(jsのコードはjsの中で書きたい)のでjqueryのAJAXを利用しました。

冒頭のエラーの件ですが、今まで「admin-ajax.php」ではなく独自の「ajax.php」を直接呼び出していた為にajax.phpの中でwp-load.phpを直接読み込むようにしていました。それが直接コアファイルを読み込んでしまう事になっていたので間違いでした。

そしてそのコアファイルを呼び出す為に場所を指定する際に「wp-content/plugins」という不確かなディレクトリを指定しているのが更にダメ出しを喰らう原因となっていました。

[php]
/* 修正前 ajax.php */
<?php
// $wpdbを利用する
$path = str_replace( ‘wp-content/plugins/wp-users-guide’, ”, __DIR__ );
require_once( $path . ‘wp-load.php’ );
require_once( dirname(__FILE__) . "/functions.php" );
?>
[/php]

しかしadmin-ajax.phpを介する事により、安全に$wpdbを利用したり定数を利用できるようになります。

[php]
/* 修正後 ajax.php */
<?php
if ( ! defined( ‘ABSPATH’ ) ) exit;

// nonceの検証
$nonce = $_REQUEST[‘_wpnonce’];
if ( ! wp_verify_nonce( $nonce, ‘isp_users_guide’ ) ) {
die( ‘セキュリティーチェック エラー’ );
}
?>
[/php]

以上が、私が申請時に認められなかったエラーです。
これから公式サイトに登録しようとしているクリエイターさんの一助になれば幸いです。