Javascript变量在Wordpress中传递给PHP会话


Javascript variable passed to PHP session in Wordpress

我不确定这是否是最好的方法,但我有一个按钮,按下它时会调用一个onClick JS函数,它传递了两个参数。我想将这两个参数保存在 php 会话上,然后加载另一个页面并使用这些值。

所以,我知道如果我在页面上使用这样的东西!

    <?php
    session_start();
    $message1 = "A message";
    $message2 = "Another message";
    $_SESSION['routineName'] = $message1;
    $_SESSION['dayName'] = $message2; 
    ?>

我可以转到第 2 页,通过使用$_SESSION['routineName']我可以使用该信息。

因此,在第 1 页上,我在用我的onClick调用的函数中拥有该代码:

function trackIt(routine, dayName) 
{
    <?php
    session_start();
    $message1 = "A message";
    $message2 = "Another message";
    $_SESSION['routineName'] = $message1;
    $_SESSION['dayName'] = $message2; 
    ?>
}

我尝试了这样的事情:

function trackIt(routine, dayName) 
{
    <?php
    session_start();
    $_SESSION['routineName'] = ?> routine; <?php
    $_SESSION['dayName'] = $message2; 
    ?>
}

和其他人,但没有任何效果。

这就是我调用onClick(trackIt(函数的方式:

echo('<td colspan="3" style="background-color:#005673; text-align:right; padding: 4px 0px;">
<button class="btnTrack" onClick="trackIt(''' . $name . ''' , ''' . $nameday1 . ''')" >Track It!</button></td>');

我想做的是将例程和 dayName 保存到会话中。

是否可以将JS变量/参数保存到PHP会话中?

PS:我正在使用Wordpress。

谢谢!

你放在文件中的PHP代码不会在Javascript运行时执行,它甚至在页面发送到客户端之前就被执行。因此,您无法从内容中的任何位置访问$_SESSION,您需要从Wordpress的代码中执行此操作。通常这是通过插件完成的。

您需要将 Javascript 变量传递给服务器端 PHP。正如@Grasshopper所说,最好的(或至少是最可维护的方式(是通过 AJAX:

// This is your JAVASCRIPT trackit function
function trackIt(routine, day) {
    $.post(
         '/wp-setvar.php',
         {
             routine  : routine,
             day      : day
         }, // You can add as many variables as you want (well, within reason)
         function success(data) {
             // Here we should receive, given the code below, an object
             // such that data.result is a string saying "OK".
             // Just in case you need to get back something from the server PHP.
             // Otherwise just leave this function out.
         }
    );
};

在服务器上,您需要创建一个特定的文件来接受传入的变量(最好从插件执行此操作,以免在安装之外添加文件:这种做法受到 WordFence 等安全扫描程序的反对(。下面是屠夫的解决方案。

<?php /** This is wp-setvar.php */
/** Set up WordPress environment, just in case */
require_once( dirname( __FILE__ ) . '/wp-load.php' );
session_id() || session_start();
nocache_headers();
// DO NOT, FOR ANY REASON, ACCESS DIRECTLY $_SESSION
// ONLY USE A VARIABLE WITHIN $_SESSION (here, "ajjx")
// OTHERWISE THIS MAY ALLOW ANYONE TO TAKE CONTROL OF YOUR INSTALLATION.
$_SESSION['ajjx'] = $_POST;
Header('Content-Type: application/json;charset=utf8');
die(json_encode(array(
    'result' => 'OK', // This in case you want to return something to the caller
))); 

现在,每当您需要会话保存的变量(例如"例程"(时,您都可以输入

<?php
  ...
  $value = '';
  if (array_key_exists('ajjx', $_SESSION)) {
       if (array_key_exists('routine', $_SESSION['ajjx']) {
           $value = $_SESSION['ajjx']['routine'];
       }
  }

或者你可以在插件中定义一个函数,

  function ajjx($varname, $default = '') {
      if (array_key_exists('ajjx', $_SESSION)) {
           if (array_key_exists($varname, $_SESSION['ajjx']) {
               return $_SESSION['ajjx'][$varname];
           }
      }
      return $default;
  }

然后你只是:

  <?php print ajjx('routine', 'none!'); ?><!-- will print routine, or "none!" -->

  <?php print ajjx('routine'); ?><!-- will print nothing if routine isn't defined -->

一个更糟糕的解决方案是在wp-config.php本身中添加上面的函数定义。然后它将在Wordpress的任何地方都可用。前提是您有权访问wp-config.php .另外,首先备份wp-config并使用完整的FTP客户端来完成它;不要使用Wordpress插件来编辑它,因为如果wp-config崩溃,插件也可能崩溃...你会发现自己处于一个开罐器被锁定在罐中的情况

如果您对上述某些内容感到不舒服,最好什么都不做。或者首先练习消耗性的Wordpress安装,您可以轻松重新安装。