[编辑:对早先措辞较差的问题道歉。总重写。]
我有一个Wordpress网站,我正在查看3个相关文件:
我正在使用functions.php中的函数从外部Feed中提取天气数据,然后尝试在两个位置显示该数据 - 一次在header.php中(在网站的每个页面上),一次在index.php中(仅在主页上显示的第二个实例)。我可以显示第一个实例,但我遇到了第二个实例的问题
在functions.php中:
function arctic_valley_weather() {
function get_string_between($string, $start, $end){
//here's a function that just parses the data. not important
}
$fullstring = file_get_contents('http://www.cnfaic.org/library/grabbers/nws_feed.php');
$parsed = get_string_between($fullstring, 'arctic_valley,', 'marmot,');
$weatherValues = explode(",",$parsed);
$dateTime = date_create($weatherValues[0]);
return array(
'dateTime' => $dateTime,
'airTemp' => $weatherValues[1],
'relHumid' => $weatherValues[2],
'windSpeed' => $weatherValues[3],
'windDirection' => $weatherValues[4],
'windGust' => $weatherValues[5],
);
}
好的,然后在header.php中:
$weatherData = arctic_valley_weather();
echo round($weatherData['airTemp']);
这准确地显示了温度(圆形)。我们说“18”。真棒。
当我想复制完全相同的结果时,麻烦来自index.php:
echo round($weatherData['airTemp']);
这个错误地显示“0”,即使初始实例正确显示18。
我认为这是所有相关数据。什么跳出来?
答案 0 :(得分:1)
尝试这样的事情,
首先在function.php
文件中声明一个全局变量,然后从你的方法中为它赋值。
global $weatherData;
function arctic_valley_weather() {
global $weatherData;
function get_string_between($string, $start, $end) {
//here's a function that just parses the data. not important
}
$fullstring = file_get_contents('http://www.cnfaic.org/library/grabbers/nws_feed.php');
$parsed = get_string_between($fullstring, 'arctic_valley,', 'marmot,');
$weatherValues = explode(",", $parsed);
$dateTime = date_create($weatherValues[0]);
$weatherData = array(
'dateTime' => $dateTime,
'airTemp' => $weatherValues[1],
'relHumid' => $weatherValues[2],
'windSpeed' => $weatherValues[3],
'windDirection' => $weatherValues[4],
'windGust' => $weatherValues[5],
);
}
在header.php
或index.php
尝试访问$weatherData
,如下所示:
global $weatherData;
echo round($weatherData['airTemp']);
希望这有帮助!
答案 1 :(得分:1)
看起来Wordpress在函数体中包含header.php
。这意味着,一旦您离开header.php
,header.php
中定义的所有变量都将超出范围。您无法访问index.php
,footer.php
,page.php
等变量。一种解决方案是再次调用您的函数。但这会向您的外部资源提出另一个请求,这可能是一种浪费。或者您可以将其分配给超全局$GLOBALS
数组。
请参阅此类似帖子:setting variable in header.php but not seen in footer.php
所以你必须在你的header.php
文件中做这样的事情:
$GLOBALS['weatherData'] = arctic_valley_weather();
echo $GLOBALS['weatherData'];
在index.php
文件中,您可以这样做:
echo $GLOBALS['weatherData'];
答案 2 :(得分:0)
首先,你使用全局变量......这不是变量的标准用法(或者你应该确切知道你在做什么!)
$variable = 'level 0';
function test_1() {
$variable = 'level 1';
echo $variable;
}
echo $variable; // will work, because $variable is set to 'level 0'.
test_1(); // will work, because $variable is set to 'level 1' ON THE FUNCTION
function test_2() {
echo $variable;
}
echo test_2(); // Does not work, because $variable is not set INTERNALLY ON the function
当然,可以使用全局变量......但是你想要这样做,重构你的逻辑和你的代码来排除这个方法:)