iamntz / handlebars.wp
WordPress 开发中用于 Handlebars.php 的实用工具。
Requires
- iamntz/handlebars.php: dev-master
This package is auto-updated.
Last update: 2024-08-29 04:42:56 UTC
README
从WordPress诞生之初,WordPress就鼓励混合PHP和HTML代码。这应该停止!这里有一个实用工具可以帮助你处理一些事情。
这个包是在实际使用中构建的,是 Handlebars.php 的包装/辅助工具,适用于WordPress使用。它提供了HTML/PHP的分离、级联回退(即您可以让用户覆盖模板文件)等更多功能。
所以,而不是一个这样的文件
while( have_posts() ){ the_post();
?>
<h2><?php the_title(); ?></h2>
<?php if(is_single()) { ?>
<div class="theContent"><?php the_content ?></div>
<?php } else { ?>
<div class="theExcerpt"><?php the_excerpt(); ?></div>
<?php }
<?php
}
您将有两个文件
// index.php
use \iamntz\handlebarsWP\WP;
(new \MyTpl\Tpl )->show('index', [
'the_content' => WP::get()->buffer_the_content(),
'the_excerpt' => WP::get()->buffer_the_excerpt(),
'title' => WP::get()->buffer_the_title(),
'is_single' => is_single()
]);
// index.hbs
<h2>{{{ title }}}</h2>
{{#if is_single}}
<div class="theContent">{{{ the_content }}}</div>
{{else}}
<div class="theExcerpt">{{{ the_excerpt }}}</div>
{{/if}}
更好,对吧?您已经将责任分离了;您知道在您的 php
文件中您将只找到 仅 PHP代码。可以说,这就像学习一门全新的语言,但实际上,您只需要花大约15分钟来习惯handlebars语法!
加分项:您还可以在JavaScript中重用这些模板!
安装
简单的方法是通过composer安装: composer require iamntz/handlebars.wp
并在您的 functions.php
中添加 require 'vendor/autoload.php';
。
困难的方法是下载zip文件,下载Handlebars.php,然后自己处理所有require。所以,请走简单的方法 :)
如何使用?
隔离事物最好的方法是扩展 Tpl
类并重写方法。最基本的是重写 get_namespace
方法
class MyTpl extends \iamntz\handlebarsWP\Tpl { public function get_namespace() { return 'my_namespace'; }
注意:这部分是完全可选的,但强烈推荐,因为您将确保不会与也使用这个优秀包的插件和主题发生冲突。
(new \MyTpl\Tpl )->show('foo', []); echo (new \MyTpl\Tpl )->get('foo', []);
这将搜索当前主题目录中的 views/foo.hbs
,然后搜索父主题目录,如果文件未找到,则抛出异常。
如果您正在包含部分,则按上述顺序在 views/partials/foo.hbs
中搜索。
WordPress 辅助函数
目前,只有一些辅助函数:各种清理、用于复选框和单选框输入和选择的 _checked
和 _selected
。
选择和复选框
(new \MyTpl\Tpl )->show('select', [ 'options' => [ [ 'optionValue' => 'foo' ], [ 'optionValue' => 'bar' ] ], 'currentValue' => 'bar' ]);
{{each options}}
<option value="{{ optionValue }}" {{_selected optionValue currentValue}}></option>
{{/each}}
同样的规则适用于复选框和单选框。
清理
您可以使用一些内置的辅助函数来清理字段。
<input value="{{{_esc_attr myValue}}}">
默认情况下,只有一些函数可用: _esc_attr
、_esc_textarea
、_sanitize_text_field
和 _esc_url
,但如果所需的函数不存在,您可以执行以下操作之一
- 运行一个通用辅助函数:
{{_sanitize myValue sanitize_key}}
(其中sanitize_key
)是一个WP函数(然而,这将允许您运行 任何 函数,所以请小心!); - 注册一个新的辅助函数,如下所示
add_filter('iamntz/templates/engine', function($engine){
$engine->addHelper( 'my_helper', new MyHelperClass );
return $engine
});
属性
您还可以向 _expand_attrs
辅助函数传递一个数组,该数组将展开为一个属性字符串
(new \MyTpl\Tpl )->get('template_file', [ 'attrs' => [ 'foo' => 'bar', 'baz', ] ]);
在您的 template_file.hbs
中,您将使用它如下所示
<div {{{_expand_attrs attrs}}}></div>
并将扩展为以下内容
<div foo="bar" baz></div>
关于自定义辅助函数的说明
使用模板引擎的目的是将逻辑从HTML中移除,所以不要过度使用!尽管您可以使用辅助函数做很多事情,但请考虑将逻辑移动到您的PHP文件中!
关于WordPress函数的echo操作怎么办?
有一些WordPress函数会执行echo操作,但没有内置的禁用方式(例如,the_content
或 the_excerpt
)。您也可以使用内置的辅助函数来处理这种情况
\iamntz\handlebarsWP\WP::get()->buffer_the_content()
基本上,所有以 buffer_
为前缀的函数都会被...嗯,缓存。
自定义
当然,您可以自定义大多数配置
添加自定义路径
如果您在使用此包的插件中,可能需要添加要搜索的插件路径
add_filter('my_namespace/template/directories', function($paths) { $paths[] = plugin_dir_path( __FILE__ ); return $paths; });
这样,您将允许用户自定义插件视图。这不是很酷吗?
更改默认扩展名
默认情况下,模板扩展名为 .hbs
,但若想更改,可以使用 my_namespace/template/options
过滤器来实现(并更改许多其他选项)。
i18n
“那翻译怎么办?”您可能会问。别担心,您也受到了保护!
add_filter('my_namespace/template/i18n_strings', function($strings) { $strings['hello'] = __('hello world!'); return $strings; });
然后,在您的模板中,只需使用 {{{ i18n.hello }}}
即可。简单易懂,对吧?
添加ID?
有时您需要给一个元素添加ID。无需在每个模板上手动操作,您已经可以使用 {{ _id }}
或,如果您喜欢,一个超长的ID {{ _uniqid }}
。
请注意,_id
基本上是传递给模板的数据的 crc32
哈希值。如果您觉得这太慢,可以使用 my_namespace/template/hash
过滤器指定不同的算法。
觉得这个有用吗?
许可证
MIT。