私のsingle.php
には、こんなコードがあります。
if(is_singular('post')) {
echo 'Blog';
} else {
echo 'CPT';
}
the_permalink()
を使用してブログまたはCPTインデックスページからsingle.php
にアクセスすると、この条件は正しく機能します。単一のブログ記事を開くと「Blog」と表示され、単一のCPTを開くと「CPT」と表示されます。
今問題はsingle.php
の何らかのコールバック関数を介してadmin-ajax.php
に近づくならば、私が単一のブログ投稿リンクをクリックしたとしても常に 'CPT'をエコーすることです。私のAjaxのコールバック関数はこのようなものです...
function ajax_callback() {
get_template_part( 'single', 'portfolio' );
die(); // to avoide 0 at the end
}
add_action('wp_ajax_ajax_callback', 'ajax_callback');
add_action('wp_ajax_nopriv_ajax_callback', 'ajax_callback');
AJAXリクエストは、サーバーへのnewリクエストであり、 admin-ajax.php
へのリクエスト。それはは単一の投稿ページではありません。 is_single()
またはそのような他のページレベルテンプレートタグに依存するロジックは動作しません。 AJAXコールバックがそのような情報を必要とする場合、AJAXリクエストでそのコールバックに渡す必要があります。
function my_enqueue($hook) {
wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
if( is_single() ) {
// in javascript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
wp_localize_script(
'ajax-script',
'ajax_object',
array( 'is_single' => true )
);
}
}
add_action( 'wp_enqueue_scripts', 'my_enqueue' );
Ajaxリクエストには、クエリパラメータの一部としてajax_object.is_single
が含まれます。これは このCodexの例 のように、ajax_object.we_value
をwhatever
として渡します。
jQuery(document).ready(function($) {
var data = {
action: 'my_action',
whatever: ajax_object.we_value // We pass php values differently!
};
// We can also pass the url value separately from ajaxurl for front end AJAX implementations
jQuery.post(ajax_object.ajax_url, data, function(response) {
alert('Got this from the server: ' + response);
});
});
コールバックは、$_POST
を介してデータにアクセスできます。