Как я могу изменить заголовки записей перед Timber :: render?

#wordpress #timber

#wordpress #timber

Вопрос:

Я пытаюсь избежать вдов / сирот в заголовках моих сообщений, которые появляются по всему моему сайту, изменяя {{ post.title }} выходные данные в single.php перед тем, как они будут отображены в моем сингле.шаблон twig.

Я хотел бы использовать что-то вроде этого PHP для вставки неразрывного пробела:

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

Каков правильный способ получить заголовок записи (или все заголовки записей) и отправить их обратно в контекст Timber перед использованием Timber::render() ?

Ответ №1:

title() Метод для объекта Timber Post в основном является просто сквозным для собственной the_title() функции WordPress.

Вот соответствующий код для 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 (она предназначена для обновления предварительного просмотра записи), метод просто получает заголовок записи из базы данных и применяет к нему the_title фильтр WordPress.

Это означает, что вы можете изменить свой вывод заголовка, изменив 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*$|', '$1amp;nbsp;$2', $title);
}
  

Важно отметить, что это изменит ВСЕ заголовки для ВСЕХ записей в каждом месте, которое the_title() или {{ post.title }} используется на сайте. Если вы хотите ограничить изменение определенными ситуациями, у вас есть два варианта:

  1. Используйте условные обозначения внутри вашей функции фильтра, чтобы изменить заголовок (или нет) по-разному в разных обстоятельствах. Например, вы могли бы применить свои изменения только к определенному пользовательскому типу записи, возвращая заголовок по умолчанию во всех других экземплярах.

  2. Определите новое контекстное значение для измененного вами значения заголовка и используйте его вместо post.title в вашем шаблоне twig.

Например, в вашем файле шаблона PHP вы могли бы добавить следующее после того, как $context и $post были определены, но до Timber::render() :

 $context['custom_title'] = preg_replace( '|([^s])s ([^s] )s*$|', '$1amp;nbsp;$2', $title);
  

Затем в вашем файле Twig вы можете использовать {{ custom_title }} вместо {{ post.title }} .

Наконец, если вы занимаетесь объектно-ориентированным PHP, вы могли бы расширить Timber/Post класс, чтобы определить свой собственный title() метод. Детали этого подхода выходят за рамки этого вопроса, но, возможно, стоит изучить, если вы хотите использовать всю мощь Timber.