为什么我的自定义函数不适用于 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">&larr;</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">&rarr;</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">&larr;</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">&rarr;</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_linkget_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.nextpost.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">&larr;</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">&rarr;</span></a>
                </li>
            {% endif %}
        </ul>
    </nav>
{% endif %}