Получите отрывок по ID

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

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

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

Как это сделать.

Любые идеи,

Изумительный ...

EDIT -

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

<?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;?>
29 голосов | спросил Robin I Knight 19 MarpmSat, 19 Mar 2011 20:34:36 +03002011-03-19T20:34:36+03:0008 2011, 20:34:36

10 ответов


18

Привет @ Робин И. Рыцарь:

Я рассматриваю 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 19 MarpmSat, 19 Mar 2011 21:33:57 +03002011-03-19T21:33:57+03:0009 2011, 21:33:57
15
Механика выдержки крайне запутанна. Это не точный ответ на ваш вопрос, но в целом, если вам нужно создать теги шаблонов, специфичные для Loop, работать с массивом, возвращаемым get_posts(), вы можете эмулировать Loop следующим образом:
$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();
ответил Rarst 20 MarpmSun, 20 Mar 2011 17:12:27 +03002011-03-20T17:12:27+03:0005 2011, 17:12:27
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 , который, по-видимому, работает только в цикле, поскольку он вызывает in_content () внутренне .

ответил lkraav 15 Jam1000000amSun, 15 Jan 2012 02:43:37 +040012 2012, 02:43:37
6

Просто добавьте ответ Майка Шинкеля, который по какой-то причине не сработает для меня. Мне пришлось добавить строку 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.

Приветствия

ответил danbrown 30 PM00000010000004231 2013, 13:57:42
2

Основываясь на ответе @ Maxime, будет ли это работать?

$post = get_post( $id );

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

Мне кажется, что мне достаточно вперед, но мне интересно, не хватает ли я чего-то.

ответил Dominic P 3 Mayam13 2013, 01:53:04
1

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

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

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

ответил Stephen Cronin 11 J000000Monday11 2011, 17:01:45
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;
}

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

ответил Jude 19 PMpTue, 19 Apr 2016 15:51:27 +030051Tuesday 2016, 15:51:27
0

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

  1. Получить выдержку по идентификатору POST
  2. Получить сообщение, если не указано значение Excerpt,
  3. Задайте длину слова Excerpt
  4. Выберите контент для чтения (ссылка /текст)

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

    //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>" );

Break down

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

Получите Excerpt по идентификатору сообщения, но, получите сообщение «Содержимое», если не указано «Excerpt».

Я использую сокращение /меньше 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 (Link /Text)

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

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

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

ответил Brev Tiw 8 J0000006Europe/Moscow 2016, 07:31:41
0

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

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));
ответил Rijo K P 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 26 Sep 2017 13:35:20 +0300 2017, 13:35:20
-2

Это быстрее:

global $post;
return get_post($post_id)->post_excerpt;
ответил Maxime Kieffer 12 12012vEurope/Moscow11bEurope/MoscowMon, 12 Nov 2012 16:13:56 +0400 2012, 16:13:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132