我在一个正在进行的项目中有以下功能,除了我在功能消失时在警告弹出窗口中显示错误消息时,一切都很好。
这是Ajax脚本
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+'¤t_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 = "/";
}
});
},
});
}
});
然后以下是ajax 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功能
中定义的共享收集功能/* 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 :(得分:0)
Codex说wp_die()函数返回500个HTML状态代码。在这种情况下,如果请求失败,请使用qXHR.fail()
方法(或错误回调,尽管已弃用),以捕获错误:
$.ajax({ /* options */ })
.done( function( data, textStatus, jqXHR ) {
alert( "success" );
})
.fail( function( jqXHR, textStatus, errorThrown ) {
alert( "error" );
});
修改强>
我做了一些测试,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()
将响应的内容类型设置为application/json
。
使用json数据调用wp_die()
,或致电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,因为数据类型选项设置为json。
将Wordpress配置为为ajax请求发送500状态
可以将Wordpress配置为使用wp_die_ajax_handler
过滤器为ajax请求发送500状态。
// 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响应中设置success属性,并在.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()
功能
以上是在带有wp_send_json_error()
功能的Wordpress中实现的。
// 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' );