Как я могу изменить заголовки сообщений перед Timber :: render? - PullRequest
0 голосов
/ 26 марта 2019

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

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

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

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

1 Ответ

2 голосов
/ 28 марта 2019

Метод 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 (он предназначен для обновления предварительного просмотра сообщения), метод просто получает заголовок сообщения из базы данных и применяет к нему фильтр 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, вы можете расширить Timber/Post класс , чтобы определить собственный метод title().Детали этого подхода выходят за рамки этого вопроса, но, возможно, стоит рассмотреть, если вы хотите использовать всю мощь древесины.

...