如何从 Javascript 函数获取数据并将其保存到 php 中用户的自定义元字段?

How do I get data from Javascript function and save it to a user's custom meta field in php?

我正在使用一项服务,该服务会自动将我用户的设备注册到 Onesignal。

我通过在脚本标签内调用 gonative_onesignal_info(); 来调用登录时的函数(完整函数将在下面)。使用 Onesignal 可以完美地注册设备。

现在,根据该服务的文档,我可以通过 AJAX POST 它到我的服务器,这正是我正在努力解决的问题。从该服务的文档中,如果您像这样调用 gonative_onesignal_info():

function gonative_onesignal_info(info) {
    console.log(info);
}

...信息将如下所示:

{
    oneSignalUserId: 'xxxxxxx',
    oneSignalPushToken: 'xxxxxx',
    oneSignalSubscribed: true,
}

这是我的全部功能:

function onesignal_mobile_registration( $user_login, $user ) {

    // Get user data
    $user_id = $user->ID;
    $user_email = $user->user_email;

    ?>

        <script>
            gonative_onesignal_info(info);
        </script>

    <?php

    $oneSignalPushToken = ???;
    update_user_meta( $user_id, 'oneSignalPushToken', $oneSignalPushToken);

}
add_filter( 'wp_login', 'onesignal_mobile_registration', 10, 2 );

那么,如何从 Javascript 选项中提取 oneSignalPushToken,并将其存储在 $oneSignalPushToken 中以保存给我的用户?我觉得需要用AJAX才能拉出来对不对?我该怎么做?

了解您的代码的作用很重要:

  • PHP 部分将呈现一个 HTML 页面
  • 页面完全呈现和提供后,JavaScript 部分将在浏览器中执行

这意味着您将无法在生成页面的 PHP 线程中检索 JavaScript 变量,主要原因有两个:

  • JavaScript 和 PHP 执行上下文根本不共享
  • JavaScript 将在 PHP 线程结束后执行

您需要做的是在 PHP 服务器上公开一个端点,假设 POST/token URL 上。您将使用 fetch('/token', { method: 'POST', body: info }); 等代码从 JavaScript 调用此端点,然后从 $_POST 全局变量中检索令牌,然后执行 update_user_meta( $user_id, 'oneSignalPushToken', $oneSignalPushToken);

您不能从 javascript 分配 php 变量,因为在服务器中 php 运行 但在浏览器中 javascript 运行。您必须从 php 源获取 $oneSignalPushToken 值,或者在将 js 数据发送到 php 变量时从浏览器调用 ajax:

脚本位置:

<script>
    var data = gonative_onesignal_info(info);
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('GET', 'test.php?oneSignalPushToken=' + data.oneSignalPushToken, true);
    xmlhttp.send();
</script>

test.php

function onesignal_mobile_registration( $user_login, $user ) {

    // Get user data
    $user_id = $user->ID;
    $user_email = $user->user_email;

    $oneSignalPushToken = $_GET['oneSignalPushToken'];
    update_user_meta( $user_id, 'oneSignalPushToken', $oneSignalPushToken);

}
add_filter( 'wp_login', 'onesignal_mobile_registration', 10, 2 );