php - Wordpress ajax 返回带有 php 开始标记的 JSON

标签 php jquery json ajax wordpress

我正在 wordpress 中创建一个 ajax 注册。我处理从 JS 发送到 PHP 的数据,然后使用下面的代码发回响应。

wp_send_json(array('success' => 'false', 'message' => __( 'Please select a user type.' )));

但我得到的 JSON 响应总是以 php 开始标记开头。

<?php{"success":"false","message":"Please select a user type."}

找不到导致此问题的原因。

这是我的 php 代码

<?php

if ( !is_user_logged_in() ) {
    add_action( 'init', 'auth_init' );
}

function auth_init() {
    wp_enqueue_script( 'user-auth-js', get_stylesheet_directory_uri() . '/assets/js/user-auth.js', array(), false, true );

    add_action( 'wp_ajax_nopriv_ajax_registration', 'ajax_registration');
}

add_action( 'buddyboss_after_header', 'registration_modal' );
function registration_modal() {
    if ( !is_user_logged_in() && !bp_is_register_page() ) {
        $bp = buddypress();

        if( empty( $bp->signup->step ) )
            $bp->signup->step='request-details';

        get_template_part( 'partials/content', 'registration-modal' );
    }
}

/**
 * Ajax Registration
 */
function ajax_registration(){

    check_ajax_referer( 'ajax-register-nonce', 'security' );

    $info = array();

    $info[ 'user_nicename' ]    = sanitize_user( $_POST[ 'username' ] );
    $info[ 'nickname' ]         = sanitize_user( $_POST[ 'username' ] );
    $info[ 'display_name' ]     = sanitize_user( $_POST[ 'username' ] );
    $info[ 'user_login' ]       = sanitize_user( $_POST[ 'username' ] );
    $info[ 'user_pass' ]        = sanitize_text_field( $_POST[ 'password' ] );
    $info[ 'user_email' ]       = sanitize_email( $_POST[ 'email' ] );

    // Checks if user type entered is valid
    if ( !$_POST[ 'user_type' ] ) {
        wp_send_json(array('success' => 'false', 'message' => __( 'Please select a user type.' )));
    }
    elseif ( sanitize_text_field( $_POST[ 'user_type' ] ) === 'client' ) {
        $info[ 'role' ] = 'client';
    }
    elseif ( sanitize_text_field( $_POST[ 'user_type' ] ) === 'vendor' ) {
        $info[ 'role' ] = 'vendor';
    }
    else {
        wp_send_json(array('success' => 'false', 'message' => __( 'Invalid user type selected.' )));
    }

    // Registers the user
    $user_register = wp_insert_user( $info );

    // Checks for errors returned
    if ( is_wp_error( $user_register ) ) {
        $error = $user_register->get_error_codes();

        if ( in_array( 'empty_user_login', $error ) ) {
            wp_send_json(array('success' => 'false', 'message' => __( $user_register->get_error_message( 'empty_user_login' ) )));
        }
        elseif ( in_array( 'existing_user_login', $error ) ) {
            wp_send_json(array('success' => 'false', 'message' => __( 'This username you entered is already registered.' )));
        }
        elseif ( in_array( 'existing_user_email', $error ) ) {
            wp_send_json(array('success' => 'false', 'message' => __( 'This email address you entered is already registered.' )));
        }
    }
}

/**
 * Log in user
 * @param  string $username Username
 * @param  string $password Password
 * @return boolean           [description]
 */
function auth_user_login( $username, $password ) {
    $info = array();
    $info[ 'user_login' ]       = $username;
    $info[ 'user_password' ]    = $password;
    $info[ 'remember' ]         = true;

    $user_signon = wp_signon( $info, false );
    if ( is_wp_error( $user_signon ) ) {
        return false;
    } else {
        wp_set_current_user( $user_signon->ID );
        return true;
    }
}

user-auth.js

$(function () {

    $( '#signup_submit' ).click(function(e) {
        e.preventDefault();
        var btn = $( this ).button( 'loading' );

        var data = {
            action: "ajax_registration",
            user_type: $( 'input[name=signup_user_type]:checked', '#signup_form' ).val(),
            username: $( '#signup_username' ).val(),
            password: $( '#signup_password' ).val(),
            email: $( '#signup_email' ).val(),
            security: $( '#registration-security' ).val()
        };

        $.post( ajaxurl, data, function( response ) {
            console.log( response );
            btn.button( 'reset' );
        } );

    });


});

最佳答案

第一个解决方案

在您的 php 代码中与您的注册表单或表单处理程序相关的任何地方,您是否使用了类似这样的东西?

<?php function xxxxxx (){ ?>

<p>some text </p>

<?php } ?>

如果是就改成喜欢

