rmp-up/wp-twig

0.1.2 2021-06-21 08:35 UTC

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上下文中注入变量

它提供了四个用于注入数据的过滤器

  1. wp_twig_template_{type}_block_{name}(例如:"wp_twig_template_404_block_foo")
  2. wp_twig_block_{name}(例如:"wp_twig_block_foo")
  3. wp_twig_template_{type}(例如:"wp_twig_template_index"或"wp_twig_template_search")
  4. 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;
  }
);

绕过数据生成可以节省一些时间,从而提高主题的性能。我们建议您将数据封装在生成器或其他懒加载构造中,以进一步增强这一点。