You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress插件中通过AJAX正确调用includes目录下的action_save_data.php文件?

解决WordPress插件中AJAX调用PHP文件找不到的问题

嘿,我完全懂你遇到的坑——直接用相对路径调用插件里的PHP文件在WordPress环境里很容易出错,因为前端JS的路径是相对于当前访问页面的URL,而不是你的插件目录。下面给你两种解决方案,更推荐第一种符合WordPress规范的做法:

方法一:使用WordPress标准AJAX机制(推荐)

WordPress内置了一套安全且规范的AJAX处理流程,能彻底避免路径问题,步骤如下:

1. 改造插件主文件,注册AJAX动作并传递必要参数

把action_save_data.php里的业务逻辑移到插件主文件中,同时注册AJAX动作、传递前端需要的URL和安全验证字段:

<?php
/**
 * Plugin Name: ETBO test
 * Plugin URI: http://cma-ecg.com/ebot/
 * Text Domain: ETBO-TEST
 * License: GPL-2.0+
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
 */

add_shortcode('etbo_test' , 'render_test');
function render_test(){
    // 注册并加载你的JS文件,依赖jQuery
    wp_enqueue_script('etbo-wizard-js', plugin_dir_url(__FILE__) . 'assets/js/wizard-3.js', array('jquery'), '', true);
    // 向JS传递WordPress环境变量(AJAX地址、安全验证码)
    wp_localize_script('etbo-wizard-js', 'ETBO_AJAX', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('etbo_save_data_nonce') // 防止CSRF攻击的安全码
    ));

    ?>
    <html lang="en" >
    <!-- 你的HTML代码 -->
    </html>
    <?php
}

// 处理登录用户的AJAX请求
add_action('wp_ajax_etbo_save_data', 'etbo_handle_save_data');
// 处理未登录用户的AJAX请求(如果你的功能允许游客使用)
add_action('wp_ajax_nopriv_etbo_save_data', 'etbo_handle_save_data');

function etbo_handle_save_data(){
    // 先验证安全码,提升安全性
    check_ajax_referer('etbo_save_data_nonce', 'nonce');
    
    // 这里放你原来action_save_data.php里的所有逻辑
    // 比如接收POST数据、保存到数据库、发送邮件等
    $form_data = $_POST;
    // 你的业务处理代码...
    
    // 返回响应结果
    if(/* 处理成功的判断条件 */){
        echo 1;
    } else {
        echo '处理失败:请检查表单数据格式';
    }
    wp_die(); // 必须用这个函数结束AJAX请求,否则会返回多余内容
}

2. 修改wizard-3.js中的AJAX请求代码

function saveData(){
    var data = $("#kt_form").serialize();
    // 追加安全码和AJAX动作标识
    data += '&nonce=' + ETBO_AJAX.nonce + '&action=etbo_save_data';
    
    $.ajax({
        type : 'POST',
        url : ETBO_AJAX.ajax_url, // 使用WordPress提供的标准AJAX地址
        data: data,
        success : function(response) {
            if(response==1){
                Swal.fire({
                    text: "Resultados Guardados y Enviados por Correo.",
                    icon: "success",
                    buttonsStyling: false,
                    confirmButtonText: "Ok, entendido!",
                    customClass: {
                        confirmButton: "btn font-weight-bold btn-primary",
                    }
                });
            }else{
                alert(response);
            }
        }
    });
}

方法二:直接获取插件目录下PHP文件的绝对URL(适合快速测试)

如果你暂时不想调整AJAX逻辑,也可以通过WordPress函数获取插件目录的绝对URL,传递给前端JS:

1. 在插件主文件中传递PHP文件的绝对路径

function render_test(){
    wp_enqueue_script('etbo-wizard-js', plugin_dir_url(__FILE__) . 'assets/js/wizard-3.js', array('jquery'), '', true);
    wp_localize_script('etbo-wizard-js', 'ETBO_PATHS', array(
        'save_data_url' => plugin_dir_url(__FILE__) . 'includes/action_save_data.php'
    ));
    // 你的HTML代码...
}

2. 修改JS中的请求URL

function saveData(){
    var data = $("#kt_form").serialize();
    $.ajax({
        type : 'POST',
        url : ETBO_PATHS.save_data_url, // 使用绝对URL避免路径错误
        data: data,
        // 其余代码保持不变...
    });
}

注意:第二种方法跳过了WordPress的安全校验机制,正式项目里强烈建议用第一种方案,同时记得根据业务需求添加权限检查、数据过滤等安全措施。

内容的提问来源于stack exchange,提问作者Claudio Martinez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:17:35