WordPress中无法调用wp_get_current_user()函数问题排查
问题:调用
wp_get_current_user()时提示未定义函数? 错误信息
Uncaught Error: Call to undefined function wp_get_current_user()
涉及文件与代码
tweet.php 代码
<? require_once("pluggable.php"); require_once("codebird.php"); \Codebird\Codebird::setConsumerKey("XXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); $cb = \Codebird\Codebird::getInstance(); $current_user = wp_get_current_user(); $wp_user_id = $current_user->ID; $user_info = get_userdata($wp_user_id); $twitter_id = get_user_meta($wp_user_id, "twitter_id", true); $access_token = get_user_meta($wp_user_id, "twitter_access_token", true); $access_token_secret = get_user_meta($wp_user_id, "twitter_access_token_secret", true); $cb->setToken($access_token, $access_token_secret); $media_id = $cb->media_upload(array( "media" => $_FILES["image"]["tmp_name"] ))->media_id_string; $params = array( "status" => $_POST["text"], "media_ids" => $media_id ); $result = $cb->statuses_update($params); echo json_encode($result);
前端调用代码
var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == XMLHttpRequest.DONE) { var response = xhr.responseText; } } xhr.open("POST", "wp/wp-includes/tweet.php", true); xhr.send(formData);
环境信息
- WordPress版本:6.1.1
- PHP版本:7.4.28
- 服务器:Apache
- 主题:Keni8.0(子主题Keni8.0 (Child Theme))
- 已安装插件:Advanced Editor Tools、Akismet Anti-Spam、codoc、Enhanced Media Library、EWWW Image Optimizer、Otter、Really Simple SSL、Regenerate Thumbnails、Social Login by miniOrange、UpdraftPlus、WP-CopyProtect、WP Fastest Cache、WP Multibyte Patch
核心疑问
tweet.php和pluggable.php在同一目录,为什么还是调用不了wp_get_current_user()?
解决方案
原因分析
直接单独访问tweet.php并只引入pluggable.php行不通,因为WordPress的核心函数依赖整个框架的初始化环境:pluggable.php里的函数需要在WordPress核心加载完成后才能正常工作,而且当前用户的会话信息也需要WordPress的初始化流程来处理,单独引入单个文件无法构建完整的运行环境。
修复步骤
方案1:改用WordPress官方AJAX机制(推荐)
这是WordPress规范且安全的做法,不要直接访问wp-includes下的自定义文件:
- 把
tweet.php的逻辑整合到主题的functions.php里,或者做成独立插件 - 添加AJAX处理函数:
// 登录用户可访问的AJAX动作 add_action('wp_ajax_tweet_post', 'handle_tweet_post'); // 允许非登录用户访问(按需开启) add_action('wp_ajax_nopriv_tweet_post', 'handle_tweet_post'); function handle_tweet_post() { // 验证防CSRF攻击(必须添加) check_ajax_referer('tweet_nonce', 'security'); // 引入codebird(根据实际存放路径调整) require_once(get_template_directory().'/codebird.php'); \Codebird\Codebird::setConsumerKey("XXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); $cb = \Codebird\Codebird::getInstance(); // 现在可正常调用WP核心函数 $current_user = wp_get_current_user(); if (!$current_user->ID) { wp_send_json_error('用户未登录'); wp_die(); } $wp_user_id = $current_user->ID; $twitter_id = get_user_meta($wp_user_id, "twitter_id", true); $access_token = get_user_meta($wp_user_id, "twitter_access_token", true); $access_token_secret = get_user_meta($wp_user_id, "twitter_access_token_secret", true); $cb->setToken($access_token, $access_token_secret); // 安全验证文件上传 if (!isset($_FILES["image"]) || $_FILES["image"]["error"] != UPLOAD_ERR_OK) { wp_send_json_error('图片上传失败'); wp_die(); } $media_id = $cb->media_upload(array( "media" => $_FILES["image"]["tmp_name"] ))->media_id_string; $params = array( "status" => sanitize_text_field($_POST["text"]), "media_ids" => $media_id ); $result = $cb->statuses_update($params); wp_send_json_success($result); wp_die(); // 必须结束AJAX请求 }
- 修改前端AJAX请求:
// 获取WordPress内置AJAX地址和防CSRF验证串 var ajaxUrl = '<?php echo admin_url('admin-ajax.php'); ?>'; var nonce = '<?php echo wp_create_nonce('tweet_nonce'); ?>'; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == XMLHttpRequest.DONE) { var response = JSON.parse(xhr.responseText); // 处理响应结果 } } xhr.open("POST", ajaxUrl, true); // 向FormData添加必要参数 formData.append('action', 'tweet_post'); formData.append('security', nonce); xhr.send(formData);
方案2:直接引入WordPress核心初始化文件(不推荐)
如果非要保留原文件位置,需要在tweet.php开头引入wp-load.php来初始化整个WordPress环境:
<?php // 调整路径确保能找到wp-load.php,示例中WordPress根目录在/wp下 require_once('../../wp-load.php'); require_once("pluggable.php"); require_once("codebird.php"); // 后续代码不变
这种方式虽能解决函数未定义问题,但存在安全风险,直接暴露自定义文件在wp-includes目录易被恶意访问,优先推荐方案1。
内容的提问来源于stack exchange,提问作者Hassy
相关产品推荐
相关产品推荐

