如何在 Timber::render 之前修改 post 个标题?
How can I modify post titles before Timber::render?
我试图通过修改 single.php 中的 {{ post.title }}
输出来避免 widows/orphans 在我的 post 标题中出现在我的网站中single.twig 模板。
我想使用类似这样的东西 PHP 来插入一个不间断的 space:
$title = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', ' ', $title);
获得 post 标题(或所有 post 的标题)并在我使用 Timber::render()
之前将它们发送回 Timber 上下文的正确方法是什么?
Timber Post object 的 title()
方法大部分只是 Wordpress 自己的 the_title()
函数的 pass-through。
这里是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 语句(它可以帮助更新 post 的预览),该方法只是从数据库中获取 post 的标题并应用 Wordpress the_title
对其进行过滤。
这意味着您可以通过修改 the_title
过滤器来修改您的标题输出。之前的 Whosebug 回答很好地总结了如何使用它:
我没有测试下面的代码,但我认为根据您的要求,这样的代码应该可以工作:
add_filter('the_title', 'modify_all_titles', 10, 2);
function modify_all_titles($title, $id) {
return preg_replace( '|([^\s])\s+([^\s]+)\s*$|', ' ', $title);
}
请务必注意,这将更改网站上使用 the_title()
或 {{ post.title }}
的每个地方的所有 post 的所有标题。如果您想将更改限制在某些情况下,您有两个选择:
在过滤函数中使用条件语句在不同情况下以不同方式修改(或不修改)标题。例如,您可以仅将修改应用于特定的自定义 post 类型,同时在所有其他实例中返回默认标题。
为您修改后的标题值定义一个新的上下文值,并在您的 twig 模板中使用它代替 post.title
。
例如,在您的 PHP 模板文件中,您可以在定义 $context
和 $post
之后但在 Timber::render()
之前添加以下内容:
$context['custom_title'] = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', ' ', $title);
然后在你的 Twig 文件中,你可以使用 {{ custom_title }}
而不是 {{ post.title }}
。
最后,如果您喜欢 object 导向 PHP,您可以 extend the Timber/Post
class 定义自己的 title()
方法。该方法的详细信息超出了这个问题的范围,但如果您想利用 Timber 的全部功能,可能值得研究一下。
我试图通过修改 single.php 中的 {{ post.title }}
输出来避免 widows/orphans 在我的 post 标题中出现在我的网站中single.twig 模板。
我想使用类似这样的东西 PHP 来插入一个不间断的 space:
$title = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', ' ', $title);
获得 post 标题(或所有 post 的标题)并在我使用 Timber::render()
之前将它们发送回 Timber 上下文的正确方法是什么?
Timber Post object 的 title()
方法大部分只是 Wordpress 自己的 the_title()
函数的 pass-through。
这里是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 语句(它可以帮助更新 post 的预览),该方法只是从数据库中获取 post 的标题并应用 Wordpress the_title
对其进行过滤。
这意味着您可以通过修改 the_title
过滤器来修改您的标题输出。之前的 Whosebug 回答很好地总结了如何使用它:
我没有测试下面的代码,但我认为根据您的要求,这样的代码应该可以工作:
add_filter('the_title', 'modify_all_titles', 10, 2);
function modify_all_titles($title, $id) {
return preg_replace( '|([^\s])\s+([^\s]+)\s*$|', ' ', $title);
}
请务必注意,这将更改网站上使用 the_title()
或 {{ post.title }}
的每个地方的所有 post 的所有标题。如果您想将更改限制在某些情况下,您有两个选择:
在过滤函数中使用条件语句在不同情况下以不同方式修改(或不修改)标题。例如,您可以仅将修改应用于特定的自定义 post 类型,同时在所有其他实例中返回默认标题。
为您修改后的标题值定义一个新的上下文值,并在您的 twig 模板中使用它代替
post.title
。
例如,在您的 PHP 模板文件中,您可以在定义 $context
和 $post
之后但在 Timber::render()
之前添加以下内容:
$context['custom_title'] = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', ' ', $title);
然后在你的 Twig 文件中,你可以使用 {{ custom_title }}
而不是 {{ post.title }}
。
最后,如果您喜欢 object 导向 PHP,您可以 extend the Timber/Post
class 定义自己的 title()
方法。该方法的详细信息超出了这个问题的范围,但如果您想利用 Timber 的全部功能,可能值得研究一下。