无法获取术语或调用函数

Posted

技术标签:

【中文标题】无法获取术语或调用函数【英文标题】:Can't get term or call functions 【发布时间】:2022-01-10 10:33:21 【问题描述】:

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

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

echo $term->count

这非常适合旧的基于 php 的模板。现在在新的 Timber 设置中,我尝试在我的 Twig 模板中直接调用 get_term_by 函数,如下所示:

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

但这会以错误 500 破坏整个网站。

我也尝试过使用 Timbers 的内置函数,例如 terms

post.terms( query:taxonomy:'post_tag'

或get_term

function('get_term', 'post_tag')

两者都没有输出。然后我尝试将其添加为自定义函数,如it's suggested in this answer.。我有一个 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 中调用它之前。它失败。另外,如果我把它放在__constructfunction 中,同样的错误仍然存​​在。

我的目标是使用内置的 Timber 函数或调用自定义函数,例如:

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

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

【问题讨论】:

Both just output nothing - 我的意思是你知道# ..... # 意味着代码被正确注释而不执行? 糟糕我的错。只是复制和粘贴问题。当然,我试图在没有评论的情况下做到这一点。我刚刚编辑了答案。 【参考方案1】:

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

我的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' 

【讨论】:

以上是关于无法获取术语或调用函数的主要内容,如果未能解决你的问题,请参考以下文章

从Azure获取令牌以访问Microsoft Graph后无法调用函数

计算机类术语

在 data() 属性中调用函数

无法调用基础构造函数 - 获取读取访问权限[重复]

错误:“currentUser”不是函数或方法,无法调用[重复]

无法在目标 C 中调用 swift 函数。获取 NSObject 的错误接口声明