Aquí está mi código de extracto.
// Generate custom excerpt length
function wpbx_excerpt_length($length) {
return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');
¿Cómo permito html como <a> <b> <i> <br>
Aquí está mi código de extracto.
// Generate custom excerpt length
function wpbx_excerpt_length($length) {
return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');
¿Cómo permito html como <a> <b> <i> <br>
Respuestas:
GUÍA COMPLETA DE EXTRACTOS
Recientemente he respondido algunas preguntas sobre extractos, así que voy a dar una explicación detallada que cubra todo lo que pueda.
PREFACIO
Parece que hay un par de preguntas que surgen de esta respuesta sobre dónde debe ir el código, y la respuesta es que realmente depende de usted y cómo lo considere conveniente. Hay un par de opciones donde puede colocar el código (si no se indica explícitamente):
En las funciones de tu tema.php o cualquier archivo, utilízalo como archivo de funciones. Solo recuerde cuando haga esto, si el tema no es suyo, todos los cambios se perderán cuando actualice su tema
Una mejor manera sería usar el código en un tema secundario. Como arriba, en el archivo functions.php o funciones relacionadas
Use el código en un complemento. Esta es la forma preferida, ya que hace que el código esté disponible en todos los temas. Si cambia de tema, no tiene que preocuparse por reescribir el mismo código.
Espero que esto aclare las cosas un poco :-)
Etiquetas HTML / formato
the_excerpt()
en primer lugar no acepta ningún parámetro, por lo que no se le puede pasar nada. Es un hecho que the_excerpt()
recorta el contenido a 55 palabras, y todas las etiquetas HTML se eliminan antes de devolver el texto. the_excerpt()
se encuentra en wp-includes / post-template.php . Para permitir ciertas o todas las etiquetas HTML en el extracto, se debe crear un nuevo extracto.
En primer lugar, la función original debe eliminarse primero, y luego la nueva función debe conectarse get_the_excerpt
. Tenga en cuenta que este nuevo extracto seguirá siendo invocable como the_excerpt()
en los archivos de plantilla, no es necesario cambiar eso. get_the_excerpt()
se encuentra en wp-includes / post-template.php .
El extracto se utiliza wp_trim_excerpt
para devolver el texto recortado, por lo que debemos eliminarlo wp_trim_excerpt
primero del filtro de extracto. wp_trim_excerpt()
se encuentra en wp-includes / formatting.php , línea 2355. Así es como:
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
Ahora puede agregar su nuevo extracto a get_the_excerpt
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');
Para permitir el formato / etiquetas html, necesitaremos especificar qué etiquetas deberá permitir. Puede usar la siguiente strip_tags
declaración para lograr eso
$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());
El segundo argumento wpse_allowedtags()
es una pequeña función que se usa para agregar las etiquetas the_excerpt()
que permitirá. Para obtener una lista completa de etiquetas HTML 5 válidas, vaya y compruébelo aquí . Aquí está la función, agregue cualquier etiqueta html a esto que necesite permitir / mantener
function wpse_allowedtags() {
// Add custom tags to this string
return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>';
}
Si necesita permitir todas las etiquetas HTML, es decir, sin quitar ninguna etiqueta, la strips_tags()
función se puede omitir / eliminar por completo.
Sin embargo, un punto a tener en cuenta, cuando se permiten etiquetas html, estas etiquetas se cuentan como palabras, por lo que su recuento de palabras para extractos con etiquetas y sin etiquetas no será el mismo. Para corregir eso, primero deberá eliminar estas etiquetas del recuento de palabras real para que solo se cuenten las palabras.
He escrito un extracto que permitirá todas las etiquetas, contará solo las palabras como palabras y completará una oración después de la cantidad establecida de palabras (para que el texto no se recorte a mitad de la oración) y agregue un texto de leer más después de la última palabra .
Aquí está el código completo.
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');
Simplemente puede eliminar el '//' de las funciones que necesita extra.
LONGITUDES DE EXTRACTO PERSONALIZADAS
A veces es necesario mostrar extractos simples de diferentes longitudes y no es viable escribir un extracto para cada publicación / función / página. Aquí hay una pequeña y bonita función usandowp_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>');
}
Lo que hace esta pequeña función es tomarla get_the_excerpt
, recortarla para $limit
que el usuario la configure y devolver el texto con un enlace de leer más al final.
Puedes llamar a este extracto como sigue en tu plantilla
echo wpse_custom_excerpts($limit);
¿Dónde $limit
estará su número de palabras, por lo que un extracto de 30 palabras será
echo wpse_custom_excerpts(30);
Solo una cosa para recordar aquí, si establece su límite en más de 55 palabras, solo se devolverán 55 palabras ya que el extracto tiene solo 55 palabras de longitud. Si se necesitan extractos más largos, use get_the_content
en su lugar.
LONGITUD DE EXTRACTO PERSONALIZADO
Si solo necesita modificar la longitud de the_excerpt()
, puede usar la siguiente función
function wpse_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );
Recuerde, deberá establecer una prioridad mayor que 10 para que su función personalizada se ejecute después de la predeterminada.
AGREGAR LEER MÁS ENLACE
Todo el texto devuelto por el extracto tiene [...]
el final al que no se puede hacer clic. Para agregar un texto de leer más en lugar de los infiernos, use esta función
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' );
EDITAR
Extracto del primer párrafo
Quiero mantener esto completo, así que aquí está el extracto que se recorta después del primer párrafo.
Aquí hay una función que mantiene intactas las etiquetas HTML, agrega un enlace "Leer más" al final del extracto y recorta el extracto después del primer párrafo.
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');
Para cualquiera que necesite una solución alternativa para no mostrar el enlace leer más después del extracto cuando el extracto es más corto que la cantidad de palabras establecida, consulte la siguiente pregunta y respuesta
functions.php
. Puede agregar eso justo arriba if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :
en sufunctions.php
Agregue más etiquetas si necesita $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);
}
También puede agregar un editor de texto enriquecido para extractos, agregue el código a continuación en el archivo de complemento o en el archivo function.php del tema y podrá ver el editor HTML para extractos. Además, también representará extractos en formato HTML. #salud
He copiado esto de alguna parte pero no recuerdo la fuente. Estoy usando esto en todos mis proyectos y está funcionando.
/**
* 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>'; }