为什么我的自定义函数不适用于 Timber?
Why is my custom function not working with Timber?
我正在尝试向 Timber 添加自定义功能,但我无法让它工作。我是 Timber 的新手,目前正在使用 timber 入门主题来了解它的工作原理。我有要显示的示例函数,但我的自定义函数没有显示。
我已经尝试按照 Timber 文档中的说明进行操作,并尝试使用此处给出的答案: 都没有运气。
这是我的 functions.php 文件中的函数(在没有 Timber 的主题中工作正常)。
function prev_next_titled_pagination() {
// Don't print empty markup if there's only one page.
if ( $GLOBALS['wp_query']->max_num_pages < 2 ) {
return;
} ?>
<nav aria-label="pagination">
<ul class="post-navigation">
<?php if ( get_next_posts_link() ) : ?>
<li class="post-navigation__item post-navigation__item--previous"><?php get_next_post_link( __( '<span aria-hidden="true">←</span>' %title ) ); ?></li>
<?php endif; ?>
<?php if ( get_previous_posts_link() ) : ?>
<li class="post-navigation__item post-navigation__item--next"><?php get_previous_post_link( __( '%title <span aria-hidden="true">→</span>' ) ); ?></li>
<?php endif; ?>
</ul>
</nav>
<?php
}
这是我的 functions.php 文件中 StarterSite 对象的内容。 'myfoo' 函数有效。
/** This is where you can add your own functions to twig.
*
* @param string $twig get extension.
*/
public function add_to_twig( $twig ) {
$twig->addExtension( new Twig_Extension_StringLoader() );
$twig->addFilter( new Twig_SimpleFilter( 'myfoo', array( $this, 'myfoo' ) ) );
$twig->addFilter( new Twig_SimpleFilter( 'prev_next_titled_pagination', array( $this, 'prev_next_titled_pagination' ) ) );
return $twig;
}
下面是我在 single.twig 文件中调用函数的方式。 'myfoo' 有效。 'prev_next_titled_pagination' 没有。
{{ function( 'prev_next_titled_pagination' ) }}
{{ function('myfoo', 'HI' ) }}
这段代码没有错误,但也没有任何输出。尝试文档中的其他建议会出错。
函数应该return一个值,也不要那样分解你的函数...
<?php
function prev_next_titled_pagination() {
// Don't print empty markup if there's only one page.
if ( $GLOBALS['wp_query']->max_num_pages < 2 ) return;
$html = '<nav aria-label="pagination"><ul class="post-navigation">';
if (get_next_posts_link()) $html .= '<li class="post-navigation__item post-navigation__item--previous">'.get_next_post_link( __( '<span aria-hidden="true">←</span> %title')).'</li>';
if (get_previous_posts_link()) $html .= '<li class="post-navigation__item post-navigation__item--next">'.get_next_post_link( __( '%title <span aria-hidden="true">→</span>')).'</li>';
$html .= '</ul></nav>';
return $html; // or return new \Twig_Markup($html, 'UTF-8'); if you did not mark your output as safe in the registration
}
恕我直言,你最好给函数 get_next_posts_link
和 get_previous_posts_link
取别名,然后直接在你的模板中使用它们,而不是尝试在一个大块中这样做
我认为您的功能不起作用,因为您为 prev_next_titled_pagination
添加的 array( $this, 'prev_next_titled_pagination' )
回调是 StarterSite
class 的一个方法。但是当你将 prev_next_titled_pagination()
作为一个普通函数添加到你的 functions.php 文件时,Twig 将找不到那个函数。
我还看到您将函数添加为过滤器。这意味着您通常将它与 Twig 的过滤器符号一起使用,使用 |myfoo
或 |prev_next_titled_pagination
。我想你想添加一个功能。
您可能也不需要 Twig_Extension_StringLoader
扩展名。这只是一个例子。
这是你更新的 Twig 过滤器:
/**
* This is where you can add your own functions to twig.
*
* @param string $twig get extension.
*/
public function add_to_twig( $twig ) {
$twig->addFunction( new Timber\Twig_Function( 'myfoo', array( $this, 'myfoo' ) ) );
$twig->addFunction( new Timber\Twig_Function( 'prev_next_titled_pagination', 'prev_next_titled_pagination' ) );
return $twig;
}
您还可以重写模板并将其完全转换为 Twig,而不是依赖 prev_next_titled_pagination()
函数。 Timber post 具有 post.next
和 post.prev
函数,您可以使用它们:
{% if post.prev or post.next %}
<nav aria-label="pagination">
<ul class="post-navigation">
{% if post.next %}
<li class="post-navigation__item post-navigation__item--previous">
<a href="{{ post.next.link }}"><span aria-hidden="true">←</span> {{ post.next.title }}</a>
</li>
{% endif %}
{% if post.prev %}
<li class="post-navigation__item post-navigation__item--next">
<a href="{{ post.prev.link }}">{{ post.prev.title }} <span aria-hidden="true">→</span></a>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
我正在尝试向 Timber 添加自定义功能,但我无法让它工作。我是 Timber 的新手,目前正在使用 timber 入门主题来了解它的工作原理。我有要显示的示例函数,但我的自定义函数没有显示。
我已经尝试按照 Timber 文档中的说明进行操作,并尝试使用此处给出的答案:
这是我的 functions.php 文件中的函数(在没有 Timber 的主题中工作正常)。
function prev_next_titled_pagination() {
// Don't print empty markup if there's only one page.
if ( $GLOBALS['wp_query']->max_num_pages < 2 ) {
return;
} ?>
<nav aria-label="pagination">
<ul class="post-navigation">
<?php if ( get_next_posts_link() ) : ?>
<li class="post-navigation__item post-navigation__item--previous"><?php get_next_post_link( __( '<span aria-hidden="true">←</span>' %title ) ); ?></li>
<?php endif; ?>
<?php if ( get_previous_posts_link() ) : ?>
<li class="post-navigation__item post-navigation__item--next"><?php get_previous_post_link( __( '%title <span aria-hidden="true">→</span>' ) ); ?></li>
<?php endif; ?>
</ul>
</nav>
<?php
}
这是我的 functions.php 文件中 StarterSite 对象的内容。 'myfoo' 函数有效。
/** This is where you can add your own functions to twig.
*
* @param string $twig get extension.
*/
public function add_to_twig( $twig ) {
$twig->addExtension( new Twig_Extension_StringLoader() );
$twig->addFilter( new Twig_SimpleFilter( 'myfoo', array( $this, 'myfoo' ) ) );
$twig->addFilter( new Twig_SimpleFilter( 'prev_next_titled_pagination', array( $this, 'prev_next_titled_pagination' ) ) );
return $twig;
}
下面是我在 single.twig 文件中调用函数的方式。 'myfoo' 有效。 'prev_next_titled_pagination' 没有。
{{ function( 'prev_next_titled_pagination' ) }}
{{ function('myfoo', 'HI' ) }}
这段代码没有错误,但也没有任何输出。尝试文档中的其他建议会出错。
函数应该return一个值,也不要那样分解你的函数...
<?php
function prev_next_titled_pagination() {
// Don't print empty markup if there's only one page.
if ( $GLOBALS['wp_query']->max_num_pages < 2 ) return;
$html = '<nav aria-label="pagination"><ul class="post-navigation">';
if (get_next_posts_link()) $html .= '<li class="post-navigation__item post-navigation__item--previous">'.get_next_post_link( __( '<span aria-hidden="true">←</span> %title')).'</li>';
if (get_previous_posts_link()) $html .= '<li class="post-navigation__item post-navigation__item--next">'.get_next_post_link( __( '%title <span aria-hidden="true">→</span>')).'</li>';
$html .= '</ul></nav>';
return $html; // or return new \Twig_Markup($html, 'UTF-8'); if you did not mark your output as safe in the registration
}
恕我直言,你最好给函数 get_next_posts_link
和 get_previous_posts_link
取别名,然后直接在你的模板中使用它们,而不是尝试在一个大块中这样做
我认为您的功能不起作用,因为您为 prev_next_titled_pagination
添加的 array( $this, 'prev_next_titled_pagination' )
回调是 StarterSite
class 的一个方法。但是当你将 prev_next_titled_pagination()
作为一个普通函数添加到你的 functions.php 文件时,Twig 将找不到那个函数。
我还看到您将函数添加为过滤器。这意味着您通常将它与 Twig 的过滤器符号一起使用,使用 |myfoo
或 |prev_next_titled_pagination
。我想你想添加一个功能。
您可能也不需要 Twig_Extension_StringLoader
扩展名。这只是一个例子。
这是你更新的 Twig 过滤器:
/**
* This is where you can add your own functions to twig.
*
* @param string $twig get extension.
*/
public function add_to_twig( $twig ) {
$twig->addFunction( new Timber\Twig_Function( 'myfoo', array( $this, 'myfoo' ) ) );
$twig->addFunction( new Timber\Twig_Function( 'prev_next_titled_pagination', 'prev_next_titled_pagination' ) );
return $twig;
}
您还可以重写模板并将其完全转换为 Twig,而不是依赖 prev_next_titled_pagination()
函数。 Timber post 具有 post.next
和 post.prev
函数,您可以使用它们:
{% if post.prev or post.next %}
<nav aria-label="pagination">
<ul class="post-navigation">
{% if post.next %}
<li class="post-navigation__item post-navigation__item--previous">
<a href="{{ post.next.link }}"><span aria-hidden="true">←</span> {{ post.next.title }}</a>
</li>
{% endif %}
{% if post.prev %}
<li class="post-navigation__item post-navigation__item--next">
<a href="{{ post.prev.link }}">{{ post.prev.title }} <span aria-hidden="true">→</span></a>
</li>
{% endif %}
</ul>
</nav>
{% endif %}