JQuery AJAX PHP函数调用返回[对象对象]

时间:2019-02-20 作者:Rollor

我想使用jQuery Ajax重新加载页面。我有下面的代码,但是,它不工作,正在返回错误[object Object]

这只是一个简单的语法问题,还是我的整个逻辑都有问题?它在没有Javascript的情况下工作得很好,但我认为使用jQuery Ajax的UI更直观。

functions.php

//enqueue scripts
function my_theme_enqueue_scripts() {
     wp_enqueue_script(\'jquery-ui\', \'https://code.jquery.com/ui/1.12.1/jquery-ui.min.js\', array(\'jquery\'), \'1.12.1\');
     wp_register_script( \'myjs\', get_stylesheet_directory_uri() . \'/my.js\', array(\'jquery\'),\'1.0.0\');
     wp_enqueue_script(\'myjs\');
     wp_localize_script( \'ajax-script\', \'admin-ajax\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );
}
add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_scripts\' );

function load_projectmessages($projectid) {
     global $wpdb;
     $sql_displaymessages = $wpdb->prepare("some sql", $projectid );
     $projectmessages = $wpdb->get_results($sql_displaymessages);
     return $projectmessages;
     wp_die();
}
add_action(\'wp_ajax_load_projectmessages\', \'load_projectmessages\');

Page Template PHP:

<form id="form-pm" method="post" enctype="multipart/form-data" action="">
            <table>
                <tr>
                    <td><textarea name="projectMessage" rows=3 id="project-message"></textarea></td>
                </tr>
                <tr>
                    <td><input type="submit" name="send" value="send message"></td>
                </tr>
            </table>
        </form>

my.js

function getUrlVars()
    {
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf(\'?\') + 1).split(\'&\');
        for(var i = 0; i < hashes.length; i++)
        {
            hash = hashes[i].split(\'=\');

            if($.inArray(hash[0], vars)>-1)
            {
                vars[hash[0]]+=","+hash[1];
            }
            else
            {
                vars.push(hash[0]);
                vars[hash[0]] = hash[1];
            }
        }
        return vars;
    }

    $("#form-pm").submit(function(e) {

        e.preventDefault();
        var pID = getUrlVars()["id"];
        $.ajax({
            url: "admin-ajax.ajax_url",
            type: "POST",
            data: {
                action: "load_projectmessages",
                projectid: pID
            },
            success: function(data) { },
            error: function(errorData) { alert(errorData); }
        });
        return false;
    });

1 个回复
SO网友:Krzysiek Dróżdż

好的,那么您的代码有多个问题。。。

1。脚本的本地化不正确

以下是您的函数,用于对脚本进行排队和本地化:

function my_theme_enqueue_scripts() {
     wp_enqueue_script(\'jquery-ui\', \'https://code.jquery.com/ui/1.12.1/jquery-ui.min.js\', array(\'jquery\'), \'1.12.1\');
     wp_register_script( \'myjs\', get_stylesheet_directory_uri() . \'/my.js\', array(\'jquery\'),\'1.0.0\');
     wp_enqueue_script(\'myjs\');
     wp_localize_script( \'ajax-script\', \'admin-ajax\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );
}
add_action( \'wp_enqueue_scripts\', \'my_theme_enqueue_scripts\' );
所以您本地化了名为ajax-script, 但没有注册这样的脚本。它应该是:

wp_localize_script( \'myjs\', \'admin-ajax\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );

2。中的变量名称不正确wp_localize_script 第二个参数是将在JS中创建的变量的名称。你把admin-ajax 这不是变量的正确名称。

将其更改为:

wp_localize_script( \'myjs\', \'MyJS_Data\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );

3。中的AJAX url不正确$.ajax 在my中调用。您拥有的js文件:

$("#form-pm").submit(function(e) {

    e.preventDefault();
    var pID = getUrlVars()["id"];
    $.ajax({
        url: "admin-ajax.ajax_url",
        type: "POST",
        data: {
所以你传递了一个字符串"admin-ajax.ajax_url" 字符串作为URL,但这不是正确的URL地址。。。

它应该是:

url: MyJS_Data.ajax_url,
因为您想使用变量,而不是字符串,我们在2中更改了该变量的名称。。。

4。AJAX回调函数的用法不正确

在PHP代码中,您有:

function load_projectmessages($projectid) {
     global $wpdb;
     $sql_displaymessages = $wpdb->prepare("some sql", $projectid );
     $projectmessages = $wpdb->get_results($sql_displaymessages);
     return $projectmessages;
     wp_die();
}
add_action(\'wp_ajax_load_projectmessages\', \'load_projectmessages\');
但是。。。此函数不打印任何内容,因此AJAX请求不会得到任何结果。

另一方面,你要做两件事:

 return $projectmessages;
 wp_die();
因此,您的函数将返回(而不是打印)$projectmessages。不会调用下一行,因为当您返回值时,函数将结束其执行。

所以应该是这样的:

function load_projectmessages($projectid) {
     global $wpdb;
     $sql_displaymessages = $wpdb->prepare("some sql", $projectid );
     $projectmessages = $wpdb->get_results($sql_displaymessages);
     echo json_encode( $projectmessages );
     wp_die();
}
add_action(\'wp_ajax_load_projectmessages\', \'load_projectmessages\');
这样,您的函数将“返回”编码为JSON的$projectmessages。

相关推荐

如何通过AJAX“加载更多”帖子?

关于分类法{name}。php模板用于我的“组织”分类法,我目前显示的帖子数量有限,按分类法的每个术语“格式”分组。如果可用帖子的数量超过了可显示的数量,我现在想启用基于AJAX的加载更多帖子。我已经关注了无数关于这个主题的教程和StackExchange问题,但有些东西仍然没有点击。例如,我实现了Misha Rudrastyh\'s \"Load More\" button, 但代码不会加载任何帖子。我迷路了,快要放弃了。我有一个帖子块,上面有这样一个“更多”链接,准备好了,等待着。。。这对应于一个分类