2014-07-15 3 views
1

Эта функция находится в функции functions.php, но возвращает 0 только из обратного вызова AJAX. Я не могу понять, что мне нужно сделать, чтобы он работал правильно.Функция пользовательского запроса Wordpress Возврат ответа AJAX 0

function CaseStudiesAjaxFunction() { 
    global $post; 

    $verticle = $_GET["verticle"]; 
    $product = $_GET["product"]; 
    $source = $_GET["source"]; 
    $args = array(
      'posts_per_page' => '12', 
      'tag' => array($verticle, $product, $source) 
      ); 
    $query = new WP_Query($args); 
    $matching_posts = array(); 
    if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); 
    the_post_thumbnail(); 
    the_title(); 
    endwhile; 
    endif; 
    wp_reset_query(); 
    die(); 
} 

Вот Jquery AJAX

function filterCaseStudies() { 
    var data = ($('#case-studies-form').serialize()); 
    alert(data); 
    var request = $.ajax({ 
     type: 'GET', 
     url: case_studies_ajax_script.ajaxurl, 
     dataType: 'text', 
     data: data + "&action=CaseStudiesAjaxFunction" 
     }); 
request.done(function(data){ 
$('.case-studies-container').html(data); 
    console.log("Request success: " + data); 
}); 
request.fail(function(jqXHR, textStatus) { 
    alert("Request failed: " + textStatus); 
}); 

Данные, кажется, переходя от формы правильно, как я могу эхо обратно переменные и обратный вызов AJAX видит их.

ответ

1

Вы видите на '0' ответ от admin-ajax.php вероятно потому, что вы еще не зарегистрированы крюки действия AJAX для этой функции.

Чтобы правильно зарегистрировать функцию для вызова AJAX, вам необходимо использовать крючок действия wp_ajax_* для функций, доступных администратору, и wp_ajax_nopriv_*, чтобы сделать его доступным на лицевой стороне.

В вашем JavaScript-вызове AJAX настроен неправильно - done() и success() устарели в jQuery 1.8. Вместо этого вы должны использовать обратные вызовы «полный», «успешный» и «ошибка».

Использование POST - рекомендуемый способ обработки запросов AJAX в WordPress. Поскольку это уникальный запрос, нет причин для вызова wp_reset_query().

От личного предпочтения я бы вернул JSON, а не просто сбросил значения с помощью функций the_*. Неплохая идея проверить isset() на ваши значения формы, чтобы убедиться, что у вас нет неопределенных ошибок индекса. Кроме того, поскольку я немного OCD, это должно быть "по вертикали", а не "Verticle" :)

PHP

function CaseStudiesAjaxFunction() { 
    global $post; 

    $vertical = isset($_GET["vertical"])? $_GET["vertical"] : ''; 
    $product = isset($_GET["product"])? $_GET["product"] : ''; 
    $source = isset($_GET["source"])? $_GET["source"] : ''; 
    $args = array(
      'posts_per_page' => '12', 
      'tag' => array($verticle, $product, $source) 
      ); 
    $query = new WP_Query($args); 
    if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); 
     the_post_thumbnail(); 
     the_title(); 
    endwhile; endif; 
    die(); 
} 
// Add the ajax hooks for admin 
add_action('wp_ajax_CaseStudiesAjaxFunction', 'CaseStudiesAjaxFunction'); 
// Add the ajax hooks for front end 
add_action('wp_ajax_nopriv_CaseStudiesAjaxFunction', 'CaseStudiesAjaxFunction'); 

JavaScript

function filterCaseStudies(){ 
    var data = $('#case-studies-form').serialize(); 
    $.ajax({ 
     type: 'GET', 
     url: case_studies_ajax_script.ajaxurl, 
     dataType: 'text', 
     data: data + "&action=CaseStudiesAjaxFunction", 
     complete: function(xhr, status){ 
      console.log("Request complete: " + status); 
     }, 
     error: function(xhr, status, errorThrown){ 
      console.log("Request failed: " + status); 
     }, 
     success: function(data, status, xhr){ 
      console.log("Request success: " + data); 
      // change the html 
      $('.case-studies-container').html(data); 
     } 
    }); 
} 
+0

Спасибо за код. Раньше у меня были крючки. Я пробовал ваш код дословно, и ответ пуст. – user3841979

+0

.. и это не OCD, я просто не могу писать. – user3841979

+0

Возможно, что запрос фактически ничего не возвращает. Мне нужно посмотреть на это и вернуться. – user3841979

0

Он возвращает 0, потому что файл admin-ajax.php заканчивается на die('0').

+0

Спасибо за информацию. Любые предложения, как заставить это работать? – user3841979

0

Когда я сделал WP Ajax-звонки в прошлом, я обязательно должен echo json_encode() все данные в хорошо отформатированный ответ JSON, а затем позвонить die() после. Вместо использования функций, которые печатают или эхо (the_title()), вы можете включить их в переменную, которую вы возвращаете ($title = get_the_title()).

Вы можете вернуть все почтовые данные и HTML в массиве, кодировать его, как JSON, а затем декодировать:

function ajax_call(){ 
    // Run a loop 
    $return['code'] = 100; 
    $return['content'] = get_the_content(); //etc, etc 
    // End loop 
    echo json_encode($return); 
    die(); 
} 
+0

В примере не используется JSON ... – doublesharp

+0

JSON - это просто способ инкапсуляции данных, что упрощает (во многих случаях) передачу правильно отформатированных данных. Это именно то, как я работал с вызовами AJAX. –

+0

Я знаю, что такое JSON, и это то, что я буду использовать, если бы это был мой код, но если вы посмотрите пример, то функции 'the_ *' используются, чтобы просто отбрасывать значения в ответ, а затем AJAX использует 'html() 'для обновления содержимого элемента DOM. – doublesharp