2010-11-02 14 views
58

Como dice en el título, estoy buscando longitudes de fragmentos múltiples en WordPress.Longitudes de extractos múltiples en wordpress

entiendo que puede hacer esto en functions.php:

function twentyten_excerpt_length($length) { 
    return 15; 
} 
add_filter('excerpt_length', 'twentyten_excerpt_length'); 

Lo que quiero saber es cómo se puede tener múltiples de estos regresan diferentes valores numéricos cada uno para que pueda obtener extractos breves de bucles de la barra lateral, extractos más largos para los bucles mostrados, y el extracto más largo para el artículo principal.

Algo así como el uso de estos en las plantillas:

<?php the_excerpt('length-short') ?> 
<?php the_excerpt('length-medium') ?> 
<?php the_excerpt('length-long') ?> 

Cheers, de Dave

Respuesta

85

¿Qué tal ...

function excerpt($limit) { 
     $excerpt = explode(' ', get_the_excerpt(), $limit); 

     if (count($excerpt) >= $limit) { 
      array_pop($excerpt); 
      $excerpt = implode(" ", $excerpt) . '...'; 
     } else { 
      $excerpt = implode(" ", $excerpt); 
     } 

     $excerpt = preg_replace('`\[[^\]]*\]`', '', $excerpt); 

     return $excerpt; 
} 

function content($limit) { 
    $content = explode(' ', get_the_content(), $limit); 

    if (count($content) >= $limit) { 
     array_pop($content); 
     $content = implode(" ", $content) . '...'; 
    } else { 
     $content = implode(" ", $content); 
    } 

    $content = preg_replace('/\[.+\]/','', $content); 
    $content = apply_filters('the_content', $content); 
    $content = str_replace(']]>', ']]&gt;', $content); 

    return $content; 
} 

a continuación en el código plantilla que acaba de usar ..

<?php echo excerpt(25); ?> 

de: http://bavotasan.com/tutorials/limiting-the-number-of-words-in-your-excerpt-or-content-in-wordpress/

+3

Agradable. ¡Funciona genial! Gracias – davebowker

+6

asegúrese de que también compruebe esta función wp_trim_words http://codex.wordpress.org/Function_Reference/wp_trim_words –

+5

por favor ver mi respuesta, que está más al día y utiliza las funciones integradas de wordpress. –

24

Esto es lo que ocurrió.

Agregar a su functions.php

class Excerpt { 

    // Default length (by WordPress) 
    public static $length = 55; 

    // So you can call: my_excerpt('short'); 
    public static $types = array(
     'short' => 25, 
     'regular' => 55, 
     'long' => 100 
    ); 

    /** 
    * Sets the length for the excerpt, 
    * then it adds the WP filter 
    * And automatically calls the_excerpt(); 
    * 
    * @param string $new_length 
    * @return void 
    * @author Baylor Rae' 
    */ 
    public static function length($new_length = 55) { 
    Excerpt::$length = $new_length; 

    add_filter('excerpt_length', 'Excerpt::new_length'); 

    Excerpt::output(); 
    } 

    // Tells WP the new length 
    public static function new_length() { 
    if(isset(Excerpt::$types[Excerpt::$length])) 
     return Excerpt::$types[Excerpt::$length]; 
    else 
     return Excerpt::$length; 
    } 

    // Echoes out the excerpt 
    public static function output() { 
    the_excerpt(); 
    } 

} 

// An alias to the class 
function my_excerpt($length = 55) { 
    Excerpt::length($length); 
} 

Se puede utilizar como este.

my_excerpt('short'); // calls the defined short excerpt length 

my_excerpt(40); // 40 chars 

Esta es la forma más fácil que conozco de agregar filtros, que se pueden llamar desde una función.

+0

prefería esta respuesta ya que es una buena manera de llegar con código Gracias Baylor. –

+1

