无法获取术语或调用函数
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'}}
{{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' }}
我正在将旧主题迁移到新的 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'}}
{{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) }}
如果有人 运行 遇到同样的问题,我找到了解决方案。
我的 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' }}