我试图通过修改single.php中的{{ post.title }}
输出,使其在我的single.twig模板中呈现之前,避免在整个网站中出现的帖子标题中出现寡妇/孤儿。
我想使用类似这样的PHP来插入一个不间断的空格:
$title = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', '$1 $2', $title);
获取帖子标题(或所有帖子标题)并将它们发送回Timber上下文,然后再使用Timber::render()
的正确方法是什么?
答案 0 :(得分:2)
Timber Post对象的title()
方法主要只是Wordpress自己的the_title()
函数的传递。
以下是title()
方法的相关代码:
public function title() {
if ( $rd = $this->get_revised_data_from_method('title') ) {
return $rd;
}
return apply_filters('the_title', $this->post_title, $this->ID);
}
忽略if语句(在那里可以帮助更新帖子的预览),该方法只是从数据库中获取帖子的标题,并对其应用Wordpress the_title
过滤器。
这意味着您可以通过修改the_title
过滤器来修改标题输出。先前的StackOverflow答案提供了有关如何使用它的很好的总结:
我还没有测试下面的代码,但是我认为这样可以满足您的要求:
add_filter('the_title', 'modify_all_titles', 10, 2);
function modify_all_titles($title, $id) {
return preg_replace( '|([^\s])\s+([^\s]+)\s*$|', '$1 $2', $title);
}
请务必注意,这将更改网站上使用the_title()
或{{ post.title }}
的每个位置上所有帖子的所有标题。如果您想将更改限制在某些情况下,则有两个选择:
在不同情况下,使用过滤器函数内的条件语句以不同的方式更改标题(或不更改)。例如,您可以仅在特定的自定义帖子类型上应用修改,而在所有其他实例中返回默认标题。
为修改后的标题值定义一个新的上下文值,并在树枝模板中使用它代替post.title
。
例如,在您的PHP模板文件中,可以在定义$context
和$post
之后但在Timber::render()
之前添加以下内容:
$context['custom_title'] = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', '$1 $2', $title);
然后在Twig文件中,可以使用{{ custom_title }}
代替{{ post.title }}
。
最后,如果您使用面向对象的PHP,则可以extend the Timber/Post
class定义自己的title()
方法。这种方法的细节不在此问题的讨论范围之内,但是如果您想充分利用Timber的力量,可能值得研究。