是否可以 link 到 Timber 模板中的其他静态页面?

Is it possible to link to other static pages in a Timber template?

目前,要 link 到 "FAQ" 页面,我有以下内容:

Check out our <a href="{{ site.link }}/faq">FAQ</a> page.

但是,我希望能够 link 到我的 WordPress 主题中的其他内部页面,而无需在其后手动写入 URL 参数。类似于:

Check out our <a href="{{ site.link('faq') }}">FAQ</a> page.

这在 Timber 中是不可能的吗?我已经检查了文档,但没有看到任何参考,但我觉得我一定遗漏了一些东西。

您可以使用过滤器 timber_context

将页面添加到您的上下文中
add_filter('timber_context', 'add_to_context');

function add_to_context($context){
    /* this is where you can add your own data to Timber's context object */
    $extraLinks = [];
    $extraLinks['faq'] = get_permalink($faq_ID);
    $context['site']['extraLinks'] = $extraLinks;
    return $context;
}

所以你可以调用你的 twig 文件

Check out our <a href="{{ site.extraLinks.faq }}">FAQ</a> page.

source

Wordpress有两个函数可以解决:get_page_by_path() and get_permalink()

get_page_by_path('page-slug');
get_permalink(page_id);

使用 Timber 你可以写这样的东西 calling a Timber function:

{{ function('get_permalink', function('get_page_by_path', 'page-slug')) }}

但是当然,您应该定义一个 wp 函数才不会发疯。您可以使用 functions.php 文件向 WordPress 添加功能,即使您应该定义一个 class 到 extends Timber(如果没有,复制并粘贴它)

class StarterSite extends Timber\Site {
    public function __construct() {
        add_filter( 'timber/twig', array( $this, 'add_to_twig' ) );
        add_filter( 'timber/context', array( $this, 'add_to_context' ) );
        $this->add_routes();
        parent::__construct();
    }
    
    public function add_to_context( $context ) {
        $context['menu']  = new Timber\Menu();
        $context['site']  = $this;      
        return $context;
    }

    public function add_to_twig( $twig ) {
        $twig->addFunction( new Timber\Twig_Function( 'get_permalink_by_slug', function($slug) {
            return get_permalink( get_page_by_path($slug) );
        } ) );
        return $twig;
    }

}
new StarterSite();

如您所见,名为 get_page_by_slug 的 I defined a Twig function 接收带有页面 slug 的字符串。现在,你可以把它写在你的模板上了:

{{ get_permalink_by_slug('page-slug') }}

尽情享受吧:)