Как запретить WordPress удалять HTML-теги в выдержке

Я использую wp_trim_words, чтобы обрезать некоторые отрывки на моей домашней странице. Он отлично работает, за исключением того, что он удаляет теги HTML из выдержек. Мне нужно сделать некоторые фрагменты выдержки полужирным шрифтом (используя <strong> ). Следуя инструкциям здесь , я попытался удалить функцию wp_trim_words и заменить ее новым, используя следующий код, который заменяет $text = wp_strip_all_tags( $text ); от исходной функции WP с помощью $text = strip_tags($text, '<strong>',); , Но это ломает сайт. Что я делаю не так?

  // Remove Reverie Trim Words function remove_trim_words() { remove_filter('get_the_excerpt', 'wp_trim_words'); add_filter('get_the_excerpt', 'oakwood_trim_words'); } // Replace Reverie Trim Words function oakwood_trim_words( $text, $num_words = 55, $more = null ) { if ( null === $more ) $more = __( '&hellip;' ); $original_text = $text; $text = strip_tags($text, '<strong>',); /* translators: If your word count is based on single characters (East Asian characters), enter 'characters'. Otherwise, enter 'words'. Do not translate into your own language. */ if ( 'characters' == _x( 'words', 'word count: words or characters?' ) && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) ) { $text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' ); preg_match_all( '/./u', $text, $words_array ); $words_array = array_slice( $words_array[0], 0, $num_words + 1 ); $sep = ''; } else { $words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY ); $sep = ' '; } if ( count( $words_array ) > $num_words ) { array_pop( $words_array ); $text = implode( $sep, $words_array ); $text = $text . $more; } else { $text = implode( $sep, $words_array ); } /** * Filter the text content after words have been trimmed. * * @since 3.3.0 * * @param string $text The trimmed text. * @param int $num_words The number of words to trim the text to. Default 5. * @param string $more An optional string to append to the end of the trimmed text, eg &hellip;. * @param string $original_text The text before it was trimmed. */ return apply_filters( 'oakwood_trim_words', $text, $num_words, $more, $original_text ); } 

Related of "Как запретить WordPress удалять HTML-теги в выдержке"

ПОЛНОЕ РУКОВОДСТВО ДЛЯ ЭКСКУРСОВ

Недавно я ответил на несколько вопросов относительно выдержек, поэтому я расскажу подробное объяснение, охватывающее как можно больше.

HTML TAGS / FORMATTING

the_excerpt() первую очередь не содержит никаких параметров, поэтому к нему ничего нельзя передать. В том факте, что the_excerpt() обрезает содержимое до 55 слов, а все теги html удаляются перед возвратом текста. the_excerpt() находится в wp-includes / post-template.php . Чтобы разрешить определенные или все теги html в выдержке, необходимо создать новую выдержку.

Прежде всего, сначала нужно удалить исходную функцию, а затем новую функцию нужно подключить к get_the_excerpt . Обратите внимание, что этот новый отрывок по-прежнему будет вызываться как the_excerpt() в файлах шаблонов, не нужно его изменять. get_the_excerpt() находится в wp-includes / post-template.php .

В выдержке используется wp_trim_excerpt для возврата обрезанного текста, поэтому сначала нужно удалить wp_trim_excerpt из фильтра выдержки. wp_trim_excerpt() находится в wp-includes / formatting.php , строка 2355. Вот как это сделать:

 remove_filter('get_the_excerpt', 'wp_trim_excerpt'); 

Теперь вы можете добавить свой новый отрывок в get_the_excerpt

 add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt'); 

Чтобы разрешить html-теги / форматирование, нам нужно будет указать, какие теги вам нужно разрешить. Вы можете использовать следующую инструкцию strip_tags для достижения этой

 $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); 

Второй аргумент wpse_allowedtags() – это небольшая функция, которая используется для добавления тегов, которые разрешит the_excerpt() . Полный список допустимых тегов HTML5 можно найти здесь . Вот функция, добавьте любой тег html к этому, который вам нужно разрешить / сохранить

 function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; } 

Если вам нужно разрешить все теги HTML, то есть не strips_tags() любые теги, strips_tags() может быть полностью исключена / удалена.

Однако следует отметить, что, когда html-теги разрешены, эти теги подсчитываются как слова, поэтому ваше число слов для выдержек с тегами и без тегов не будет одинаковым. Чтобы исправить это, вам нужно сначала удалить эти теги из фактического количества слов, чтобы подсчитывались только слова.

Я написал выдержку, которая позволит все теги, считать только слова в виде слов и завершить предложение после заданного количества слов (не будет обрезать текст в середине предложения) и добавить текст после последнего слова.

