Получение краткого описания по ID

19 мар. 2011 г., 19:34:36
Просмотры: 95.1K
Голосов: 34

Почему нельзя получить краткое описание по ID, как это делается с заголовком и большинством других элементов?

Например: get_the_excerpt(ID). Я знаю, как использовать функцию $post->post_excerpt, но она просто возвращает ничего, если краткое описание не было введено, вместо того чтобы вернуть часть контента.

Мне нужно получить краткое описание по ID, если оно существует, а если нет - получить часть контента вместо этого.

Какие есть идеи по реализации?

Marvellous ...

РЕДАКТИРОВАНИЕ --

Исходный код цикла по запросу.

<?php $stories = get_posts('category_name=feedback&numberposts=4'); 
            foreach ($stories as $post) :
            $title = $post->post_title;
            $excerpt = get_the_excerpt_id($post->ID);
            $thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
              <div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">
                  </div>
                  </div>

                  <script type="text/javascript">
                var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
                  $('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);

                 </script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>
3
Комментарии

что именно подразумевается под "некоторой" частью контента?

kaiser kaiser
19 мар. 2011 г. 19:47:10

Функция excerpt в WordPress возвращает цитату (отрывок) записи. Если у записи нет специально созданной цитаты, функция возвращает определённое количество символов из основного контента, за которыми следует '...' или 'читать далее', или что-то подобное, в зависимости от шаблона

Robin I Knight Robin I Knight
19 мар. 2011 г. 19:48:28

Не хочу быть занудой, но правила сообщества запрещают подписи и стандартные заключительные фразы. Чтобы соблюдать правила и избежать ситуации, когда Джефф Этвуд отправит вам строгое сообщение после редактирования всех ваших вопросов, пожалуйста, перестаньте использовать "Marvellous" в качестве подписи. (И пожалуйста, не стреляйте в гонца)

MikeSchinkel MikeSchinkel
19 мар. 2011 г. 20:26:46
Все ответы на вопрос 11
5
21

Привет, @Robin I. Knight:

Я считаю функцию get_the_excerpt() устаревшей по своей архитектуре. По мере развития WordPress появилось множество новых сценариев использования, для которых она не подходит, в отличие от более новых функций для получения различных данных. Один из примеров — частое использование массива $args с параметрами функции.

Но для ваших нужд её легко доработать. Вот альтернативная функция, которую вы можете добавить в файл functions.php вашей темы:

function robins_get_the_excerpt($post_id) {
  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;
}

Я не тестировал её, но почти уверен, что написал правильно. Если это не соответствует вашим потребностям, уточните детали — возможно, я смогу предложить другие варианты.

19 мар. 2011 г. 20:33:57
Комментарии

Оно работает. Вроде бы. Очень странные результаты. Функция определенно выполняется, но результаты необычные. Я использую его вместе с GET_Posts, и по какой-то причине первые два поста всегда одинаковые. Вот ссылка, и вы увидите, что я имею в виду. Посмотрите на 4 поста справа. http://www.divethegap.com/update/community/feedback/2010/06/steve-riches/

Robin I Knight Robin I Knight
19 мар. 2011 г. 21:48:36

@Robin I Knight: Пожалуйста, добавьте исходный код вашего цикла в вопрос; очень сложно отлаживать код, не видя его. Также проблема может быть вызвана плагином; попробуйте отключать их по одному.

MikeSchinkel MikeSchinkel
19 мар. 2011 г. 22:19:32

Исходный код цикла в вопросе выше ^^

Robin I Knight Robin I Knight
19 мар. 2011 г. 22:28:42

Кстати, я изменил название функции на get_the_excerpt_id($post_id)

Robin I Knight Robin I Knight
20 мар. 2011 г. 17:11:52

@Robin I Knight - Я не вижу ничего в вашем цикле, но вы можете попробовать вызвать setup_postdata($post) в начале цикла, как предлагает @Rarst. Если это не сработает, возможно, нужно отключить какой-то плагин; вы пробовали это? И вам, вероятно, не следует называть функцию get_the_excerpt_id(), потому что WordPress может добавить эту функцию в будущем и сломать ваш сайт. Вы, скорее всего, можете обойтись без этой функции в цикле, используя foreach($stories as $story): global $post; $post = $story; вместо этого.

MikeSchinkel MikeSchinkel
20 мар. 2011 г. 21:54:25
4
16

Механизм работы цитат (excerpt) крайне запутанный. Это не точный ответ на ваш вопрос, но в целом, если вам нужно заставить теги шаблонов, специфичные для Цикла (Loop), работать с массивом, возвращаемым функцией get_posts(), вы можете эмулировать Цикл следующим образом:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // выполняемые действия
}
wp_reset_postdata();
20 мар. 2011 г. 16:12:27
Комментарии

А что насчёт wp_reset_query(); ?

cwd cwd
27 янв. 2012 г. 18:39:36

@cwd если используется только setup_postdata(), глобальный запрос не затрагивается и нужно сбросить только данные записи.

Rarst Rarst
27 янв. 2012 г. 20:47:39

Это решение гораздо чище, чем сохранение записи в другую переменную и повторный запрос, просто чтобы сделать её глобальной. +1

