読者です 読者をやめる 読者になる 読者になる

WordPressでAjaxで固定ページをロードしたらプラグインのショートコードが動作しなくてハマった

WordPress

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するだけで動作しましたが、
この辺の処理を追加しないと動作しないケースもあるのかも知れません。