Вопрос или проблема
Некоторое время назад (более 5 лет) меня попросили создать сайт, где требуется добавить немного HTML в отрывок WP. Насколько я помню, я добился этого, переопределив “get_the_excerpt”, что-то вроде принятого ответа здесь: Allow HTML in excerpt
Это, кажется, не работает в последней версии WP 6.2.2 (на момент написания), может ли кто-то указать мне правильное направление для разрешения включения нескольких HTML тегов в отрывок?
Если я изменю formatting.php > strip_all_tags, как показано ниже, я получу нужный мне результат, но, очевидно, изменение ядра не является решением, как бы я добился этого в functions.php моей дочерней темы?
function wp_strip_all_tags( $text, $remove_breaks = false ) {
if ( is_null( $text ) ) {
return '';
}
if ( ! is_scalar( $text ) ) {
trigger_error(
sprintf(
__( 'Warning: %1$s expects parameter %2$s (%3$s) to be a %4$s, %5$s given.' ),
__FUNCTION__,
'#1',
'$text',
'string',
gettype( $text )
),
E_USER_WARNING
);
return '';
}
$text = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $text );
$text = strip_tags( $text, '<h3>, <div>, <span>' ); // TO DO OVERRIDE
if ( $remove_breaks ) {
$text = preg_replace( '/[\r\n\t ]+/', ' ', $text );
}
return trim( $text );
}
Для начала вам нужно удалить функцию wp_trim_excerpt
из фильтра get_the_excerpt
:
remove_filter( 'get_the_excerpt', 'wp_trim_excerpt', 10 );
Это приведет к отсутствию автоматической генерации отрывков (вручную введенные отрывки все равно будут отображаться).
Отсюда добавьте свою собственную функцию и фильтр для генерации отрывка:
function trim_excerpt_with_html( $text="", $post = null ) {
...
}
add_filter( 'get_the_excerpt', 'trim_excerpt_with_html', 10, 2 );
.
Ответ или решение
Конечно! Давайте рассмотрим, как внедрить HTML в отрывок (excerpt) на WordPress 6.2.2, сохраняя при этом целостность и работоспособность вашего сайта. Ваша задача — разрешить использование определенных HTML-тегов в отрывках, избегая при этом редактирования ядра WordPress, так как это приведет к проблемам при будущих обновлениях платформы.
Шаг 1: Удаление стандартного фильтра
Сначала вам нужно убрать стандартный фильтр wp_trim_excerpt
, чтобы предотвратить автоматическое обрезание текста без HTML-тегов. Это можно сделать следующим образом:
remove_filter( 'get_the_excerpt', 'wp_trim_excerpt', 10 );
Данный код отключает стандартное формирование отрывков. Однако это решение подходит только для тех случаев, когда отрывки вводятся вручную: такие отрывки продолжат отображаться.
Шаг 2: Создание собственного фильтра
После того, как стандартный фильтр удалён, необходимо написать свою собственную функцию для обработки отрывков. В вашей теме, в файле functions.php
создайте новую функцию:
function trim_excerpt_with_html($text = "", $post = null) {
if ('' == $text) {
// Получаем полный текст
$text = get_the_content('');
// Удаляем короткие коды и выполняем предварительную обработку
$text = strip_shortcodes($text);
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
// Разрешаем использование определенных тегов
$allowed_tags = '<h3><div><span>'; // Укажите необходимые теги
$text = strip_tags($text, $allowed_tags);
// Ограничиваем длину текста отрывка (при необходимости)
$excerpt_length = apply_filters('excerpt_length', 55);
$text = wp_trim_words($text, $excerpt_length, '...');
}
return $text;
}
add_filter('get_the_excerpt', 'trim_excerpt_with_html', 10, 2);
Пояснение кода:
- Обработка текста: Внутри функции сначала получаем полный контент поста и убираем короткие коды.
- Фильтрация: Функция
strip_tags
позволяет оставить определенные HTML-теги, указанные в строке$allowed_tags
. - Ограничение: Вы можете использовать
wp_trim_words
для ограничения количества слов в отрывке, если это необходимо.
Заключение
Применив данные изменения, вы сможете динамично управлять содержанием отрывков в WordPress, используя при этом HTML. Таким образом, вы сохраните работу сайта стабильной, обеспечивая совместимость с будущими обновлениями WordPress. Этот метод позволяет избежать редактирования файлов ядра, что, безусловно, важно для поддержания гибкости и обновляемости вашего веб-ресурса.
Используйте этот подход, чтобы сделать ваш сайт более привлекательным и интерактивным, сохраняя SEO-оптимизацию и пользовательский опыт на высшем уровне.