无法获取术语或调用函数

Can't get term or call functions

我正在将旧主题迁移到新的 Class-based 设置 Timber。有一个名为“collection”的自定义 Post 类型。在一个循环中,我在概览页面上输出所有 collection。每个计数表示该特定 collection 中有多少帖子。每个 collection 的标题用于获取具有相同名称的相关术语,然后我统计具有相应标签的帖子数。像这样:

$term_slug = get_the_title($post->ID, 'title');
$term = get_term_by('name', $term_slug, 'post_tag');

echo $term->count

这与旧的 PHP-based 模板配合得很好。现在在新的 Timber 设置中,我尝试在我的 Twig 模板中直接调用 get_term_by 函数,如下所示:

{{function('get_term_by', 'name', post.title, 'post_tag', post.id)}}

但这会破坏整个站点并出现错误 500。

我还尝试使用 Timbers built-in 函数,例如 terms

post.terms( {query:{taxonomy:'post_tag'}}

get_term

{{function('get_term', 'post_tag')}}

两者都没有输出。然后我尝试将其添加为自定义函数,如 。我有一个 Theme.php 文件来完成所有的处理和加载:

// Theme.php

<?php

namespace Mytheme\Theme;
use Timber\Timber;

class Theme {
    public function __construct() {
        $this->theme = wp_get_theme();

        Timber::$dirname = array( 'templates', 'source/views' );
    }
    public function run() {

    // all the other loading stuff and then...

        if(class_exists('Timber')) {
            add_filter( 'timber/twig', function( \Twig_Environment $twig ) {
                $twig->addFunction( new \Timber\Twig_Function( 'myFunction', 'myFunction' ) );
            });
        }
    }
    
    public function myFunction($term_slug, $taxonomy) {
        $term = get_term_by('name', $term_slug, $taxonomy);
        return $term->count;
    }
}

在我的 functions.php 中,我正在实例化 运行 它是这样的:

<?php

require_once( __DIR__ . '/vendor/autoload.php' );
$timber = new Timber\Timber();

// autoload stuff Packages and then...

if (!function_exists('sbx_theme')) {
    function sbx_theme()
    {       
        return Swissbeatbox\Theme\Theme::getInstance();
    }
}

sbx_theme();
sbx_theme()->run();

这个设置 运行 很顺利,但是一旦添加 myFunction 它就会失败并出现错误:

Call to a member function addFunction() on null in ...timber/timber/lib/FunctionWrapper.php on line 75

所以甚至在我尝试在 Twig 中调用它之前。它失败。另外,如果我把它放在 __construct 函数中,同样的错误仍然存​​在。

我的目标是使用 built-in Timber 函数或调用自定义函数,例如:

{ {myFunction(post.title, 'post_tag', post.id) }}

{{ function('myFunction', post.title, 'post_tag', post.id) }}

如果有人 运行 遇到同样的问题,我找到了解决方案。 我错过了我正在处理 class 的方法并且它必须是静态的。另一个细节是,我需要将实例传递给回调。

我的 Theme.php 现在看起来像这样:

namespace Mytheme\Theme;
use Timber\Timber;

class Theme {
    public function __construct() {
        $this->theme = wp_get_theme();

        Timber::$dirname = array( 'templates', 'source/views' );
        
        add_filter( 'timber/twig', array( $this, 'add_to_twig' ) );
    }
    
    public function add_to_twig( $twig ) {
        $twig->addFunction(new \Timber\Twig_Function('count_entries', [$this, 'count_entries']));       
        return $twig;
    }

    public static function count_entries($term_slug, $taxonomy) {
        $term = get_term_by('name', $term_slug, $taxonomy);
        return $term->count;
    }

}

在我的 Twig 文件中,我现在可以:

{{ count_entries(post.title, 'post_tag' }}