web-dev-qa-db-fra.com

Paramètre Ajax et WP_Query/tax_query

Après des recherches approfondies, j'ai épuisé toutes mes options et j'ai décidé de poser une question ici. J'essaie d'obtenir un ensemble filtré de publications via AJAX à l'aide de WP_Query et du paramètre tax_query.

J'ai actuellement un type de message personnalisé appelé "Termes de vocabulaire" et deux taxonomies personnalisées appelées "catégories de vocabulaire" et "niveau de difficulté". Ce que je veux que les utilisateurs fassent, c'est essentiellement de sélectionner une catégorie, puis un niveau de difficulté et de charger les publications étiquetées avec chacune d'elles. Ci-dessous sont mes fonctions php et js. Il semble que je puisse filtrer par termes de vocabulaire, mais à la seconde où je tente de transmettre quoi que ce soit dans tax_query, cela échoue.

Des idées?

ajax-game-functions.php

function get_game_difficulty() {

// Nonce check
$nonce = $_REQUEST['nonce'];
if (!wp_verify_nonce($nonce, 'ajax_scripts_nonce')) die(__('Busted.'));

global $wpdb;
global $wp_query;
global $post;
global $terms;


$html = "";
$success = false;
$gameCategory = $_REQUEST['gameCategory'];
$gameDifficulty = $_REQUEST['gameDifficulty'];

$html .= '<h2>Listen and repeat each Word you hear until you feel comfortable pronouncing each Word.</h2>';
$html .= $gameCategory;
$html .= $gameDifficulty;

$html .= '<ul>';
$args = array(
    'numberposts' => 5,
    'post_type' => 'vocabulary_terms',
    'tax_query' => array(
        array(
            'taxonomy' => 'vocabulary_categories',
            'field' => 'slug',
            'terms' => $gameCategory
        )
    )
);
$myposts = get_posts( $args );
foreach( $myposts as $post ) :  setup_postdata($post);
    $title = get_the_title();
    $html .= '<li>'.$title.'</li>';
endforeach;
$html .= '</ul>';

// Build the response...
$success = true;
$response = json_encode(array(
    'success' => $success,
    'html' => $html
));

// Construct and send the response
header("content-type: application/json");
echo $response;
exit;
}
add_action('wp_ajax_nopriv_get_game_difficulty', 'get_game_difficulty' );
add_action('wp_ajax_get_game_difficulty', 'get_game_difficulty' );

ajax-game-scripts.js

$(document).on('click', '#vocabulary-games a.difficulty-level', function() {
//$('#vocabulary-games a.difficulty-level').click(function(){
// Store category slug in variable

var vocab_difficulty = $(this).attr('data-difficulty');
var vocab_cat = $(this).attr('data-category');

// post data to function
$.post(ajax_scripts.ajaxurl, {
    dataType: "jsonp",
    action: 'get_game_difficulty',
    nonce: ajax_scripts.nonce,
    gameDifficulty: vocab_difficulty,
    gameCategory: vocab_cat
  }, function(response) {
    if (response.success===true) {
      $('#vocabulary-games').children().fadeOut('slow',function(){
        //$('#vocabulary-categories').children().hide(1,function(){
          $('#vocabulary-games').append().html(response.html);
        //});
      });
    } else {
      alert('!');
      // Bad Response message
    }
});
  }); // end click
2
jkhedani

Votre code semble correct, mais il échoue car votre taxonomie personnalisée n'est pas enregistrée dans les crochets d'action d'un appel AJAX.

Mon hypothèse est que vous enregistrez vos taxonomies personnalisées conformément à la Documentation sur les taxonomies , qui vous recommande de l'ajouter au crochet d'action "init". Cependant, "init" n'est pas appelé pendant un appel AJAX. Il n'est appelé que lors d'une requête de page standard ou d'une requête de page administrateur (voir la Action Reference documentation ). (Remarque: la documentation de référence des actions dans le codex semble vraiment obsolète, elle n'inclut aucune liste d'actions exécutées lors d'une requête AJAX.)

Solution: lorsque vous avez besoin d'accéder à vos taxonomies personnalisées, exécutez manuellement l'action init au début de votre fonction ajax comme suit:

function get_game_difficulty() {
  do_action("init");

  // Code that relies on custom taxonomies being registered can be used below.
  ...
}
add_action('wp_ajax_nopriv_get_game_difficulty', 'get_game_difficulty' );
add_action('wp_ajax_get_game_difficulty', 'get_game_difficulty' );
6
figureone