如何从节点js中的wordPress获取当前用户id?

时间:2019-02-17 作者:VladSiy

wordpress上有一个网站,在插件文件夹中,我有一个关于Node js的项目。在索引中。html(客户端部分,大部分是js),有一些内容我只能向注册用户显示。我需要找出在wordpress中注册的用户的数据,并将其传输到node js。

使用Ajax,我将用户id从php传输到js文件。下面是我的代码的一部分:WP/function。php

add_action(\'wp_ajax_cur_user_id\', \'get_cur_user_id\'); 
function get_cur_user_id(){
    check_ajax_referer( \'wt_nonce\', \'wt_nonce_code\' );

    $wt_name = esc_attr($_POST[\'wt_name\']);
    $wt_user_id = esc_attr($_POST[\'wt_user_id\']);

    wp_die();
}

add_action( \'wp_enqueue_scripts\', \'wt_ajax_data\' );
function wt_ajax_data() {

    wp_enqueue_script(\'ajax_get_cur_user_id\', plugins_url(\'/js/ajax_get_cur_user_id.js\'), array( \'jquery\' ));

    wp_localize_script( \'ajax_get_cur_user_id\', \'wt_data_user\', array(
        \'ajaxurl\' => admin_url(\'admin-ajax.php\'),
        \'wt_nonce\' => wp_create_nonce(\'wt_nonce\'),
        \'wt_name\' => wp_get_current_user()->display_name,
        \'wt_user_id\' => wp_get_current_user()->id
    ));
}
在JS文件中,我接收数据并将其发送到node JS,据我所知,node JS根本不知道WordPress的存在。代码:JS/ajax\\u get\\u cur\\u user\\u id.JS

(function($) {
    $.getScript( "/socket.io/socket.io.js", function( data, textStatus, jqxhr ) {

        var socket = io(\'/\', {path : \'/trade/socket.io\'});
        var data = {
            action: \'cur_user_id\',
            wt_nonce_code: wt_data_user.wt_nonce,
            wt_name: wt_data_user.wt_name,
            wt_user_id: wt_data_user.wt_user_id
        };

        $.post( wt_data_user.ajaxurl, data, function(response) {
            socket.emit(\'validate\', wt_data_user);
        });
    });
})(jQuery);
因此,我在页面“index.html”(节点)上获得注册用户的ID​​js)。这正是我想要的,但当我做所有事情时,我发现了以下问题。指数html是一个页面,其链接位于每个注册用户的个人帐户中。目前,指数。html就像一个普通的群组聊天室。即,如果用户已输入个人帐户,则索引中将显示用户ID。html,最后一个上载/更新wordpress页面的人,此ID将显示给索引中的每个人。html页面。就我而言,这不应该。我需要在索引上确保这一点。html页面仅显示活动用户数据,即user\\u id=1仅显示id-1,因为user\\u id=2 id-2显示,无论最后登录或更新页面的是谁。

UPDATE我将澄清我的任务。我做了一个交易平台。WordPress中有注册用户,他们有自己的个人帐户、余额和交易历史记录。

使用node js和websocket,我实现了一个交易平台。在索引中。html(节点​​js)有一个带有货币对和两个按钮的表:买入和卖出。当用户单击按钮时,我需要在单击时确定金额。为此,我需要获取user\\u id,以便与他的个人帐户建立连接,并能够根据交易结果从他的帐户中补充余额或提取资金。

理论上:使用wp\\u ajax\\u,我可以将当前的\\u user\\u id传输到一个JS文件,然后使用ajax POST将数据发送到节点JS服务器。在服务器上,我仍然需要以某种方式获取当前用户,联系数据库并更改其个人帐户。但我不知道如何做到这一点,用什么模块。

这是服务器端:节点/应用程序。js公司

const redis = require(\'redis\');
var app = require(\'express\')();
var http = require(\'http\').Server(app);
var io = require(\'socket.io\')(http, {path: \'/trade/socket.io\'});

const settings = {
    REDIS: {
        HOST: \'localhost\'
    }
}

var mysql      = require(\'mysql\');
var connection = mysql.createConnection({
  host     : \'localhost\',
  user     : \'my_user\',
  password : \'my_password\',
  database : \'my_database\'
});

let redisClient = new redis.createClient(settings.REDIS);

var trade = function(req, res, next) {

   function getQuote(symbol, callback) {
        redisClient.get(symbol, (error, quote) => {
            if (error) {
                throw new Error(error);
            }
            quote = JSON.parse(quote);
            callback(quote);
        });
    }
    io.on(\'connection\', function(socket){

        var quotes = [\'EURUSD\',\'GBPUSD\',\'USDJPY\',\'USDCAD\',\'EURGBP\',\'USDCHF\',
                      \'AUDUSD\',\'NZDUSD\',\'GBPJPY\',\'USDMXN\',\'USDRUB\',\'USDZAR\',\'BTCUSD\'];
        quotes.forEach(function(item, i, quotes) {
            setInterval(() => {
                getQuote(item, (q) => {io.emit(\'get_quote_\'+item, q);});
            }, 3500);
        });
    });
    res.sendFile(__dirname + \'/index.html\');
}
app.get(\'/trade/:uid\', trade);

http.listen(3000, function(){});
我首先使用js节点。如果我之前知道这对我来说是如此困难,我会放弃这个想法,但我已经工作了两个多月,我不想放弃:)我觉得没有帮助我无法应付。

1 个回复
SO网友:sMyles

首先,您不应该通过允许用户向服务器发送AJAX调用来修改任何数据库值,指定要使用的用户ID,这将允许任何人使用nonce发送AJAX调用来修改任何用户的数据。

如果要进行AJAX调用以获取用户ID,应如下所示:

add_action( \'wp_ajax_cur_user_id\', \'get_cur_user_id\' );
function get_cur_user_id() {

    check_ajax_referer( \'wt_nonce\', \'wt_nonce_code\' );
    $user_id = get_current_user_id();

    if( empty( $user_id ) ){
        wp_send_json_error( array( \'not_logged_in\' => \'User is not logged in\' ) );
    } else {
        wp_send_json_success( $user_id );
    }

    die();
}
但是您不应该使用它来发送到服务器修改数据,您应该通过AJAX将修改后的数据发送到WordPress,然后使用get_current_user_id 获取用户ID,不允许通过AJAX发送

UPDATE:

下面是一个我将如何做到这一点的示例,从节点进行AJAX调用,不允许传递用户id,而是在WordPress中对其进行内部检查。

这假设您将在AJAX中发送一篇文章,其中包含要购买的金额buy 或出售金额sell

这还假设余额保存在用户的元中

add_action( \'wp_ajax_update_cur_user_balance\', \'update_cur_user_balance\' );
function update_cur_user_balance() {
    global $wpdb;

    check_ajax_referer( \'wt_nonce\', \'wt_nonce_code\' );
    $user_id = get_current_user_id();

    if ( empty( $user_id ) ) {
        wp_send_json_error( array( \'not_logged_in\' => \'User is not logged in\' ) );
        return;
    }

    $buy  = array_key_exists( \'buy\', $_POST ) ? floatval( $_POST[\'buy\'] ) : false;
    $sell = array_key_exists( \'sell\', $_POST ) ? floatval( $_POST[\'sell\'] ) : false;

    $user_balance = get_user_meta( $user_id, \'user_balance\', true );
    $user_balance_float = $user_balance ? floatval( $user_balance ) : 0;
    $transacted = false;

    if( $buy ){

        if( $buy > $user_balance_float ){
            wp_send_json_error( array( \'not_enough_funds\' => \'Not enough funds to buy!\' ) );
            return;
        }

        // Subtract buy amount from balance
        $user_balance_float = $user_balance_float - $buy;
        $transacted = true;
    } elseif( $sell ){

        // Add to user balance
        $user_balance_float = $user_balance_float + $sell;
        $transacted = true;
    }


    if( $transacted ){
        update_user_meta( $user_id, \'user_balance\', $user_balance_float );
        wp_send_json_success( array( \'completed\' => \'Transaction Completed\', \'new_balance\' => $user_balance_float ) );
        return;
    }

    wp_send_json_error( array( \'no_transact\' => \'No transaction was completed!\' ) );
    die();
}
当然,您需要想出一些方法来确保用户不只是使用您的nonce发布他们自己的购买/出售,但这超出了这个问题的范围。

或者,如果执行SQL查询,如下所示:

 // For doing a custom SQL query in WordPress (just an example, needs to match table, field, value, etc)
$some_table = \'your_table\';
$something = \'123456789\';
$query = $wpdb->prepare( "UPDATE `%s` SET something=\'%s\' WHERE `userid` = %d", array( $some_table, $something, $user_id ) );
$wpdb->query( $query );