Oto mój kod fragmentu.
// Generate custom excerpt length
function wpbx_excerpt_length($length) {
return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');
Jak mogę zezwolić na HTML <a> <b> <i> <br>
Oto mój kod fragmentu.
// Generate custom excerpt length
function wpbx_excerpt_length($length) {
return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');
Jak mogę zezwolić na HTML <a> <b> <i> <br>
Odpowiedzi:
KOMPLETNY PRZEWODNIK PO EKSPERCJACH
Niedawno odpowiedziałem na kilka pytań dotyczących fragmentów, więc udzielę szczegółowego wyjaśnienia obejmującego jak najwięcej.
PRZEDMOWA
Wydaje się, że z tej odpowiedzi wynika kilka pytań dotyczących tego, gdzie powinien znaleźć się kod, a odpowiedź brzmi: to naprawdę zależy od ciebie i jak uważasz za stosowne. Istnieje kilka opcji, w których możesz umieścić kod (jeśli nie jest to wyraźnie określone):
W pliku theme.php lub dowolnym pliku używanym jako plik funkcji. Pamiętaj tylko, że gdy to zrobisz, jeśli motyw nie jest Twój, wszystkie zmiany zostaną utracone po uaktualnieniu motywu
Lepszym sposobem byłoby użycie kodu w motywie potomnym. Jak wyżej, w pliku functions.php lub pliku związanym z funkcjami
Użyj kodu we wtyczce. Jest to preferowany sposób, ponieważ udostępnia kod dla wszystkich motywów. Po zmianie motywów nie musisz się martwić o przepisanie tego samego kodu.
Mam nadzieję, że to trochę wyjaśni :-)
TAGI HTML / FORMATOWANIE
the_excerpt()
po pierwsze nie akceptuje żadnych parametrów, więc nic nie może zostać przekazane. Faktem jest, że the_excerpt()
przycina zawartość do 55 słów, a wszystkie tagi HTML są usuwane przed zwróceniem tekstu. the_excerpt()
znajduje się w wp-obejmuje / post-template.php . Aby zezwolić na niektóre lub wszystkie tagi HTML w tym fragmencie, należy utworzyć nowy fragment.
Po pierwsze, pierwotna funkcja musi zostać najpierw usunięta, a następnie nowa funkcja musi zostać podłączona get_the_excerpt
. Uwaga: ten nowy fragment nadal będzie można wywoływać, tak jak the_excerpt()
w plikach szablonów, nie trzeba go zmieniać. get_the_excerpt()
znajduje się w wp-obejmuje / post-template.php .
Fragment używa wp_trim_excerpt
do przycięcia przyciętego tekstu, dlatego wp_trim_excerpt
najpierw musimy usunąć go z filtra fragmentu. wp_trim_excerpt()
znajduje się w wp-include / formatting.php , linia 2355. Oto jak:
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
Możesz teraz dodać nowy fragment do get_the_excerpt
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');
Aby zezwolić na tagi HTML / formatowanie, będziemy musieli określić, które tagi musisz zezwolić. strip_tags
Aby to osiągnąć, możesz użyć następującego oświadczenia
$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());
Drugi argument wpse_allowedtags()
to niewielka funkcja używana do dodawania tagów the_excerpt()
. Aby uzyskać pełną listę prawidłowych tagów HTML 5, odwiedź ją tutaj . Oto funkcja, dodaj do niej wszelkie tagi HTML, które musisz zezwolić / zachować
function wpse_allowedtags() {
// Add custom tags to this string
return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>';
}
Jeśli musisz zezwolić na wszystkie znaczniki HTML, to znaczy bez usuwania żadnych znaczników, strips_tags()
funkcję można całkowicie pominąć / usunąć.
Należy jednak zauważyć, że gdy dozwolone są znaczniki HTML, znaczniki te są liczone jako słowa, więc liczba słów dla fragmentów ze znacznikami i bez znaczników nie będzie taka sama. Aby to poprawić, musisz najpierw usunąć te tagi z rzeczywistej liczby słów, aby policzyć tylko słowa.
Napisałem fragment, który pozwoli na wszystkie tagi, policzy tylko słowa jako słowa i uzupełnię zdanie po określonej ilości słów (aby tekst nie był przycinany w połowie zdania) i dodam więcej tekstu po ostatnim słowie .
Oto pełny kod
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) {
$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(']]>', ']]>', $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_length && 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() ) . '">' . ' » ' . sprintf(__( 'Read more about: %s »', '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_more; /*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');
Możesz po prostu usunąć „//” z funkcji, które potrzebujesz dodatkowych.
DODATKOWE DODATKOWE DŁUGOŚCI
Czasami musisz wyświetlić proste fragmenty o różnych długościach i nie jest możliwe napisanie fragmentu dla każdego postu / funkcji / strony. Oto ładna, mała, niewielka funkcjawp_trim_words
function wpse_custom_excerpts($limit) {
return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . ' …' . __( 'Read more »', 'wpse' ) . '</a>');
}
To, co robi ta niewielka funkcja, zajmuje get_the_excerpt
przycięciu jej do $limit
ustawienia przez użytkownika i zwróceniu tekstu z linkiem czytaj więcej na końcu.
Możesz nazwać ten fragment następująco w swoim szablonie
echo wpse_custom_excerpts($limit);
gdzie $limit
będzie twoje słowo, więc będzie fragment 30 słów
echo wpse_custom_excerpts(30);
Pamiętaj tylko o jednym: jeśli ustawisz limit na więcej niż 55 słów, tylko 55 słów zostanie zwróconych, ponieważ fragment ma tylko 55 słów. Jeśli potrzebne są dłuższe fragmenty, użyjget_the_content
zamiast tego.
DŁUGOŚĆ WYJĄTKOWA NIESTANDARDOWEGO
Jeśli potrzebujesz tylko zmienić długość the_excerpt()
, możesz użyć następującej funkcji
function wpse_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );
Pamiętaj, że musisz ustawić priorytet większy niż 10, aby funkcja niestandardowa była wykonywana po ustawieniu domyślnym.
DODAJ CZYTAJ WIĘCEJ LINK
Cały tekst zwrócony przez fragment ma nienawiść [...]
na końcu, której nie można kliknąć. Aby dodać więcej tekstu zamiast hellipów, użyj tej funkcji
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' );
EDYTOWAĆ
Fragment akapit pierwszy
Chcę, aby było to kompletne, więc oto fragment, który przycina po pierwszym akapicie.
Oto funkcja, która utrzymuje tagi HTML w takcie, dodaje link „Czytaj więcej” na końcu fragmentu i przycina fragment po pierwszym akapicie.
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(']]>', ']]>', $wpse0001_excerpt);
$excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . ' » ' . sprintf(__( 'Read more about: %s »', '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_more;
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');
Dla każdego, kto potrzebuje obejścia, aby nie wyświetlać linku Czytaj więcej po fragmencie, gdy fragment jest krótszy niż ustawiona liczba słów, zapoznaj się z następującym pytaniem i odpowiedzią
functions.php
. Możesz dodać to powyżej if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :
w swoimfunctions.php
Dodaj więcej tagów, jeśli potrzebujesz $allowed_tags = ...
function _20170529_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
//Retrieve the post content.
$text = get_the_content('');
//Delete all shortcode tags from the content.
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$allowed_tags = '<a>,<b>,<br><i>';
$text = strip_tags($text, $allowed_tags);
$excerpt_word_count = 55; /*** MODIFY THIS. change the excerpt word count to any integer you like.***/
$excerpt_length = apply_filters('excerpt_length', $excerpt_word_count);
$excerpt_end = '[...]'; /*** MODIFY THIS. change the excerpt endind to something else.***/
$excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
Możesz także dodać edytor tekstu sformatowanego do fragmentów, dodać poniższy kod w pliku wtyczki lub pliku function.php motywu, a zobaczysz edytor HTML dla fragmentów. Co więcej, będzie renderować również fragmenty w formacie HTML. #Twoje zdrowie
Skopiowałem to skądś, ale nie pamiętam źródła. Używam tego w moich wszystkich projektach i działa.
/**
* Replaces the default excerpt editor with TinyMCE.
*/
add_action( 'add_meta_boxes', array ( 'T5_Richtext_Excerpt', 'switch_boxes' ) );
class T5_Richtext_Excerpt
{
/**
* Replaces the meta boxes.
*
* @return void
*/
public static function switch_boxes()
{
if ( ! post_type_supports( $GLOBALS['post']->post_type, 'excerpt' ) )
{
return;
}
remove_meta_box(
'postexcerpt', // ID
'', // Screen, empty to support all post types
'normal' // Context
);
add_meta_box(
'postexcerpt2', // Reusing just 'postexcerpt' doesn't work.
__( 'Excerpt' ), // Title
array ( __CLASS__, 'show' ), // Display function
null, // Screen, we use all screens with meta boxes.
'normal', // Context
'core', // Priority
);
}
/**
* Output for the meta box.
*
* @param object $post
* @return void
*/
public static function show( $post )
{
?>
<label class="screen-reader-text" for="excerpt"><?php
_e( 'Excerpt' )
?></label>
<?php
// We use the default name, 'excerpt', so we don’t have to care about
// saving, other filters etc.
wp_editor(
self::unescape( $post->post_excerpt ),
'excerpt',
array (
'textarea_rows' => 15,
'media_buttons' => FALSE,
'teeny' => TRUE,
'tinymce' => TRUE
)
);
}
/**
* The excerpt is escaped usually. This breaks the HTML editor.
*
* @param string $str
* @return string
*/
public static function unescape( $str )
{
return str_replace(
array ( '<', '>', '"', '&', ' ', '&nbsp;' ),
array ( '<', '>', '"', '&', ' ', ' ' ),
$str
);
}
}
function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }