ПОЛУЧИТЬ выдержку по ID

31

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

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

Итак, что я пытаюсь сделать, это получить отрывок по идентификатору, если есть отрывок, и если нет отрывка с этим идентификатором, но есть какой-то контент, вместо этого получить некоторый контент.

Как бы это сделать?

Любые идеи,

Чудесный ...

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

Зацикливание исходного кода по запросу.

<?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>



<?php echo $excerpt;?></div>
              <?php endforeach;?>
Робин я рыцарь
источник
что именно "некоторые" из контента?
Кайзер
Функция excerpt в wordpress возвращает выдержку из поста. Если запись не содержит выдержки, она возвращает определенное количество символов содержимого, за которым следует «...» или «читать дальше», или что-то еще, предоставленное шаблоном
Robin I Knight
1
Не для того, чтобы быть PITA, но правила сообщества запрещают подписи и стандартные закрытия. Чтобы следовать правилам и не допустить, чтобы Джефф Этвуд отправлял вам строгое сообщение после редактирования всех ваших вопросов, пожалуйста, прекратите использовать «Чудесный» в качестве закрытия. (И, пожалуйста, не стреляйте в мессенджера)
MikeSchinkel

Ответы:

20

Привет @Robin I. Рыцарь:

Я рассматриваю 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;
}

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

MikeSchinkel
источник
Оно работает. Вроде. Очень странные результаты. Он определенно выполняет свою функцию, но результаты странные. Я использую его в сочетании с GET_Posts, и по некоторым причинам топ-2 получить сообщения всегда одинаковы. Вот ссылка, и вы поймете, что я имею в виду. Посмотрите на 4 сообщения с правой стороны. divethegap.com/update/community/feedback/2010/06/steve-riches
Робин, рыцарь
@Robin I Knight: Пожалуйста, опубликуйте свой исходный код цикла как обновление вашего вопроса; очень трудно отлаживать код, не видя код. Это также возможно плагин, который вызывает проблему; попробуйте отключить их по одному.
MikeSchinkel
Цикл исходного кода в вопросе выше ^^
Робин, я рыцарь
Кстати, я изменил название функции на get_the_excerpt_id ($ post_id)
Robin I Knight
@Robin I Knight - я ничего не вижу в вашем цикле, но вы можете попробовать позвонить setup_postdata($post)в начале цикла, как предлагает @Rarst. Если это не работает, это может быть плагин, который нужно отключить; ты пробовал это? И вы, вероятно, не хотите вызывать его, get_the_excerpt_id()потому что WordPress может добавить эту функцию в будущем и сломать ваш сайт. И вы могли бы, вероятно, обойтись без функции в вашем цикле, используя foreach($stories as $story): global $post; $post = $story;вместо этого.
MikeSchinkel
16

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

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
Rarst
источник
как насчет wp_reset_query (); ?
cwd
1
@cwd, если только использование setup_postdata()глобального запроса не затронуто, и только данные поста должны быть сброшены.
Rarst
Это решение намного чище, чем сохранение поста в другом var и запрос другого поста только для того, чтобы сделать его глобальным. +1
Барри Коой
Спасибо @Rarst, который помог мне. Добавление setup_postdata ($ post); решил мои проблемы
Симон
8

С 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>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

Это не следует путать с wp_trim_excerpt, который, очевидно, работает только внутри цикла, так как он вызывает the_content () внутри.

lkraav
источник
6

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

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

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

ура

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

Опираясь на ответ Максима, это сработает?

$post = get_post( $id );

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

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

Доминик П
источник
1

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

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

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

Стивен Кронин
источник
1

Я рассматриваю 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;
}

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

Jude
источник
Это должно wp_reset_post_data()работать внутри цикла?
Крис Пинк
Очевидно (после обхода этого конкретного дома) это теперь часть ядра.
Крис Пинк
0

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

  1. Получить отрывок по POST ID
  2. Получить содержимое поста, если отрывок не был установлен,
  3. Установите длину слова выдержки
  4. Выберите Контент для Подробнее (Ссылка / Текст)

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

    //Get Post Object
    $dapost = get_post(POST_ID);              
    //Get the Execerpt
    $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'> ".__('Get More Stuff', 'translation')."</a>" );

Сломать

1. Содержание выдержки

Получить отрывок по идентификатору публикации, но получить содержимое публикации, если отрывок не был установлен.

Я использую 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. Выберите ReadMore Content (ссылка / текст)

   "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>"

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

Смотрите wp_trim_words в документации Wordpress.

Брев Тив
источник
0

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

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
Риджо КП
источник
-2

Это быстрее:

global $post;
return get_post($post_id)->post_excerpt;
Максим Киффер
источник
1
Не тогда, когда выдержка пуста ... как уже упоминалось в вопросе.
fuxia
Действительно, не тогда, когда автоматически генерируется исключение
Joshc
Понижено, поскольку это не полезно
Питер Гусен