rmp / wp-twig
Requires
- twig/twig: ~2
This package is auto-updated.
Last update: 2024-09-21 15:43:37 UTC
README
预算内的 WordPress 与 Twig。
- 使 WordPress 使用 ".php" 和 ".html.twig" 主题模板
- 通过过滤器或
$wp_query
将模型与视图分离 - 从多个主题继承,而不仅仅是单个父主题
安装/使用
通过 composer 需要
composer require rmp-up/wp-twig
并将其添加到您的 "functions.php" 或其他位置
<?php wp_twig_register();
此函数在 composer 的 autoload.php 被使用时存在。从现在起,WordPress 使用 ".php" 和 ".html.twig" 模板。
模板化/Twig 的工作原理
查看此存储库中给出的文件,例如 "index.html.twig" 文件
<html> <body> <div class="menu"> <a href="/">HOME</a> :: <a href="/index.php?s=404">Why?</a> </div> <hr> {% block foo %} Hello world! {% block %} </body> </html>
所以默认情况下,这个页面显示 "Hello world"。在其他模板中,我们可以使用周围的 HTML,但替换块
{% extends 'wp-twig/index.html.twig' %} {% block foo %} Search results are: ... {% endblock %}
注意:还需要主题本身的路径。这样就可以访问其他主题的文件。
使用 (WordPress-)函数
Twig 以一种方式扩展,任何函数都可以用作过滤器。这意味着像 date_i18n('l, d.m.Y')
或 wp_list_pluck
这样的函数可以作为过滤器和使用
{{ "l, d.m.Y"|date_i18n }} {# same as #} {{ date_i18n("l, d.m.Y") }} {{ some_posts|wp_list_pluck('ID') }} {{ wp_list_pluck(some_posts, 'ID') }} {{ __("translate this!", "wp-twig") }}
但出于隔离和性能的考虑,不要在模板内部执行 get_posts('post_type=foo')
。数据、列表和其他昂贵的操作应该如下注入。
数据/模型层
通过 WP_Query 注入数据
从 WordPress 1.5 开始,您可以使用 $wp_query->query_vars
在模板中注入数据。函数 load_template
(以及在某些情况下 locate_template
)提取数据作为变量,wp-twig 也是如此
<?php add_filter( 'init', static function () { global $wp_query; $wp_query->query_vars['user'] = wp_get_current_user(); } );
这就是您可能已经在模板中注入数据的方式,它现在在 Twig 中仍然可用
{% if user %} Hello {{ user.user_nicename }} {% else %} Hello guest! {% endif %}
在 Twig-上下文中注入变量
它提供了四个用于注入数据的过滤器
wp_twig_template_{type}_block_{name}
(例如 "wp_twig_template_404_block_foo")wp_twig_block_{name}
(例如 "wp_twig_block_foo")wp_twig_template_{type}
(例如 "wp_twig_template_index" 或 "wp_twig_template_search")wp_twig_context
这些是按照给定顺序执行的,因此您基本上可以将数据添加到模板中
<?php add_filter( 'wp_twig_template_page_block_foo', static function ( array $context ) { $context['bar'] = 42; return $context; } );
顺序很重要,可以绕过更通用级别上已经添加的数据
<?php add_filter( 'wp_twig_block_foo', // more generic than "wp_twig_template_page_block_foo" from above static function ( array $context ) { if ( ! array_key_exists( 'bar', $context ) ) { $context['bar'] = apply_filters( 'fetch_some_expensive_data', [] ); } return $context; } );
绕过数据生成可以节省一些时间,从而提高主题的性能。我们建议您将数据封装在生成器或其他延迟构造中,以进一步增强这一点。