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

时间:2014-12-02 23:52:48

标签: javascript php wordpress session

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

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

    <?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 Session中?

PS:我正在使用Wordpress。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

您需要将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
))); 

现在,只要您需要会话保存的变量,例如&#34;例行&#34;,你把

<?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崩溃,插件也可能崩溃......而且你会发现自己处于 my-can-opener-被锁定在一个可以的情况。

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