WP显示wp模具错误作为警报

时间:2015-03-26 17:22:54

标签: php jquery ajax wordpress

我在一个正在进行的项目中有以下功能,除了我在功能消失时在警告弹出窗口中显示错误消息时,一切都很好。

这是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+'&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 = "/";  
                        }
                    });
                },
            });
        }
    });

然后以下是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定义了错误消息。当函数死于用户时,我需要提醒这个。你能建议一种方法吗?

提前致谢

1 个答案:

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