buena solución pero me tomó un tiempo para que funcione ya que carece de la prioridad para ser eficaz en (2013) versiones actuales de Wordpress: utilizar 'add_filter ('excerpt_length', 'Extracto :: new_length', 999);' en su lugar (observe el último parámetro) – Guerilla

5

Volviendo a la respuesta de Marty:

Sé que ha pasado más de un año desde que se publicó esta respuesta, pero es mejor tarde que nunca. Para que esto funcione con límites de WordPress por el default de 55, es necesario sustituir esta línea:

 $excerpt = explode(' ', get_the_excerpt(), $limit); 

con esta línea:

 $excerpt = explode(' ', get_the_content(), $limit); 

De lo contrario, la función sólo funciona con un ya trimmed- abajo pedazo de texto.

4

Creo que ahora podemos usar wp_trim_wordssee here. No estoy seguro de qué datos extra escapan y desinfección necesarios para usar esta función, pero parece interesante.

0

que lo que es posible crear un código corto, yo no lo probé pero yo escribí para que la idea principal sobre su estructura

function twentyten_excerpt_length($atts,$length=null){ 
    shortcode_atts(array('exlength'=>'short'),$atts); 

    if(!isset($atts['exlength']) || $atts['exlength'] == 'short') { 
     return 15; 
    }elseif($atts['exlength'] == 'medium'){ 
     return 30; // or any value you like 
    }elseif($atts['exlength'] == 'long'){ 
     return 45; // or any value you like 
    }else{ 
     // return nothing 
    } 
} 

add_shortcode('the_excerpt_sc','twentyten_excerpt_length'); 

para que pueda usarlo como tal

[the_excerpt_sc exlength="medium"] 
55

por el momento, se puede actualizar la respuesta de Marty:

function excerpt($limit) { 
    return wp_trim_words(get_the_excerpt(), $limit); 
} 

también puede definir la costumbre 'leer más' eslabón de esta manera:

function custom_read_more() { 
    return '... <a class="read-more" href="'.get_permalink(get_the_ID()).'">more&nbsp;&raquo;</a>'; 
} 
function excerpt($limit) { 
    return wp_trim_words(get_the_excerpt(), $limit, custom_read_more()); 
} 
+0

Con mucho, la mejor y más simple respuesta. Excelente uso de una función integrada de WP. Gracias por no sobre-diseñar una solución. –

+0

@Michal, gran parte de código, nunca pensó que en realidad podría ser tan fácil –

+2

dulce - este es el camino a seguir. Y en respuesta a las preocupaciones de Tri Nguyen acerca de desinfección de datos: 'wp_trim_words()' 'wp_strip_all_tags llamadas()' en el texto, por lo que no se preocupa por romper HTML en el contenido de la entrada. –

0

sé que esto es un hilo muy viejo, pero yo sólo tuvo problemas con este problema y ninguna de las soluciones que encontré en línea funcionado correctamente para mí. Por un lado, mi propio filtro "excerpt_more" siempre se cortaba.

La forma en que lo resolvió es feo como el infierno, pero es la única solución de trabajo que pude encontrar. La fealdad implica modificar 4 líneas de WP core (!!) + el uso de otra variable global (aunque WP ya lo hace tanto que no me siento tan mal).

me cambió wp_trim_excerpt en wp-includes/formatting.php a esto:

<?php 
function wp_trim_excerpt($text = '') { 
    global $excerpt_length; 
    $len = $excerpt_length > 0 ? $excerpt_length : 55; 
    $raw_excerpt = $text; 
    if ('' == $text) { 
     $text = get_the_content(''); 

     $text = strip_shortcodes($text); 

     $text = apply_filters('the_content', $text); 
     $text = str_replace(']]>', ']]&gt;', $text); 
     $excerpt_length = apply_filters('excerpt_length', $len); 
     $excerpt_more = apply_filters('excerpt_more', ' ' . '[&hellip;]'); 
     $text = wp_trim_words($text, $excerpt_length, $excerpt_more); 
    } 
    $excerpt_length = null; 
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); 
} 

El único nuevo material es el $excerpt_length y $len bits.

