Получение краткого описания по ID
Почему нельзя получить краткое описание по 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>
Привет, @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;
}
Я не тестировал её, но почти уверен, что написал правильно. Если это не соответствует вашим потребностям, уточните детали — возможно, я смогу предложить другие варианты.

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

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

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

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

Механизм работы цитат (excerpt) крайне запутанный. Это не точный ответ на ваш вопрос, но в целом, если вам нужно заставить теги шаблонов, специфичные для Цикла (Loop), работать с массивом, возвращаемым функцией get_posts()
, вы можете эмулировать Цикл следующим образом:
$stories = get_posts();
foreach ($stories as $post) {
setup_postdata($post);
// выполняемые действия
}
wp_reset_postdata();

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

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

Начиная с версии 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().

Дополнение к ответу 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.
Удачи

Если ВСЕ ваши записи содержат тег <!--more-->
, то вы можете использовать следующий код вместе с вашим:
$sjc_excerpt = explode( '<!--more-->', $post->post_content);
echo wpautop( $sjc_excerpt[0] );
Конечно, если у вас есть записи без тега <!--more-->
, они будут отображаться полностью. В моём случае это работает, но не для всех ситуаций...

Я рассматриваю функцию 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
, чтобы всё заработало.

Это небольшой, но часто используемый мной код с функцией wp_trim_words. Я постоянно сталкиваюсь с необходимостью сокращать текст и добавлять ссылку "Читать далее" вне цикла. Возможно, кому-то это тоже пригодится. Вот что делает этот код:
- Получает цитату (excerpt) по ID записи
- Получает содержимое записи, если цитата не установлена
- Задает длину цитаты в словах
- Позволяет выбрать содержимое для ссылки "Читать далее" (текст/ссылка)
Я вставляю этот код непосредственно в настраиваемый шаблон, над которым работаю.
// Получаем объект записи
$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.

Начиная с WP 4.5.0 можно использовать ID записи как параметр
get_the_excerpt( $post->ID )
Источник:https://developer.wordpress.org/reference/functions/get_the_excerpt/
