Несколько длин выдержки в WordPress

59

Как говорится в названии, я ищу несколько отрывков в WordPress.

Я понимаю, что вы можете сделать это в functions.php:

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

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

Что-то вроде использования этих шаблонов:

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

Cheers, Dave

Теги:
function

15 ответов

80
Лучший ответ

Как насчет...

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

то в коде вашего шаблона вы просто используете.

<?php echo excerpt(25); ?>

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

  • 3
    Ницца. Работает отлично! Спасибо
  • 6
    убедитесь, что вы также проверите эту функцию wp_trim_words codex.wordpress.org/Function_Reference/wp_trim_words
Показать ещё 3 комментария
52

Теперь вы можете обновить ответ Марти:

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

Вы также можете настроить пользовательскую ссылку "читать больше":

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());
}
  • 2
    Безусловно лучший и самый простой ответ. Отличное использование встроенной функции WP. Спасибо за то, что вы не зашли слишком далеко.
  • 1
    @Michal, отличный кусок кода, никогда не думал, что это может быть так просто
Показать ещё 5 комментариев
24

Вот что я придумал.

Добавьте это в свой 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);
}

Его можно использовать следующим образом.

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

my_excerpt(40); // 40 chars

Это самый простой способ добавления фильтров, которые могут быть вызваны из одной функции.

  • 0
    Я предпочел этот ответ, так как это хороший способ придумать код. Спасибо, Бэйлор.
  • 1
    Хорошее решение, но мне потребовалось некоторое время, чтобы заставить его работать, так как ему не хватает приоритета, чтобы быть эффективным в текущих (2013) версиях Wordpress: use add_filter('excerpt_length', 'Excerpt::new_length', 999); вместо этого (обратите внимание на последний параметр)
10

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

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

Вставьте этот код в файл тем functions.php.

  • 0
    да, это было то, что мне было нужно. Thnx человек
5

Возвращаясь к ответу Марти:

Я знаю, что прошло уже больше года, так как этот ответ опубликован, но лучше поздно, чем никогда. Чтобы работать с ограничениями по умолчанию WordPress 55, вам нужно заменить эту строку:

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

с этой строкой:

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

В противном случае функция работает только с уже обрезанным фрагментом текста.

4

Вы можете добавить в свой файл functions.php эту функцию

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

Затем назовите его в своем шаблоне следующим образом

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

wp_strip_all_tags должен препятствовать разрыву теневых тегов html.


Документация по функциям

  • 3
    Есть ли способ, как мы можем пропустить HTML-код, используя пример выше? шорткод виден на некоторых моих страницах
4

Думаю, теперь мы можем использовать wp_trim_words здесь. Не уверен, какие дополнительные возможности для экранирования и дезинфекции необходимы для использования этой функции, но это выглядит интересно.

2

Здесь простой способ ограничить содержание или выдержку

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

измените get_the_excerpt() на get_the_content(), если хотите содержимое.

Привет

  • 0
    Спасибо тебе за это!
  • 0
    Пожалуйста! , Нет проблем :)
0

Я бы сделал следующее:

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

Использование:

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

Почему?

  • Если has_excerpt должен возвращать данный отрывок
  • Это не так, поэтому обрезать слова/ сократить короткие коды от the_content
0

Здесь - статья об использовании пользовательской длины выдержек в WordPres. Существует несколько способов ограничения и длины выдержки для контрольных сообщений.

  • Ограничить длину отрывной записи или длину сообщения, используя количество слов.
  • Ограничение длины выдержки до нескольких символов.
  • Ограничить постсообщение, добавив 'read more tag.
  • Включение пользовательской отрывки для написания собственного резюме для каждого сообщения.
  • Длина выражения управления с помощью фильтров

http://smallenvelop.com/limit-post-excerpt-length-in-wordpress/ Надеюсь, это очень поможет вам.

0

Будьте осторожны, используя некоторые из этих методов. Не все из них вытесняют html-теги, то есть, если кто-то вставляет ссылку на видео (или url) в первое предложение своего сообщения, видео (или ссылка) будет отображаться в выдержке, возможно, раздувая вашу страницу.

  • 2
    Добро пожаловать в ТАК. Это нужно прокомментировать, а не ответить. Держитесь терпения, вы получите право комментировать.
  • 1
    Спасибо Максимус, извиняюсь.
0

Я знаю, что это действительно старый поток, но я просто боролся с этой проблемой, и ни одно из решений, которые я нашел в Интернете, не работало правильно для меня. Во-первых, мой собственный "excerpt_more" -фильтр всегда был отрезан.

То, как я решил, уродливо, но это единственное работающее решение, которое я мог найти. Уродство включает в себя модификацию 4 строк ядра WP (!!) + использование еще одной глобальной переменной (хотя WP уже делает это так, что я не чувствую себя слишком плохо).

Я изменил wp_trim_excerpt на wp-includes/formatting.php:

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

Единственный новый материал - это бит $excerpt_length и $len.

Теперь, если я хочу изменить длину по умолчанию, я делаю это в своем шаблоне:

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

Изменение ядра - это ужасное решение, поэтому я хотел бы знать, если кто-то придумает что-то лучшее.

  • 0
    Хм ... почему решение Михала (используйте wp_trim_words() ) не работает для вас? Гораздо приятнее взлома ядра ...
  • 0
    Хм .. должно быть, пропустил это, когда я написал это. Определенно попробую это на моих текущих проектах WP. У меня раньше были проблемы с WP, хотя при использовании функций get_the_ * вместо функций __, где они не возвращают одно и то же ( the_content() и get_the_content() в моем опыте)
0

Я могу создать короткий код, я не пробовал, но написал для вас основную идею о его структуре

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

чтобы вы могли использовать его так

[the_excerpt_sc exlength="medium"]
0

Используйте расширенный фрагмент
http://wordpress.org/extend/plugins/advanced-excerpt/ плагин. Я тоже нашел ответ с этой страницы.

0

Я нашел отличный плагин, который может это сделать - Content и Excerpt Word Limit

Ещё вопросы

Сообщество Overcoder
Наверх
Меню