#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 дает хорошее представление о том, как его использовать:
Я не тестировал приведенный ниже код, но я думаю, что что-то подобное должно сработать, учитывая ваши требования:
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 }}
используется на сайте. Если вы хотите ограничить изменение определенными ситуациями, у вас есть два варианта:
-
Используйте условные обозначения внутри вашей функции фильтра, чтобы изменить заголовок (или нет) по-разному в разных обстоятельствах. Например, вы могли бы применить свои изменения только к определенному пользовательскому типу записи, возвращая заголовок по умолчанию во всех других экземплярах.
-
Определите новое контекстное значение для измененного вами значения заголовка и используйте его вместо
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.