2015-03-26 4 views
0

У меня есть следующая функция в проекте im, над которым работает, и все до сих пор отлично работает, кроме того, что я застрял, показывая сообщение об ошибке во всплывающем окне, когда функция умирает.WP Show wp die error как предупреждение

Это Ajax Script

jQuery(window).load(function() { 
     action = jQuery.QueryString["action"]; 
     collection_id = jQuery.QueryString["cc"]; 
     current_userid = jQuery.QueryString["cu"]; 
     user_name = jQuery.QueryString["su"]; 
     collection_name = jQuery.QueryString["cn"]; 
     cbcolor = jQuery.QueryString["ccol"]; 
     permission = jQuery.QueryString["permission"]; 

     if(action == 'sharecookbook' && jQuery('body').hasClass('logged-in')) { 
      new jQuery.flavr({ 
       content  : 'Do you really want to add this collection?', 
       dialog  : 'confirm', 
       onConfirm : function(){ 
        jQuery.ajax({ 
         url: wpb_ajax_url, 
         data: 'action=wpb_sharecollection&collection_id='+collection_id+'&current_userid='+current_userid+'&user_name='+user_name+'&collection_name='+collection_name+'&cbcolor='+cbcolor+'&permission='+permission+'&nonce='+ajax_object.nonce, 
         dataType: 'JSON', 
         type: 'POST', 
         success:function(data){ 
          window.location = "/"; 
         } 
        }); 
       }, 
      }); 
     } 
    }); 

Тогда следующий Аякс PHP Funtion

/* share new collection */ 
    add_action('wp_ajax_nopriv_wpb_sharecollection', 'wpb_sharecollection'); 
    add_action('wp_ajax_wpb_sharecollection', 'wpb_sharecollection'); 
    function wpb_sharecollection(){ 
     global $wpb; 
     $output = ''; 
     extract($_POST); 

     check_ajax_referer('ajax_form_nonce', 'nonce'); 

     $wpb->share_collection($current_userid,$collection_id,$collection_name,$cbcolor,$user_name,$permission); 

     wp_send_json ($output); 
    } 

И следующая функция сбора доли определен в выше PHP Funtion

/* Share collection */ 
function share_collection($uid,$id,$name,$cbcolor,$user,$permission) { 

    $cbcolor = str_replace(" ", "#", $cbcolor); 
    $type = 'shared'; 

    $user_id = get_user_by('email', $user); 
    $collections = $this->get_collections($user_id->ID); 
    $collectionsdata = $this->get_collectionsdata($user_id->ID); 
    $collectionsdataoriginal = $this->get_collectionsdata($uid); 
    $collectionsdatashared = $this->get_collectionsdatashared($uid); 

    foreach($collectionsdata as $j => $ajj) { 
     if (isset($ajj['parent']) && $ajj['parent'] == $id && isset($ajj['owner']) && $ajj['owner'] == $uid) { 
      wp_die('This is an error', 'Error');     
     } 
    } 
    $collections[] = array(); 
    $collectionsdata[] = array('label' => $name,'cbcolor' => $cbcolor,'owner' => $uid,'parent'=>$id,'type' => $type,'permission' => $permission); 
    $collectionsdataoriginal[$id] = array('label' => $name,'cbcolor' => $cbcolor,'owner' => $uid,'type' => $type); 

    $idx = count($collectionsdata) - 1; 

    $collectionsdatashared[] = array('myid'=>$id,'suser' => $user_id->ID,'child'=>$idx); 

    update_user_meta($user_id->ID, '_wpb_collections', $collections); 
    update_user_meta($user_id->ID, '_wpb_collectionsdata', $collectionsdata); 
    update_user_meta($uid, '_wpb_collectionsdata', $collectionsdataoriginal); 
    update_user_meta($uid, '_wpb_collectionsdatashared', $collectionsdatashared); 
} 

В последнем коде вы видите, что wp_die определен с сообщением об ошибке. Мне нужно предупредить об этом, когда функция умирает для пользователя. Можете ли вы предложить способ сделать это.

Заранее спасибо

ответ

0

Кодекса говорит, что wp_die() функция возвращает 500 HTML код статуса. В том случае, если запрос не использовать qXHR.fail() метод (или обратного вызова ошибки, хотя это не рекомендуется), чтобы поймать ошибку:

$.ajax({ /* options */ }) 
.done(function(data, textStatus, jqXHR) { 
    alert("success"); 
}) 
.fail(function(jqXHR, textStatus, errorThrown) { 
    alert("error"); 
}); 

EDIT:

Я сделал некоторые испытания и wp_die() возвращает 500 статус , но не для вызовов ajax. Для ajax он просто печатает ответное сообщение и умирает. Вот несколько сценариев.

Вызов wp_die() с простой строкой сообщения

wp_die('Error message', 'Error'); 

код состояния 200, но JQuery вызывает .fail() обратный вызов с parsererror сообщением. jQuery ожидает json (не text/html, что wp_die() возвращается), как определено в datatype опция. Если вы удалите опцию datatype, jQuery попытается угадать тип данных, основанный на типе ответа MIME. wp_send_json() задает Content-Type ответа на application/json.

Вызов wp_die() с данными JSON, или позвонив по телефону wp_send_json()

wp_die(wp_json_encode(array('status' => 'error', 'message' => 'Error message')));  // text/html; 
wp_send_json(array('status' => 'success', 'data' => 'output'));       // application/json 

.done() обратного вызова вызывается и передаются данные JSON, единственное отличие состоит в том, что позже функция устанавливает Content-Type для application/json, но JQuery будет попробуйте проанализировать оба ответа как json, поскольку для параметра datatype установлено значение json.

Настройка Wordpress для отправки 500 статуса для AJAX просит

Wordpress может быть настроен на отправку 500 статуса для Ajax запросов с wp_die_ajax_handler фильтром.

// example: wp_die('Error message', 'Error', 500); 

add_filter('wp_die_ajax_handler', function($handler) { 

    return function($message, $title, $args) use ($handler) { 

     if (isset($args['response']) && $args['response'] == 500) { 
      header("HTTP/1.1 500 $title"); 
      die($message); 
     } 

     $handler($message); 
    }; 

}); 

Решение без wp_die() функции

Простой способ без wp_die() бы установить свойство успеха в ответ JSon, и проверить, что свойство в .done() обратного вызова.

// php 

wp_send_json(array('success' => true, 'data' => 'output')); // for success 
wp_send_json(array('success' => false, 'data' => 'Error message')); // for failure 

// js 

jqXHR.done(function(data) 
{ 
    if (data.success) console.log(data.data); 
    if (!data.success) console.log(data.data);  
}); 

wp_send_json_error() функция

выше реализуется в Wordpress с wp_send_json_error() функции.

// sets a JSON response as array('success' => false, 'data' => 'Error message'), then calls wp_send_json() and wp_die(). 
wp_send_json_error('Error message'); 
+0

благодарит за ваш ответ. он не работает. однако, когда я смотрел на консоль, она не выглядела так, как будто это порождает 500 ошибок –

Смежные вопросы