it-roy-ru.com

is_singular () не работает, если вызывается через функцию обратного вызова admin-ajax.php

В моем single.php у меня есть такой код ...

if(is_singular('post')) {
   echo 'Blog';
} else {
   echo 'CPT';
} 

Если я подхожу к single.php со страницы блога или страницы CPT с помощью the_permalink(), это условие работает правильно. При открытии одного сообщения в блоге отображается "Блог", а при открытии одного 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 - это новый запрос к серверу, и это запрос к 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 как часть параметров запроса, как в этом примере из Кодекса , который передал 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.

4
s_ha_dum