web-dev-qa-db-ja.com

admin-ajax.phpのコールバック関数を介して呼び出された場合、is_singular()は機能しません

私の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');
1
Faisal Khurshid

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_valuewhateverとして渡します。

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を介してデータにアクセスできます。

4
s_ha_dum