木材 - 用于呈现插件模板
Timber - Use to render plugin templates
我正在创建一个与我正在使用 Timber 开发的主题直接相关的插件。
我的插件可以呈现一些内置模板(当我调用短代码时,插件会使用正确的模板回复);目前,这些模板是 PHP 个文件。
我会使用 Timber 渲染这些文件。
不幸的是,问题 #261 仍未解决。而且我不知道如何在当前木材代码库上获得预期的行为。
预期行为:
- 在主题路径之后注册我的视图插件路径。
- 调用视图时,Timber 首先检查主题目录,而不是插件目录。
我怎样才能得到这个?现在我已经在我的主题上测试了模板,我只是调用 Timber.render();
但我没有包含本地路径。
标准PHP插件代码:
// On plugin load
add_shortcode('render_social_icons', array($this, 'render_social_icons'));
public function render_social_icons($atts, $content)
{
$atts = shortcode_atts(array(
'class' => '',
'el-class' => '',
'link-class' => '',
'icon-class' => '',
'size' => '',
), $atts);
ob_start();
?>
<ul class="social-icons shortcode <?php echo $atts['class']; ?>">
<?php
$socials = my_socials_links();
foreach ($socials as $social) :?>
<?php
$id = $social['id'];
$title = $social['name'];
$baseurl = $social['baseurl'];
$icon = $social['icon'];
$social_data = get_theme_mod($id);
if (!empty($social_data)) :?>
<li class="<?php echo $id; ?> <?php echo $atts['el-class']; ?>">
<a target="_blank" title="<?php echo $title; ?>" href="<?php printf($baseurl, $social_data); ?>"
class="<?php echo $atts['link-class']; ?>">
<i class="<?php echo $icon; ?> <?php echo $atts['icon-class']; ?> <?php echo $atts['size']; ?>"></i>
</a>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
<?php
return ob_get_clean();
}
Timber 的转换函数(仍然是一个插件文件):
// On plugin load
add_shortcode('render_social_icons', array($this, 'render_social_icons'));
public function render_social_icons($atts, $content)
{
$atts = shortcode_atts(array(
'class' => '',
'el-class' => '',
'link-class' => '',
'icon-class' => '',
'size' => '',
), $atts);
return Timber.compile('shortcodes/social.twig', array(atts, my_socials_links());
}
shortcodes/social.twig
在当前主题文件夹中,我想从插件文件夹加载这个twig模板文件。
Timber 不需要您注册树枝文件即可将其与 Timber::compile
一起使用。您只需要提供文件的完整路径作为第一个参数。要在插件中执行此操作,您需要使用 plugin_dir_path()
获取插件目录路径。要使用您的示例代码,您需要执行以下操作。
public function render_social_icons($atts, $content) {
$plugin_path = plugin_dir_path( __FILE__ );
$atts = shortcode_atts(array(
'class' => '',
'el-class' => '',
'link-class' => '',
'icon-class' => '',
'size' => '',
), $atts);
return Timber::compile($plugin_dir_path . '/twig/social.twig', $atts);
}
Timber::compile
的妙处在于您可以传递路径数组,Timber 将使用它找到的第一个文件。这意味着您可以允许主题使用注册的 Timber 路径中的文件覆盖 social.twig
文件位置。例如,您可以将最后一行更改为:
return Timber::compile(array('social-shortcode-custom.twig', $plugin_dir_path . '/twig/social.twig'), $atts);
然后 Timber 会将变量传递给注册的 Timber 位置中名为 social-shortcode-custom.twig
的文件(如果存在),如果不存在则回退到位于插件中的文件。
我不确定这是否会影响某些事情,但我无法识别您用于编译函数的语法。我一直看到并使用静态方法Timber::compile()
,但你正在使用Timber.compile()
。 Timber 最近更新很快,也许你看到了我错过的东西?
我正在创建一个与我正在使用 Timber 开发的主题直接相关的插件。 我的插件可以呈现一些内置模板(当我调用短代码时,插件会使用正确的模板回复);目前,这些模板是 PHP 个文件。 我会使用 Timber 渲染这些文件。
不幸的是,问题 #261 仍未解决。而且我不知道如何在当前木材代码库上获得预期的行为。
预期行为:
- 在主题路径之后注册我的视图插件路径。
- 调用视图时,Timber 首先检查主题目录,而不是插件目录。
我怎样才能得到这个?现在我已经在我的主题上测试了模板,我只是调用 Timber.render();
但我没有包含本地路径。
标准PHP插件代码:
// On plugin load
add_shortcode('render_social_icons', array($this, 'render_social_icons'));
public function render_social_icons($atts, $content)
{
$atts = shortcode_atts(array(
'class' => '',
'el-class' => '',
'link-class' => '',
'icon-class' => '',
'size' => '',
), $atts);
ob_start();
?>
<ul class="social-icons shortcode <?php echo $atts['class']; ?>">
<?php
$socials = my_socials_links();
foreach ($socials as $social) :?>
<?php
$id = $social['id'];
$title = $social['name'];
$baseurl = $social['baseurl'];
$icon = $social['icon'];
$social_data = get_theme_mod($id);
if (!empty($social_data)) :?>
<li class="<?php echo $id; ?> <?php echo $atts['el-class']; ?>">
<a target="_blank" title="<?php echo $title; ?>" href="<?php printf($baseurl, $social_data); ?>"
class="<?php echo $atts['link-class']; ?>">
<i class="<?php echo $icon; ?> <?php echo $atts['icon-class']; ?> <?php echo $atts['size']; ?>"></i>
</a>
</li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
<?php
return ob_get_clean();
}
Timber 的转换函数(仍然是一个插件文件):
// On plugin load
add_shortcode('render_social_icons', array($this, 'render_social_icons'));
public function render_social_icons($atts, $content)
{
$atts = shortcode_atts(array(
'class' => '',
'el-class' => '',
'link-class' => '',
'icon-class' => '',
'size' => '',
), $atts);
return Timber.compile('shortcodes/social.twig', array(atts, my_socials_links());
}
shortcodes/social.twig
在当前主题文件夹中,我想从插件文件夹加载这个twig模板文件。
Timber 不需要您注册树枝文件即可将其与 Timber::compile
一起使用。您只需要提供文件的完整路径作为第一个参数。要在插件中执行此操作,您需要使用 plugin_dir_path()
获取插件目录路径。要使用您的示例代码,您需要执行以下操作。
public function render_social_icons($atts, $content) {
$plugin_path = plugin_dir_path( __FILE__ );
$atts = shortcode_atts(array(
'class' => '',
'el-class' => '',
'link-class' => '',
'icon-class' => '',
'size' => '',
), $atts);
return Timber::compile($plugin_dir_path . '/twig/social.twig', $atts);
}
Timber::compile
的妙处在于您可以传递路径数组,Timber 将使用它找到的第一个文件。这意味着您可以允许主题使用注册的 Timber 路径中的文件覆盖 social.twig
文件位置。例如,您可以将最后一行更改为:
return Timber::compile(array('social-shortcode-custom.twig', $plugin_dir_path . '/twig/social.twig'), $atts);
然后 Timber 会将变量传递给注册的 Timber 位置中名为 social-shortcode-custom.twig
的文件(如果存在),如果不存在则回退到位于插件中的文件。
我不确定这是否会影响某些事情,但我无法识别您用于编译函数的语法。我一直看到并使用静态方法Timber::compile()
,但你正在使用Timber.compile()
。 Timber 最近更新很快,也许你看到了我错过的东西?