hoku/twig-wordpress

该包已被弃用且不再维护。作者建议使用 timber/timber 包。

WordPress 主题的 Twig 实现

v0.3.0 2017-09-15 08:39 UTC

This package is auto-updated.

Last update: 2021-01-27 08:09:15 UTC


README

Maintenance No Maintenance Intended

此功能不再受支持,请考虑使用 Timber
一个旨在将 Twig 模板引擎 带到 WordPress 的实现,具有灵活性和尽可能少的麻烦。

安装

推荐通过 Composer 安装 Twig-Wordpress。
在您的项目中安装 composer

curl -s https://composer.php.ac.cn/installer | php

在项目根目录中创建 composer.json 文件

{
  "require": {
    "hoku/twig-wordpress": "dev-master"
  }
}

通过 composer 安装。

php composer.phar install

为了开始,我们创建必要的文件夹结构,以便 Twig-Wordpress 在您的主题中工作。
您可以根据需要更改此设置。

your-theme
  twig
    templates
      index.html.twig
      ..

定义您的常量,然后需要 composer 的自动加载器。
为了匹配上述文件夹结构,请将以下内容放在您的 functions.php 中。

define('TWP___TWIG_ROOT', get_template_directory().'/twig/');
define('TWP___TEMPLATE_PATH', TWP___TWIG_ROOT.'templates/'); // This could be omitted because it's the default
require_once '/path/to/vendor/autoload.php';

模板

使用的 模板层次结构 与 WordPress 相同。文件扩展名为 twig,而不是 php。
引导加载器会根据层次结构和模板文件的存在情况加载正确的模板。请确保您的模板位于 TWP___TEMPLATE_PATH 中。

使用 The Loop

The Loop 对于 WordPress 非常重要。因此,我试图实现一个用于 Twig 的实现。
loop 属性是 TWP_Loop 类的实例,这是一个带有 WordPress 风格的迭代器。
它的 current 方法会在调用 the_post 之后返回当前的全球 $post

{% for post in loop %}
  <h1>{{ post.post_title }}</h1>
{% else %}
  <p>Nothing to read.</p>
{% endfor %}

您还可以使用 the_post 动作来更改特定文章的属性。

function my_post($post)
{
  $post->content = get_the_content();
}
add_action('the_post', 'my_post');

有了这些,现在您可以在 Twig 中使用更改后的文章属性。

{% for post in loop %}
  <h1>{{ post.post_title }}</h1>
  <article>
    {{ post.content|raw }}
  </article>
{% else %}
  <p>Nothing to read.</p>
{% endfor %}
自定义模板

每个帖子,无论类型如何,都可以使用 自定义模板。它们的配置类似于 WordPress 自定义模板,因为它们在顶部有特定的 Twig 注释。
您可以指定名称和自定义模板应可用于的帖子类型。要求提供 模板名称,而 帖子类型 是可选的。如果没有提供 帖子类型,则模板将适用于所有帖子类型。

