WordPress 中带有 jQ​​uery 的 AJAX:AJAX 调用未将属性值传递给 PHP 函数

Posted

技术标签:

【中文标题】WordPress 中带有 jQ​​uery 的 AJAX:AJAX 调用未将属性值传递给 PHP 函数【英文标题】:AJAX with jQuery in WordPress: AJAX call not passing property value to PHP function 【发布时间】:2013-03-28 01:13:20 【问题描述】:

所以我正在尝试构建一个非常简单的东西——一个具有状态和区域的表单,当您选择一个状态时,它会填充区域列表。我的表单有两个菜单,#select-region(状态)和#select-area。这是我的 .js 文件中包含的 jQuery 代码:

jQuery(document).ready(function() 
    jQuery("#select-region").change(function()
    //alert(jQuery("#select-region").val());
    regionID = jQuery("#select-region").val();
    jQuery.ajax(
            type: 'POST',
            url: 'http://dev.sitename.com/wp-admin/admin-ajax.php',
            data: 
                action: 'get_area_menu',
                region_id: regionID,
            ,
            success: function(data, textStatus, XMLHttpRequest)
                jQuery("#select-area").html('');
                jQuery("#select-area").append(data);
            ,
            error: function(XMLHttpRequest, textStatus, errorThrown)
                alert(errorThrown);
            
        );
     );
);

'get_area_menu()' 函数在我的functions.php 文件中。代码如下:

function get_area_menu($region_id)
    $areas = get_areas($region_id);

    $menu_output = "<option>" . count($areas) . "</option>";
    foreach($areas as $area) 
        $menu_output = $menu_output . "<option value=" . $area['area_id'] . ">" . $area['name'] . "</option>";
    
    die($menu_output);

add_action('wp_ajax_get_area_menu', 'get_area_menu');
add_action('wp_ajax_nopriv_get_area_menu', 'get_area_menu');

`

现在,我已经验证了在将 region_id 传递给它时,上述函数中调用的“get_areas()”函数可以正常工作,但由于某种原因,region_id 变量没有被传递给 get_area_menu()来自 AJAX 调用。 FWIW,我已经将脚本排入队列并将其本地化(尽管我仍然不知道这实际上意味着什么),这段代码靠近 functions.php 的顶部:

wp_enqueue_script('jquery');
wp_enqueue_script('sitename', get_template_directory_uri() . '/scripts/sitename.js');
wp_localize_script( 'sitename', get_template_directory_uri() . '/scripts/sitename.js', $params);

伙计们,我已经无计可施了。我错过了什么?

【问题讨论】:

我不熟悉 Wordpress,所以这可能不适用。但是您是否尝试过传入$_POST['region_id'] 而不是$region_id?这是在 PHP 中访问 POST 变量的标准方式。 因为我使用 jQuery 来获取 #select-region 更改时的当前值 (regionID = jQuery("#select-region").val();),所以该变量是实际上并未发布,因此不在“POST”范围内。也许我错了?没有任何地方实际使用 $_POST['region_id'] 因为在这种情况下,$region_id 被用作函数中的属性。 我不明白。在您的$.ajax 电话中,您有这个:data: action: 'get_area_menu', region_id: regionID。这意味着$_POST['action']$_POST['region_id'] 应该存在于PHP 端。否则,您还希望从哪里获得 region_id 的值? AJAX 调用是在下拉菜单更改上执行的,而不是表单发布,那么这些数据如何存在于服务器上的发布范围内?使用以下代码在 JS 文件中获取该下拉列表的值:'regionID = jQuery("#select-region").val();' 也许我误解了“数据”的工作原理。我认为“动作”是您尝试在服务器上调用的函数,所有后续属性/变量都只是传递给该函数。换句话说,'data: action: 'get_area_menu', region_id: regionID' 应该将“regionID”(在 JS 中设置)的值作为名为“region_id”的属性传递给 PHP 函数 get_area_menu(),不是吗? 【参考方案1】:

我唯一能看到的是在你的get_area_menu 函数中更改这一行

$areas = get_areas(isset($_POST['region_id']) ? $_POST['region_id'] : $region_id);

【讨论】:

我完全迷路了。如果未发布表单,region_id 将如何进入发布范围?特别是因为 PHP 代码使用 $region_id 作为传入的属性。 你使用 POST 从 Ajax 调用这个函数来传递参数:)

以上是关于WordPress 中带有 jQ​​uery 的 AJAX:AJAX 调用未将属性值传递给 PHP 函数的主要内容,如果未能解决你的问题,请参考以下文章

IE8/9 中带有 jQ​​uery 和 XDomainRequest 的 CORS

判断一个元素是不是有一个带有 jQ​​uery 的 CSS 类

通过单击带有 jQ​​uery 的锚点来平滑滚动元素

使用带有 jQ​​uery 插件的 Browserify

带有 jQ​​uery 异步 AJAX 调用的 While 循环

带有 jQ​​uery 的 Asp Mvc 视图