Barry Kooij Barry Kooij
10 апр. 2013 г. 19:02:14

Спасибо @Rarst, это помогло мне. Добавление setup_postdata($post); решило мои проблемы

Simon Simon
14 нояб. 2014 г. 22:55:18
0

Начиная с версии 3.3.0 доступна новая функция: wp_trim_words

Я использую её вне цикла следующим образом:

 <?php if ( $post_id ) {
 $post = get_post( $post_id );
 if ( $post ) { ?>
     <h2><?php echo $post->post_title; ?></h2>
     <p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
     <p><strong>Эта статья доступна только для подписчиков.</strong></p>
 <?php } } ?>

Не следует путать её с функцией wp_trim_excerpt, которая, судя по всему, работает только внутри цикла, поскольку внутри вызывает the_content().

15 янв. 2012 г. 00:43:37
1

Дополнение к ответу MikeSchinkel, который по какой-то причине у меня не сработал. Мне пришлось добавить строку setup_postdata, чтобы всё заработало.

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // привет
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

Предполагаю, что если вы используете это вне цикла, то это не должно мешать другим setup_postdata.

Удачи

30 авг. 2013 г. 12:57:42
Комментарии

Я попробовал ответ MikeSchinkel, но он не сработал для меня. Настройка данных поста помогла. В моем случае без 'setup_postdata' функция возвращала заголовок и краткое описание родительского поста.

turzifer turzifer
25 сент. 2016 г. 12:49:32
0

Продолжая ответ @Maxime, будет ли это работать?

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

Это выглядит достаточно просто, но я сомневаюсь - возможно, я что-то упускаю.

3 мая 2013 г. 00:53:04
0

Если ВСЕ ваши записи содержат тег <!--more-->, то вы можете использовать следующий код вместе с вашим:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

Конечно, если у вас есть записи без тега <!--more-->, они будут отображаться полностью. В моём случае это работает, но не для всех ситуаций...

11 июл. 2011 г. 16:01:45
2

Я рассматриваю функцию get_the_excerpt() как устаревшую с точки зрения дизайна. По мере развития WordPress появилось множество новых сценариев использования, где она не подходит, в то время как новые функции для получения различных данных справляются с этим. Одним из примеров является частое использование массива $args для передачи параметров в функцию.

Но её легко адаптировать под ваши нужды. Вот альтернативная функция, которую вы можете использовать, разместив её в файле вашей темы functions.php:

function robins_get_the_excerpt($post_id) {  
   global $post;  
   $save_post = $post;  
   $post = get_post($post_id);  
   setup_postdata($post); // Добавлено для корректной работы  
   $output = get_the_excerpt();  
   $post = $save_post;  
   return $output;  
}

Дополняя ответ MikeSchinkel, который по какой-то причине не сработал у меня: мне пришлось добавить строку setup_postdata, чтобы всё заработало.

19 апр. 2016 г. 15:51:27
Комментарии

Нужно ли использовать wp_reset_post_data() для работы внутри цикла?

Chris Pink Chris Pink
10 июл. 2017 г. 12:26:14

Оказывается (после долгих разбирательств) теперь это часть ядра.

Chris Pink Chris Pink
10 июл. 2017 г. 12:29:07
0

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

  1. Получает цитату (excerpt) по ID записи
  2. Получает содержимое записи, если цитата не установлена
  3. Задает длину цитаты в словах
  4. Позволяет выбрать содержимое для ссылки "Читать далее" (текст/ссылка)

Я вставляю этот код непосредственно в настраиваемый шаблон, над которым работаю.

    // Получаем объект записи
    $dapost = get_post(POST_ID);              
    // Получаем цитату
    $my_excerpt = wp_trim_words( apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content  ), "20", "<a href='$dapost->guid'> ".__('Читать далее', 'translation')."</a>" );

Разбор кода

1. Содержимое цитаты

Получаем цитату по ID записи, но если цитата не установлена - получаем содержимое записи.

Я использую сокращенный синтаксис if/else в PHP.

    $dapost = get_post(POST_ID);    
    apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content

2. Длина цитаты

Устанавливаем длину цитаты в 20 слов

    "20"

3. Выбор содержимого для "Читать далее" (ссылка/текст)

   "<a href='$dapost->guid'> ".__('Читать далее', 'translation')."</a>"

Я использовал $dapost->guid для получения URL, потому что мне не нужны были "красивые" URL и я хотел избежать дополнительного запроса к базе данных. Вы всегда можете использовать get_the_permalink вместо этого.

Смотрите документацию WordPress по функции wp_trim_words.

8 июн. 2016 г. 07:31:41
0

Это сработало у меня:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
26 сент. 2017 г. 13:35:20
0

Начиная с WP 4.5.0 можно использовать ID записи как параметр get_the_excerpt( $post->ID )

Источник:https://developer.wordpress.org/reference/functions/get_the_excerpt/

7 сент. 2018 г. 21:42:20
0

Хотя это может раздражать, на самом деле это довольно просто сделать

function cameronjonesweb_get_excerpt_by_id( $post_id ) {
    return apply_filters( 'get_the_excerpt', wp_trim_excerpt( '', $post_id ), $post_id );
}
18 окт. 2020 г. 16:40:40