WordPress环境下如何在函数内触发$.post请求调用外部PHP代码
问题原因及修复方案
核心错误点
- WordPress 默认 jQuery 运行在无冲突模式,直接使用
$调用会抛出未定义错误 $.post提交的参数对象缺少大括号,属于JS语法错误- 事件回调内无需重复包裹
$(document).ready,属于冗余逻辑 - 独立
gen3.php未加载WordPress核心,无法直接使用$wpdb等全局对象,且相对路径无法正确定位文件,大概率返回404 - 直接调用独立PHP文件不符合WordPress开发规范,存在安全隐患,推荐使用官方AJAX接口处理
修正后代码(推荐使用WordPress原生AJAX方案)
1. functions.php 完整代码
// 注册AJAX处理接口(登录用户可触发) add_action('wp_ajax_update_gen3_data', 'update_gen3_data'); // 注册AJAX处理接口(未登录用户可触发,不需要可以删掉) add_action('wp_ajax_nopriv_update_gen3_data', 'update_gen3_data'); function update_gen3_data() { global $wpdb; // 校验参数 if (!isset($_POST['name'])) { wp_send_json_error('参数缺失'); } $name = intval($_POST['name']); if ($name === 25) { $wpdb->update( 'Gen3', array('tvalue' => 1), array('id' => 25), array('%d'), array('%d') ); wp_send_json_success('更新成功'); } wp_die(); // AJAX处理结束必须加这行终止执行 } // 输出前端JS代码 add_action( 'wp_footer', 'mycustom_wp_footer' ); function mycustom_wp_footer() { // 输出AJAX接口地址给前端调用 $ajax_url = admin_url('admin-ajax.php'); ?> <script type="text/javascript"> // 传入$参数解决jQuery无冲突问题 jQuery(function($){ var wpcf7Elm = document.querySelectorAll( '.wpcf7' ); wpcf7Elm.forEach(function(formr){ formr.addEventListener( 'wpcf7submit', function( event ) { var gen3_name = "25"; // 修正后的$.post请求 $.post( '<?php echo $ajax_url; ?>', { action: 'update_gen3_data', // 对应后台注册的AJAX钩子名 name: gen3_name }, function(res) { // 可选:打印返回结果调试 console.log(res); } ); var idform = event.detail.unitTag; alert (idform); }, false ); }) }); </script> <?php }
2. 可删除独立的gen3.php文件
所有PHP处理逻辑已经移到functions.php的AJAX回调函数中,无需单独保留gen3.php。
如果你一定要保留独立gen3.php的适配方案(不推荐)
需要修改两个地方:
- 给gen3.php开头加入WordPress核心加载代码(路径根据你gen3.php的存放位置调整,以下是放在主题根目录的示例)
// 加载WordPress核心,路径如果不对自行调整 require_once dirname(__FILE__) . '/../../../wp-load.php'; global $wpdb; if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == "25") { $wpdb->update('Gen3', array('tvalue' => 1,), array('id' => 25), array('%d'), array('%d')); } // 执行完退出 exit; }
- 修改前端JS的$.post路径为绝对路径,或者输出主题目录地址拼接路径,示例:
$.post( '<?php echo get_stylesheet_directory_uri() ?>/gen3.php', { name: gen3_name } );
内容的提问来源于stack exchange,提问作者Entity_45
相关产品推荐
相关产品推荐

