web-dev-qa-db-fra.com

Plusieurs longueurs d'extrait en wordpress

Comme il est dit dans le titre, je recherche plusieurs longueurs d'extraits dans WordPress.

Je comprends que vous pouvez le faire dans functions.php:

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

Ce que je veux savoir, c'est comment vous pouvez avoir plusieurs de ces valeurs renvoyant chacune des valeurs numériques différentes afin que je puisse obtenir de courts extraits pour les boucles de la barre latérale, des extraits plus longs pour les boucles en vedette et l'extrait le plus long pour l'article principal.

Quelque chose comme utiliser ces derniers dans les modèles:

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

À la vôtre, Dave

63
davebowker

Que diriez-vous...

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;
}

puis dans votre code modèle, vous utilisez simplement ..

<?php echo excerpt(25); ?>

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

95
Marty

Pour l'instant, vous pouvez mettre à jour la réponse de Marty:

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

Vous pouvez également définir un lien personnalisé "en savoir plus" de cette façon:

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());
}
70
Michał Rybak

C'est ce que j'ai trouvé.

Ajoutez ceci à votre 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);
}

Il peut être utilisé comme ça.

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

my_excerpt(40); // 40 chars

C'est le moyen le plus simple que je connaisse pour ajouter des filtres, qui peuvent être appelés à partir d'une fonction.

26
Baylor Rae'

Je cherchais également cette fonctionnalité et la plupart des fonctions ici sont bonnes et flexibles. Pour mon propre cas, je cherchais une solution qui montre une longueur d'extrait différente uniquement sur des pages spécifiques. J'utilise ceci:

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

Collez ce code dans le fichier themes functions.php.

10
Olaf

Pour en revenir à la réponse de Marty:

Je sais que cela fait bien plus d'un an que cette réponse a été publiée, mais il vaut mieux tard que jamais. Pour que cela fonctionne avec des limites supérieures à WordPress par défaut de 55, vous devez remplacer cette ligne:

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

avec cette ligne:

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

Sinon, la fonction ne fonctionne qu'avec un morceau de texte déjà réduit.

5
0x61696f

Vous pouvez ajouter à votre fichier functions.php cette fonction

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

Appelez-le ensuite dans votre modèle comme ceci

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

Le wp_strip_all_tags devrait empêcher les balises html errantes de casser la page.


Documentation sur les fonctions

5
Mike Grace

Je pense que nous pouvons maintenant utiliser wp_trim_wordsvoir ici . Je ne sais pas de quelles données supplémentaires l'échappement et la désinfection ont eu besoin pour utiliser cette fonction, mais cela semble intéressant.

4
Tri Nguyen

Voici un moyen simple de limiter le contenu ou l'extrait

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

changez get_the_excerpt () par get_the_content () si vous voulez le contenu.

Cordialement

3
Mohammed

Soyez prudent en utilisant certaines de ces méthodes. Tous ne suppriment pas les balises html, ce qui signifie que si quelqu'un insère un lien vers une vidéo (ou une URL) dans la première phrase de son message, la vidéo (ou le lien) apparaîtra dans l'extrait, faisant éventuellement exploser votre page.

1
Doug Hucker

J'ai trouvé un excellent plugin qui peut le faire - Content and Excerpt Word Limit

0
Adam Storr

Je pense qu'il est possible de créer un code court, je ne l'ai pas essayé mais j'ai écrit pour vous l'idée principale de sa structure

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');

afin que vous puissiez l'utiliser comme ça

[the_excerpt_sc exlength="medium"]
0
usama sulaiman

Utiliser l'extrait avancé
http://wordpress.org/extend/plugins/advanced-excerpt/ plugin. Moi aussi, j'ai trouvé une réponse sur cette page.

0
Hirantha

Je sais que c'est un fil très ancien, mais je me suis juste débattu avec ce problème et aucune des solutions que j'ai trouvées en ligne n'a fonctionné correctement pour moi. D'une part, mon propre filtre "extrait_plus" était toujours coupé.

La façon dont je l'ai résolu est horrible, mais c'est la seule solution de travail que je puisse trouver. La laideur implique de modifier 4 lignes de WP core (!!) + l'utilisation d'une autre variable globale (bien que WP le fasse déjà tellement que je ne le fais pas) pas trop mal).

J'ai changé wp_trim_excerpt dans wp-includes/formating.php à ceci:

<?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);
}

La seule nouveauté est le $excerpt_length et $len morceaux.

Maintenant, si je veux changer la longueur par défaut, je le fais dans mon modèle:

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

Changer de noyau est une solution horrible, donc j'aimerais savoir si quelqu'un propose quelque chose de mieux.

0
powerbuoy

Je voudrais faire ceci:

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

tilisation:

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

Pourquoi?

  • Si has_excerpt devrait retourner extrait donné
  • Ce n'est pas le cas, donc couper les mots/supprimer les shortcodes de the_content
0
l2aelba