【问题标题】:WordPress Ajax Call -- WordPress User IDWordPress Ajax 调用——WordPress 用户 ID
【发布时间】:2016-07-08 17:38:21
【问题描述】:

我正在开发一个基于 Wordpress 的网站,但我是新手。基本上,我们使用插件来跟踪网站上的“点数”,并且我正在使用调用来获取用户的游戏 wordpress ID。但是,问题是当我进行 ajax 调用时,它会为用户 ID 返回 0(也就是未登录),但是当我直接访问 PHP 页面时,它会给我实际的用户 ID(例如:9)。这是我在 PHP 文件中调用的插件函数:

function cp_currentUser() {

require_once(ABSPATH . WPINC . '/pluggable.php');
global $current_user;
get_currentuserinfo();
return $current_user->ID;

}

然后这是我的 PHP 文件

<?php

header("Access-Control-Allow-Origin: *");

require_once("wp-load.php");

echo cp_currentUser();

?>

这是我的跨域 AJAX 调用

$.post('http://my.domain.xz/cp_getbalance.php', {}, function(result){

console.log(result);

});

如果您在登录时直接在浏览器中访问上述 URL,它将为您提供用户 ID,但如果我从 AJAX 调用尝试它,无论我以谁登录,我都只会得到 0。

【问题讨论】:

  • 这是正确的行为。当您从不同的域触发 AJAX 调用时,会话不存在,因此 wp_get_current_user() 不返回任何内容。当您通过浏览器点击链接时,WP 能够根据 Cookie 识别会话。
  • 你可以尝试在ajax调用中调用get方法吗?
  • 你如何保护这些脚本呢?只是不公开显示界面/脚本就足够了吗?

标签: javascript php jquery ajax wordpress


【解决方案1】:

在我看来,你的方法是错误的。

您无法从 cookie(客户端)获取有关它在服务器(服务器端)处理的数据的信息。

你需要做的是:

  • 在AJAX POST调用前恢复current_user->ID

  • 在 POST 中发送检索到的 ID

  • 通过服务器处理通过 $_POST 变量检索的数据。

一个例子。

您的 PHP 文件:

header("Access-Control-Allow-Origin: *");

require_once("wp-load.php");

echo $_POST['user_id'];

您的跨域 AJAX 调用:

<?php
require "wp-load.php";
global $current_user:
$user_id = $current_user->ID;
?>
var formData = {
    'user_id': '<?php echo $user_id; ?>'
};
//console.log(formData);

$.ajax({
    url: "http://my.domain.xz/cp_getbalance.php",
    type: "post",
    data: formData,
    success: function(result) {
        console.log(result);
    }
});

话虽如此,在 Wordpress 中,AJAX 调用以完全不同的方式完成,我建议您阅读本指南以更好地理解:https://codex.wordpress.org/AJAX_in_Plugins

希望对我有所帮助

【讨论】:

  • 假设我将我的 user_id 转发到“cp_getbalance.php”。我真的需要在“cp_getbalance.php”上发出数据库请求来检查 user_level 是否符合我的需要吗?我想有更好(更简单)的方法,但我找不到任何好的教程。
  • 原谅我,但是如果不调用数据库来提取您当前没有的某些数据,您需要什么?向我解释您的具体需求,也许会找到更好的解决方案。
  • 我在与普通用户相同的自定义页面上有“编辑器”界面(类似于您在此处看到的 youtube.com/watch?v=aujNp92p0Uc)。但我只希望编辑器能够进行更改。这就是为什么我通常根据用户ID检查用户级别的原因。但是,如果我只是将级别发布到 ajax 页面,任何人都可以劫持它,对吧?
  • 我要找的是这个。 stackoverflow.com/questions/3362207/…
  • 但是如你所见,概念是一样的。拿起令牌并邮寄,不要做相反的事情。但是,您正在寻找的是使您的脚本与您请求的参数一起工作
【解决方案2】:

试试这个:wp_get_current_user()

require_once("wp-load.php");  //Please confirm your wp-load path
$current_user = wp_get_current_user();
echo $current_user->ID;
exit;

【讨论】:

  • 它仍然返回 0 ;/。该脚本在不从 ajax 调用而直接加载 php 页面时有效。
【解决方案3】:

您可能应该始终使用wp_die(),无论是否在Ajax 回调中。更好的是,用wp_send_json()options 发回信息。

require_once("wp-load.php");  //Please confirm your wp-load path
$current_user = wp_get_current_user();
echo $current_user->ID;
 wp_die(); // this is required to terminate immediately and return a proper response

【讨论】:

    【解决方案4】:

    在 WordPress 中使用 AJAX 的方式有点不对。

    首先你应该添加扩展你的函数:

    add_action( 'wp_ajax_nopriv_cp_currentUser', 'cp_currentUser' );
    function cp_currentUser() {
      $current_user = wp_get_current_user();
    
      header("Access-Control-Allow-Origin: *");
      header("Access-Control-Allow-Methods: POST");
    
      echo $current_user->ID;
    
      wp_die();
    }
    

    函数 get_currentuserinfo() 已弃用 (Codex)。

    第二个你的 Ajax 函数:

    $.ajax({
       url: 'https://my.domain.xz/wp-admin/admin-ajax.php',
       method: 'POST',
       data: { action: 'cp_currentUser' }
    }).done( function( response ) {
       console.log( response );
    });
    

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2017-10-04
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 2023-03-26
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多