web-dev-qa-db-fra.com

is_singular () ne fonctionne pas s'il est appelé via la fonction de rappel de admin-ajax.php

Dans mon single.php j'ai un code comme celui-ci ...

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

Si j'approche single.php à partir de la page d'index de blog ou de CPT en utilisant the_permalink(), cette condition fonctionne correctement. Il montre "Blog" lorsque j'ouvre un billet de blog et affiche "CPT" lorsque j'ouvre un CPT.

Maintenant, le problème est que si l'approche single.php via une fonction de rappel de admin-ajax.php, elle renvoie toujours "CPT" même si je clique sur le lien d'un article de blog unique. Ma fonction de rappel ajax est quelque chose comme ça ...

    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

Une demande AJAX est une demande nouvelle au serveur et une demande à admin-ajax.php. Cela n'est pas une seule page de publication. Toute logique dépendant de is_single() ou de toute autre balise de modèle de niveau de page similaire ne fonctionnera pas. Si votre rappel AJAX a besoin de ce type d'informations, vous devez le transmettre à ce rappel dans votre demande AJAX, quelque chose comme:

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' );

Votre requête ajax inclurait alors ajax_object.is_single dans les paramètres de la requête, comme dans cet exemple du Codex , qui a passé 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);
    });
});

Votre rappel aurait alors accès aux données via $_POST.

4
s_ha_dum