\'gm_template_data_{$type}\'
第一个是为所有模板激发的,第二个是特定于模板的,实际上是动态部分{$type}
是没有文件扩展名的模板文件的基名称。E、 g.过滤器\'gm_template_data_single\'
可用于将数据传递给single.php
样板
附加到这些挂钩的回调have to return an array, 其中键是变量名。
例如,可以将元数据作为模板数据传递,如下所示:
add_filter(\'gm_template_data\', function($data) {
if (is_singular()) {
$id = get_queried_object_id();
$data[\'extra_title\'] = get_post_meta($id, "_theme_extra_title", true);
}
return $data;
};
然后,在模板内,您可以只使用:<?= $this->extra_title ?>
当两个常量WP_DEBUG
和WP_DEBUG_DISPLAY
如果为true,则类将在调试模式下工作。这意味着,如果未定义变量,将引发异常。当类不处于调试模式(可能在生产环境中)时,访问未定义的变量将输出空字符串。
数据模型组织数据的一种好的、可维护的方法是使用模型类。
它们可以是非常简单的类,使用上述相同的过滤器返回数据。没有特定的界面可遵循,它们可以根据您的喜好进行组织。
Belowe,这只是一个例子,但你可以自由地用自己的方式去做。
class SeoModel
{
public function __invoke(array $data, $type = \'\')
{
switch ($type) {
case \'front-page\':
case \'home\':
$data[\'seo_title\'] = \'Welcome to my site\';
break;
default:
$data[\'seo_title\'] = wp_title(\' - \', false, \'right\');
break;
}
return $data;
}
}
add_filter(\'gm_template_data\', new SeoModel(), 10, 2);
The__invoke()
方法(当类像回调一样使用时运行)返回要用于<title>
模板的标记。因为第二个论点通过了\'gm_template_data\'
是模板名称,该方法返回主页的自定义标题。
有了上面的代码,就可以使用
<title><?= $this->seo_title ?></title>
在<head>
页面的节。Partials具有如下功能get_header()
或get_template_part()
可用于将分部加载到主模板中。
这些函数与所有其他WordPress函数一样,可以在使用Engine
班
唯一的问题是,在使用核心WordPress函数加载的部分中,不可能使用使用$this
.
因此Engine
类有一个方法partial()
这允许加载分部(以完全与子主题兼容的方式),并且仍然能够在分部中使用自定义模板数据。
用法非常简单。
假设有一个名为partials/content.php
在主题(或子主题)文件夹中,可以使用以下方法将其包括在内:
<?php $this->partial(\'partials/content\') ?>
在该部分中,访问所有父主题数据的方式是相同的。与WordPress函数不同,Engine::partial()
方法允许将特定数据传递给partials,只需传递一个数据数组作为第二个参数。
<?php $this->partial(\'partials/content\', array(\'greeting\' => \'Welcome!\')) ?>
默认情况下,partials可以访问父主题中可用的数据和显式传递的数据。如果显式传递给partial的某个变量与父主题变量的名称相同,则显式传递的变量将获胜。
但是,也可以在隔离模式下包含分部,即分部无法访问父主题数据。要做到这一点,只需通过true
作为第三个参数partial()
:
<?php $this->partial(\'partials/content\', array(\'greeting\' => \'Welcome!\'), true) ?>
结论即使很简单,Engine
课程相当完整,但肯定可以进一步改进。E、 g.无法检查是否定义了变量。由于它与WordPress功能和模板层次结构完全兼容,您可以将其与现有代码和第三方代码集成,而不会出现任何问题。
然而,请注意,这只是部分测试,因此可能存在我尚未发现的问题。
以下五点"What did we gain?" 在里面@kaiser answer:
无需更改数据结构即可轻松交换模板具有易读的模板避免全局范围可以进行单元测试可以在不损害其他组件的情况下交换模型/数据也都对我的类有效。