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

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下的自定义文件:

  1. 把tweet.php的逻辑整合到主题的functions.php里,或者做成独立插件
  2. 添加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请求
}
  1. 修改前端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:12:11