WordPressでAjaxで固定ページをロードしたらプラグインのショートコードが動作しなくてハマった
WordPressで、Ajaxを使って非同期に他の固定ページのコンテンツをロードして表示するページを作成しました。
期待通りに動作していたのですが、TablePressを導入して、
そのショートコードを固定ページに挿入したら、
ショートコードのままのデータがAjaxで返ってきてしまいました。
Ajaxでなければ大丈夫
Ajaxを使わずに、固定ページのURL(〜/?page_id=**)でアクセスするページも作成しているのですが、
そちらは期待通りショートコードが変換されて表示されました。
どちらの処理でも、全く同じ以下の方法でページのコンテンツを取得しています。
$page = get_post( get_the_ID() );
echo apply_filters('the_content', $page->post_content);
また、自分で functions.php に add_shortcode で定義したショートコードはどちらでもちゃんと変換されました。
なので、どうもAjaxの場合にプラグインが正しくロードされていないように感じました。
Ajaxの実装方法がダメだった
Ajaxは以下のページを参考にして実装していましたが、
AjaxでWordPressのコンテンツを遷移せず表示させる | Show-web
こちらの方法で実装したら正しく動作するようになりました。
WordPress ページングはやめてAjaxローディングにする | hijiriworld Web
つまり
add_action( 'wp_ajax_hoge', 'hoge' ); add_action( 'wp_ajax_nopriv_hoge', 'hoge' );
を使うのは、管理画面でAjaxを使う場合であって、公開部分でAjaxを使う場合は、
自分でデータを返すphpファイル用意して、それにリクエスト投げろ。
ってことのようです。
公式ページに書いてありました。ちゃんと調べてなかっただけでした。。
AJAX in Plugins - WordPress Codex 日本語版
その他
公式ページのサンプルには無かったですが、
Ajaxのリクエストを処理するphpファイルでWordPressの関数を使う場合は、以下を記述する必要があるようです。
require_once("../../../wp-config.php");
ただ、僕が参考にしたページでは上記のようにしているのですが、
管理画面向けのAjaxを処理するadmin-ajax.phpを覗いたら、以下のように実装されてました。
define( 'DOING_AJAX', true ); require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
この他にも、レスポンスヘッダを設定するような処理もしているみたいでした。
なので、僕の場合はwp-config.phpをrequireするだけで動作しましたが、
この辺の処理を追加しないと動作しないケースもあるのかも知れません。