rmp/wp-twig

0.1.2 2021-06-21 08:35 UTC

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

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

  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;
  }
);

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