rmp-up / wp-twig
0.1.2
2021-06-21 08:35 UTC
Requires
- twig/twig: ~2
This package is auto-updated.
Last update: 2024-09-21 15:40:14 UTC
README
在预算内使用Twig的WordPress。
- 让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; } );
绕过数据生成可以节省一些时间,从而提高主题的性能。我们建议您将数据封装在生成器或其他懒加载构造中,以进一步增强这一点。