Вот полный код

 function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; } if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) : function wpse_custom_wp_trim_excerpt($wpse_excerpt) { global $post; $raw_excerpt = $wpse_excerpt; if ( '' == $wpse_excerpt ) { $wpse_excerpt = get_the_content(''); $wpse_excerpt = strip_shortcodes( $wpse_excerpt ); $wpse_excerpt = apply_filters('the_content', $wpse_excerpt); $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt); $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */ //Set the excerpt word count and only break after sentence is complete. $excerpt_word_count = 75; $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); $tokens = array(); $excerptOutput = ''; $count = 0; // Divide the string into tokens; HTML tags, or words, followed by any whitespace preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens); foreach ($tokens[0] as $token) { if ($count >= $excerpt_word_count && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { // Limit reached, continue until , ; ? . or ! occur at the end $excerptOutput .= trim($token); break; } // Add words to complete sentence $count++; // Append what's left of the token $excerptOutput .= $token; } $wpse_excerpt = trim(force_balance_tags($excerptOutput)); $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'wpse' ), get_the_title()) . '</a>'; $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); //$pos = strrpos($wpse_excerpt, '</'); //if ($pos !== false) // Inside last HTML tag //$wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); /* Add read more next to last word */ //else // After the content $wpse_excerpt .= $excerpt_end; /*Add read more in new paragraph */ return $wpse_excerpt; } return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt); } endif; remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt'); 

Вы можете просто удалить «//» из функций, которые вам нужны дополнительно.

ДЛИННЫЕ ПОКАЗАТЕЛИ

Иногда вам нужно отображать простые выдержки разной длины, и не представляется возможным написать выдержку для каждой страницы / функции / страницы. Вот небольшая небольшая функция, использующая wp_trim_words

 function wpse_custom_excerpts($limit) { return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&hellip;' . __( 'Read more &nbsp;&raquo;', 'wpse' ) . '</a>'); } 

То, что эта небольшая функция делает, – это сделать get_the_excerpt обрезая, чтобы установить $limit на $limit установленное пользователем, и возвратить текст с get_the_excerpt ссылкой в ​​конце.

Вы можете вызывать этот отрывок, как указано в шаблоне

 echo wpse_custom_excerpts($limit); 

где $limit будет вашим количеством слов, поэтому выдержка из 30 слов будет

 echo wpse_custom_excerpts(30); 

Только одну вещь, которую нужно запомнить здесь, если вы установите свой предел более чем на 55 слов, будет возвращено всего 55 слов, так как выдержка составляет всего 55 слов. Если вам нужны более длинные отрывки, используйте вместо этого get_the_content .

ДЛИНА ТАМОЖЕННОЙ ЭКСКЕРПЦИИ

Если вам просто нужно изменить длину the_excerpt() , вы можете использовать следующую функцию

 function wpse_excerpt_length( $length ) { return 20; } add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 ); 

Помните, что вам нужно будет установить приоритет более 10, чтобы ваша пользовательская функция выполнялась по умолчанию.

ДОБАВИТЬ БОЛЬШЕ ССЫЛКИ

Весь текст, возвращаемый выдержкой, имеет ненавистный [...] в конце, который не доступен для клика. Чтобы добавить текст вместо текста, используйте эту функцию

  function wpse_excerpt_more( $more ) { return ' <a class="read-more" href="'. get_permalink( get_the_ID() ) . '">' . __('Read More', 'your-text-domain') . '</a>'; } add_filter( 'excerpt_more', 'wpse_excerpt_more' ); 

РЕДАКТИРОВАТЬ

Выдержка из первого абзаца

Я хочу сохранить это полностью, так что вот выдержка, которая урезает после первого абзаца

Вот функция, которая хранит теги HTML в тактике, добавляет ссылку «Читать дальше» в конце выдержки и обрезает выдержку после первого абзаца.

 if ( ! function_exists( 'wpse0001_custom_wp_trim_excerpt' ) ) : function wpse0001_custom_wp_trim_excerpt($wpse0001_excerpt) { global $post; $raw_excerpt = $wpse0001_excerpt; if ( '' == $wpse0001_excerpt ) { $wpse0001_excerpt = get_the_content(''); $wpse0001_excerpt = strip_shortcodes( $wpse0001_excerpt ); $wpse0001_excerpt = apply_filters('the_content', $wpse0001_excerpt); $wpse0001_excerpt = substr( $wpse0001_excerpt, 0, strpos( $wpse0001_excerpt, '</p>' ) + 4 ); $wpse0001_excerpt = str_replace(']]>', ']]&gt;', $wpse0001_excerpt); $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); //$pos = strrpos($wpse0001_excerpt, '</'); //if ($pos !== false) // Inside last HTML tag //$wpse0001_excerpt = substr_replace($wpse0001_excerpt, $excerpt_end, $pos, 0); //else // After the content $wpse0001_excerpt .= $excerpt_end; return $wpse0001_excerpt; } return apply_filters('wpse0001_custom_wp_trim_excerpt', $wpse0001_excerpt, $raw_excerpt); } endif; remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', 'wpse0001_custom_wp_trim_excerpt'); 

Вы не можете разрешить форматирование html в выдержке, как если бы текст отключился до закрытия тега, это создаст нежелательное форматирование на остальной части страницы. Думайте о смелом применении от 20-го символа до 1000-го символа. Если используется форматирование, он будет применять начальный жирный тег, но не конец, поскольку предел текста составляет только 55-й символ.

Попробуйте добавить это в свои функции. Php

 add_filter( 'get_the_content_limit_allowedtags', 'get_the_content_limit_custom_allowedtags' ); function get_the_content_limit_custom_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>'; }