<?php 
function xxxxxx (){ 
$vriable = '<p>some text </p>';
return $vriable
}

第二解

wp_send_json() 处理 AJAX 调用中返回内容的所有部分。首先,它使用适当的字符集将返回内容的内容类型设置为 application/json。其次,它在发送 JSON 结果后自动调用 wp_die(),这在 WordPress 中的 AJAX 调用中是必需的。

您可以考虑对成功请求使用 wp_send_json_success(),对错误请求使用 wp_send_json_error(),从而遵守 WordPress 处理 AJAX 请求的标准。这些函数在数组中设置 success( bool 值)和 data(任何类型)键并对整个数组进行编码,从而使您可以轻松地以结构化方式检查请求是否是成功还是出了什么问题。

我已经稍微修改了你的代码

<?php
if ( !is_user_logged_in() ) {


    function auth_init() {
        wp_enqueue_script( 'user-auth-js', get_stylesheet_directory_uri() . '/assets/js/user-auth.js', array(), false, true ); 
    }
    add_action( 'init', 'auth_init' );


    function registration_modal() {
        if ( !is_user_logged_in() && !bp_is_register_page() ) {
            $bp = buddypress();

            if( empty( $bp->signup->step ) )
                $bp->signup->step='request-details';

            get_template_part( 'partials/content', 'registration-modal' );
        }
    }
    add_action( 'buddyboss_after_header', 'registration_modal' );

    /**
     * Ajax Registration
     */

    function ajax_registration(){

        check_ajax_referer( 'ajax-register-nonce', 'security' );
        $info = array();

        $info[ 'user_nicename' ]    = sanitize_user( $_POST[ 'username' ] );
        $info[ 'nickname' ]         = sanitize_user( $_POST[ 'username' ] );
        $info[ 'display_name' ]     = sanitize_user( $_POST[ 'username' ] );
        $info[ 'user_login' ]       = sanitize_user( $_POST[ 'username' ] );
        $info[ 'user_pass' ]        = sanitize_text_field( $_POST[ 'password' ] );
        $info[ 'user_email' ]       = sanitize_email( $_POST[ 'email' ] );

        // Checks if user type entered is valid
        if ( !$_POST[ 'user_type' ] ) {
            wp_send_json_error(array('success' => 'false', 'message' => __( 'Please select a user type.' )));
        }
        elseif ( sanitize_text_field( $_POST[ 'user_type' ] ) === 'client' ) {
            $info[ 'role' ] = 'client';
        }
        elseif ( sanitize_text_field( $_POST[ 'user_type' ] ) === 'vendor' ) {
            $info[ 'role' ] = 'vendor';
        }
        else {
            wp_send_json_error(array('success' => 'false', 'message' => __( 'Invalid user type selected.' )));
        }

        // Registers the user
        $user_register = wp_insert_user( $info );

        // Checks for errors returned
        if ( is_wp_error( $user_register ) ) {
            $error = $user_register->get_error_codes();

            if ( in_array( 'empty_user_login', $error ) ) {
                wp_send_json_error(array('success' => 'false', 'message' => __( $user_register->get_error_message( 'empty_user_login' ) )));
            }
            elseif ( in_array( 'existing_user_login', $error ) ) {
                wp_send_json_error(array('success' => 'false', 'message' => __( 'This username you entered is already registered.' )));
            }
            elseif ( in_array( 'existing_user_email', $error ) ) {
                wp_send_json_error(array('success' => 'false', 'message' => __( 'This email address you entered is already registered.' )));
            }
        }
    }
    add_action( 'wp_ajax_nopriv_ajax_registration', 'ajax_registration');
    /**
     * Log in user
     * @param  string $username Username
     * @param  string $password Password
     * @return boolean           [description]
     */
    function auth_user_login( $username, $password ) {
        $info = array();
        $info[ 'user_login' ]       = $username;
        $info[ 'user_password' ]    = $password;
        $info[ 'remember' ]         = true;

        $user_signon = wp_signon( $info, false );
        if ( is_wp_error( $user_signon ) ) {
            return false;
        } else {
            wp_set_current_user( $user_signon->ID );
            return true;
        }
    }

}

关于php - Wordpress ajax 返回带有 php 开始标记的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859629/

相关文章:

javascript - 将 json 转换为嵌套的 JavaScript 对象

javascript - AJAX 传递变量问题

javascript - php 中的 header() 不工作

jquery鼠标悬停动画跳跃

java - GSON 从 JSON 文件到 Java 类的映射

json - 普通表单提交与 JSON

PHP 面向对象 : Duplicate Code in a Class

php - 从 SOAP react 中提取某些元素

php - 当用户失去文本区域的焦点时更新 mysql 中的表?

jquery 将 div 包装到列中