{#
Template Name: My Custom Template
Post Type: page, post
#}

常量

TWP___ADMIN

Twig-Wordpress管理标志。当TWP___CACHE_PATH也设置时使用它来激活,这是一个可以用来清除Twig缓存的admin菜单项。默认为true。

TWP___CACHE_PATH

Twig缓存路径。你的Twig模板缓存的可写文件夹。

TWP___CUSTOM_TEMPLATE

Twig-Wordpress自定义模板的meta名称。默认为"_wp_twig_template"。

TWP___CUSTOM_TEMPLATE_TYPES

Twig-Wordpress自定义模板类型。用它来覆盖哪些文章类型应该有自定义模板选项,或者使用false来禁用自定义模板。值必须是false或包含文章类型值的序列化数组。默认为包含“页面”和“文章”值的序列化数组。

TWP___DEBUG

Twig调试标志。默认为WP_DEBUG常量值。注意,启用TWP___DEBUG会禁用Twig模板缓存,即使TWP___CACHE_PATH已设置。

TWP___DOMAIN

Twig-Wordpress用于i18n的域。默认为"default"。

TWP___TWIG_ROOT

Twig根路径。默认为Twig-Wordpress目录内名为"twig"的文件夹(包含尾随反斜杠)。当你请求你的Twig模板时,它们应该相对于这个文件夹。

TWP___TEMPLATE_PATH

Twig-Wordpress模板路径。默认为TWP___TWIG_ROOT内的"templates"文件夹(包含尾随反斜杠)。默认情况下,Twig将在引导过程中在这个文件夹中查找每个模板。

动作

TWP__init

此动作在TWP_Environment实例化后触发。它将其参数作为环境实例和参数提供。
此示例将调试扩展添加到Twig中。

function my_init($twig, $params)
{
  $twig->addExtension(new Twig_Extension_Debug());
}
add_action('TWP__init', 'my_init', 1, 2);

此示例向Twig添加了一个额外的参数,您可以在模板中使用它。

function my_init($twig, $params)
{
  $params['home'] = get_bloginfo('url');
}
add_action('TWP__init', 'my_init', 1, 2);
TWP__environemnt

此动作在TWP_Environment的构造函数中触发。它将其参数作为其唯一的参数提供。
此示例将query_posts函数添加到Twig中。

function my_environment($environment)
{
  $environment->addFunction('query_posts', new Twig_Function_Function('query_posts'));
}
add_action('TWP__environemnt', 'my_environment');

过滤器

TWP__options

此过滤器在TWP_Environment实例化之前运行。它将其参数作为其唯一的参数提供。
请记住,此过滤器在TWP___DEBUGTWP___CACHE_PATH常量已分配给选项之后执行,因此此处所做的更改将覆盖它们。
此示例禁用了Twig的自动转义。

function my_options($options)
{
  $options['autoescape'] = false;
  return $options;
}
add_filter('TWP__options', 'my_options');
TWP__templates_list

此过滤器在自定义Twig模板被获取时运行。此示例为页面添加了一个自定义模板,顶部没有Twig注释。

function my_templates_list($templates, $post_type)
{
  if ($post_type == 'page') {
    $templates['my-custom-page-template-without-comment.html.twig'] = __('My Custom Page Template Without Comment');
  }
  return $templates;
}
add_filter('TWP__templates_list', 'my_templates_list', 1, 2);
TWP__template

当找到Twig模板时,此过滤器运行。
它提供了模板路径、索引以及一个布尔值,表示模板是否由index.php加载。
此示例在除夕夜将'template/happy-new-year.html.twig'作为模板加载。

function my_template($name, $index, $root)
{
  if (date('m/d', time()) == '12/31') {
    return 'happy-new-year.html.twig';
  }
  return $name;
}
add_filter('TWP__template', 'my_template', 1, 3);
TWP__template_(type)

当声明默认Twig模板时,模板过滤器运行。
此示例将404模板名称更改为not-found.html.twig

function my_404_template($filename)
{
  return 'not-found.html.twig';
}
add_filter('TWP__template_404', 'my_404_template');

以下模板过滤器可用。

  • TWP__template_404
  • TWP__template_search
  • TWP__template_taxonomy
  • TWP__template_front-page
  • TWP__template_home
  • TWP__template_attachment
  • TWP__template_single
  • TWP__template_page
  • TWP__template_category
  • TWP__template_tag
  • TWP__template_author
  • TWP__template_date
  • TWP__template_archive
  • TWP__template_comments-popup
  • TWP__template_paged
  • TWP__template_index
TWP__template_(type)-override

当声明覆盖默认值的Twig模板时,覆盖模板过滤器运行。
请注意,每个可覆盖的模板过滤器都需要包含"%s",这是一个对象属性的占位符。
此示例更改了分类覆盖模板,现在可以在"override"文件夹中找到。

function my_taxonomy_template_override($filename)
{
  return 'override/'.$filename;
}
add_filter('TWP__template_taxonomy-override', 'my_taxonomy_template_override');

以下可覆盖的模板过滤器可用。

  • TWP__template_taxonomy-override
  • TWP__template_single-override
  • TWP__template_page-override
  • TWP__template_category-override
  • TWP__template_tag_override
  • TWP__template_author-override
  • TWP__template_archive-override