木材-用于渲染插件模板

时间:2019-03-08 00:26:12

标签: wordpress twig timber

我正在创建一个与我正在使用Timber开发的主题直接相关的插件。 我的插件可以呈现一些内置的模板(当我使用简写的teplate调用简码时,插件回复);这些模板目前是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位于当前主题文件夹中,我想从插件foder加载此树枝模板文件。

1 个答案:

答案 0 :(得分:0)

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()。木材最近正在快速更新,所以也许您看到了我错过的东西?