WordPress主题变量范围


9

我需要创建一个可在我的整个WordPress主题模板文件(index.php,header.php等)中访问的变量。我知道函数定义在functions.php模板文件中(在您的主题路径中),但是变量没有这样的东西。

例如,我经常需要在主题中检索类别,因此我希望可以从主题的任何位置进行访问:

$categories = get_categories(); /* get_categories() is a wordpress function */ 

这样,我可以简单地访问分配的数据,而不必在每次需要获取类别时都重新分配数据。

不幸的是,在我的functions.php文件中添加那段代码是行不通的,创建变量也不行global

Answers:


5

显然global可以解决问题。问题是,我的变量$categories应该已经重新定义global在它前面,在每一个模板,我需要使用它。


2
除了必须在每个模板文件中将其重新定义为全局变量之外,还有其他人知道更直观的解决方案吗?我在制定主题时使用了这种方法,但看起来...不合适。

1
棒极了,谢谢!对于准备好像我这样有点厚的任何人:在您的functions.php文件中:<?php $ test =“我正在测试!”; ?>在您不知道header.php中:<?php global $ test; 回声$测试; ?>,你真金!
多米尼克

如果这有助于澄清:所有在WordPress的模板文件被称为require()语句被包裹在功能:get_header()get_footer(),等; 它们本身是函数的包装器get_template_part()。由于PHP中的函数只能访问在其中定义的变量或通过引用传递给它们的变量,因此,如果要使用全局范围内的变量(或定义一个变量并使其在全局范围内可访问),则必须声明它首先使用全局关键字。
goldenapples 2012年

1

多米尼克(不知道如何在他的答案中添加注释):

define只接受标量,所以你做不到 define( CATS, get_categories() ); ,甚至不能

$categories = get_categories();
define( CATS, $categories );

否则,define可以正常工作,并且实际上对标量而言更安全(因为您可以确定常量不会被覆盖)


1

我知道这确实很老,但是还有改进的空间。

您应该考虑使用$ GLOBALS ['categories']而不是仅仅使用global。

有两个原因:

  1. 我们不必global $categories;每次都写。
  2. 很明确,然后我们使用全局,然后不使用全局。

考虑以下代码:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

只有当我们在使用变量之前就初始化了全局状态时,很难判断它是否是全局的。并且不要忘记在您拥有的任何模板文件中重复进行此操作。

可以使用命名约定,但是我认为有更好的方法。

考虑使用$GLOBALS['categories']

我们只需要在functions.php中一次初始化变量,而无需再考虑global $categories。我们可以看到这是全球性的。

print_r ($GLOBALS['categories']);

在这种情况下,性能问题根本不是问题。我将引用Sara Golemon(链接):

这对您使用$ GLOBALS数组意味着什么?没错,global关键字在技术上更快。现在,我想对这里的一件事非常清楚。使用全局变量作为本地化的[编译变量]所产生的较小速度负担需要与五年内查看代码并知道$ foo来自全局范围的可维护性进行认真权衡。something_using($ GLOBALS ['foo']); 始终比全局$ foo更清晰 / *一堆代码* / something_using($ foo); 不要一分钱,愚蠢..


0

这也适用:

在functions.php中添加define('TEST', 'this is a test');
并在您的header.php中或任何其他内容中echo TEST;

一种方法相对于另一种方法有性能优势吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.