如何在Timber :: render之前修改帖子标题?

时间:2019-03-25 22:20:36

标签: wordpress timber

我试图通过修改single.php中的{{ post.title }}输出,使其在我的single.twig模板中呈现之前,避免在整个网站中出现的帖子标题中出现寡妇/孤儿。

我想使用类似这样的PHP来插入一个不间断的空格:

$title = preg_replace( '|([^\s])\s+([^\s]+)\s*$|', '$1 $2', $title);

获取帖子标题(或所有帖子标题)并将它们发送回Timber上下文,然后再使用Timber::render()的正确方法是什么?

1 个答案:

答案 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答案提供了有关如何使用它的很好的总结:

https://wordpress.stackexchange.com/questions/305706/how-to-change-the-blog-title-with-add-filter-details-below

我还没有测试下面的代码,但是我认为这样可以满足您的要求:

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 }}的每个位置上所有帖子的所有标题。如果您想将更改限制在某些情况下,则有两个选择:

  1. 在不同情况下,使用过滤器函数内的条件语句以不同的方式更改标题(或不更改)。例如,您可以仅在特定的自定义帖子类型上应用修改,而在所有其他实例中返回默认标题。

  2. 为修改后的标题值定义一个新的上下文值,并在树枝模板中使用它代替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的力量,可能值得研究。