Параметр Ajax и WP_Query / tax_query

Проведя некоторые обширные исследования, я исчерпал все свои возможности и решил задать вопрос здесь. Я пытаюсь получить отфильтрованный набор сообщений через AJAX, используя WP_Query и параметр tax_query.

В настоящее время у меня есть один пользовательский тип сообщения, называемый «Условия словарного запаса» и две пользовательские таксономии, называемые «категориями словарного запаса» и «уровень сложности». По сути, я хочу, чтобы пользователи могли выбирать категорию, затем уровень сложности и загружать любые сообщения, помеченные каждым. Ниже приведены мои php-функции и js. Кажется, я могу фильтровать по Условиям Vocabulary, но второй, я пытаюсь передать что-либо в tax_query, он терпит неудачу.

Есть идеи?

Ajax-игры-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-игра-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 

Ваш код выглядит хорошо, но он терпит неудачу, потому что ваша пользовательская таксономия не регистрируется нигде в действительных перехватах вызова AJAX.

Я предполагаю, что вы регистрируете свои пользовательские таксономии в соответствии с документацией о таксономии , в которой говорится, что вы добавляете ее в «init». Тем не менее, «init» не вызывается во время вызова AJAX. Он вызывается только при типичном запросе страницы или запросе страницы администратора (см. Документацию по Action Reference ). (Примечание: справочная документация по действиям в кодексе кажется действительно устаревшей, она не включает список действий, выполняемых во время запроса AJAX.)

Обход проблемы: когда вам нужен доступ к вашим пользовательским таксономии, вручную выполните действие init в начале вашей функции ajax следующим образом:

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