Ahora si quiero cambiar la longitud predeterminada Lo hago en mi plantilla:

<?php $excerpt_length = 10; the_excerpt() ?> 

Cambio núcleo es una solución horrible, así que me gustaría saber si alguien se le ocurre algo mejor.

+0

Hmm ... ¿cómo es que [la solución de Michal] (http://stackoverflow.com/a/17177847/238688) (Use 'wp_trim_words()') no funciona para usted? Mucho mejor que piratear el núcleo ... –

+0

Hmm ... debe haberlo perdido cuando escribí esto. Definitivamente voy a probarlo en mis proyectos actuales de WP. I _tiene_ tenido problemas con WP antes sin embargo cuando se utiliza get_the_ * funciones en lugar de ThE_ * funciones en las que no regresan exactamente lo mismo ('the_content()' y 'get_the_content()' en mi experiencia) – powerbuoy

10

Estaba buscando esta característica también y la mayoría de las funciones aquí son buenas y flexibles. Para mi caso, estaba buscando una solución que muestre una longitud de extracto diferente solo en páginas específicas. Estoy usando esto:

function custom_excerpt_length($length) { 
    return (is_front_page()) ? 15 : 25; 
} 
add_filter('excerpt_length', 'custom_excerpt_length', 999); 

Pegue este código dentro del archivo themes functions.php.

+0

Yap, esto era lo que necesitaba Thnx hombre –

0

Tenga cuidado al usar algunos de estos métodos. No todos ellos quitan las etiquetas html, es decir, si alguien inserta un enlace a un video (o url) en la primera frase de su publicación, el video (o enlace) aparecerá en el extracto, posiblemente haciendo estallar su página.

+2

Bienvenido a SO. Esto necesita ser comentado, no respondido. Espera paciencia, obtendrás derechos de comentario. –

+1

Gracias Maximus, me disculpo. –

4

se pueden agregar a su archivo functions.php esta función

function custom_length_excerpt($word_count_limit) { 
    $content = wp_strip_all_tags(get_the_content() , true); 
    echo wp_trim_words($content, $word_count_limit); 
} 

Entonces llamarlo en su plantilla como esta

<p><?php custom_length_excerpt(50); ?> 

El wp_strip_all_tags debe impedir que las etiquetas HTML callejeros de dividir esta página.


documentación sobre las funciones

+3

¿hay alguna manera de omitir el código html usando el ejemplo anterior? shortcode es visible en algunas de mis páginas – Marko

2

Aquí una manera fácil de limitar el contenido o el extracto

$content = get_the_excerpt(); 
$content = strip_tags($content);  
echo substr($content, 0, 255); 

cambio get_the_excerpt() por get_the_content() si desea que el contenido.

Regards

+0

¡Gracias por esto! –

+0

¡Bienvenido! , No hay problema :) – Mohammed

-1

Here es un artículo sobre el uso de encargo longitud extracto en WordPres. Hay una serie de formas de limitar & longitud del extracto del poste de control.

  1. Limitar la longitud del fragmento de publicación o la longitud del contenido del mensaje utilizando el número de palabras.
  2. Limitar la longitud del extracto a una serie de caracteres.
  3. Limite el resumen del mensaje agregando la etiqueta "leer más".
  4. Habilitación de extracto de encargo para escribir su propio resumen para cada puesto.
  5. control Extracto de longitud usando filtros

http://smallenvelop.com/limit-post-excerpt-length-in-wordpress/ espero que esto le ayudará mucho.

0

lo haría así:

function _get_excerpt($limit = 100) { 
    return has_excerpt() ? get_the_excerpt() : wp_trim_words(strip_shortcodes(get_the_content()),$limit); 
} 

Uso:

echo _get_excerpt(30); // Inside the loop/query 

¿Por qué?

  • Si has_excerpt debe devolver extracto dado
  • No, por lo palabras de equipamiento/códigos cortos tira de the_content
Cuestiones relacionadas