WordPress自定义PHP页面如何调用WP函数获取usermeta
场景说明
基于PHP+Javascript开发第三方手机短信年龄认证功能,通过WordPress短代码add_shortcode实现认证发起入口,认证完成后第三方服务会回调自定义的success.php文件返回认证结果,需要在回调逻辑中判断用户登录状态、将认证结果写入用户元数据(usermeta)。
认证发起短代码实现
if (! function_exists ( 'register_mycustom_agecert_page' ) ) { function register_mycustom_agecert_page () { $mid ='**********'; // 服务商提供的商户ID $apiKey ='********************************'; // 对应商户ID的API密钥 $mTxId ='***********'; $reqSvcCd ='01'; // 生成商户身份校验哈希 $plainText1 = hash("sha256",(string)$mid.(string)$mTxId.(string)$apiKey); $authHash = $plainText1; $userName = 'Anonymous'; $userPhone = '01011112222'; $userBirth ='19830000'; $flgFixedUser = 'N'; // 固定用户传参时设为Y if($flgFixedUser=="Y") { $plainText2 = hash("sha256",(string)$userName.(string)$mid.(string)$userPhone.(string)$mTxId.(string)$userBirth.(string)$reqSvcCd); $userHash = $plainText2; } $output = ''; $output .= '<div align="center" class="age-gate-wrapper">'; $output .= '<form name="saForm">'; $output .= '<input type="hidden" name="mid" value="' . $mid . '">'; $output .= '<input type="hidden" name="reqSvcCd" value="' . $reqSvcCd . '">'; $output .= '<input type="hidden" name="mTxId" value="' . $mTxId . '">'; $output .= '<input type="hidden" name="authHash" value="' . $authHash .'">'; $output .= '<input type="hidden" name="flgFixedUser" value="' . $flgFixedUser . '">'; $output .= '<input type="hidden" id="userName" name="userName">'; $output .= '<input type="hidden" id="userPhone" name="userPhone">'; $output .= '<input type="hidden" id="userBirth" name="userBirth">'; $output .= '<input type="hidden" name="userHash" value="' . $userHash . '">'; $output .= '<input type="hidden" name="directAgency" value="">'; $output .= '<input type="hidden" name="successUrl" value="' . esc_url( get_stylesheet_directory_uri() . '/kg/success.php' ) . '">'; $output .= '<input type="hidden" name="failUrl" value="'. esc_url( get_stylesheet_directory_uri() . '/kg/success.php' ) . '">'; $output .= '</form>'; $output .= '<button onclick="callSa()">Proceed to Age Verification</button>'; $output .= '</div>'; echo $output; } add_shortcode( 'register_mycustom_agecert_page', 'register_mycustom_agecert_page'); }
认证弹窗脚本
function callSa() { let authPopup = popupCenter(); if(authPopup != undefined && authPopup != null) { document.saForm.setAttribute("target", "sa_popup"); document.saForm.setAttribute("method", "post"); document.saForm.setAttribute("action", "https://sa.inicis.com/auth"); document.saForm.submit(); } } function popupCenter() { let _width = 400; let _height = 620; var xPos = (document.body.offsetWidth/2) - (_width/2); xPos += window.screenLeft; // 适配双显示器居中 return window.open("", "sa_popup", "width="+_width+", height="+_height+", left="+xPos+", menubar=yes, status=yes, titlebar=yes, resizable=yes"); }
问题表现
回调文件success.php放在子主题/kg/目录下,核心逻辑是接收第三方返回的认证结果,校验用户年龄是否满20岁,认证通过则给当前登录用户写入ageCert、ageCertDate两个usermeta字段。
测试时认证成功后可以正常输出Success - Process 01,但后续依赖WordPress函数的逻辑完全不执行,既不输出Success - Process 02也不输出Failure - Process 02。
原因定位
自定义的PHP文件默认不会加载WordPress运行环境,is_user_logged_in()、get_current_user_id()、update_user_meta()、wp_login_url()这些WordPress原生函数都未定义,代码执行到调用这些函数的位置就会中断。
初始方案梳理
一开始考虑过三个解决方向:
- 对接WordPress REST API,把认证结果传到API接口,通过WP内置的接口逻辑写入用户数据
- 直接写原生PHP连接WordPress数据库,手动操作usermeta表完成数据读写
- 手动加载WordPress核心运行环境,让自定义页面可以直接调用WP原生函数
最终解决方法
在success.php文件最顶部引入WordPress根目录的wp-load.php文件,即可加载完整的WordPress运行时环境,所有原生函数、钩子都可以正常使用。
添加的代码如下:
// 替换为站点实际的WordPress根目录路径,常规站点可以直接用文档根目录 $wp_root = $_SERVER['DOCUMENT_ROOT']; require_once( $wp_root . '/wp-load.php' );
添加后测试所有逻辑正常运行,可以正确判断用户登录状态、完成年龄校验、写入用户认证元数据。
内容的提问来源于stack exchange,提问作者pacomini

