Отримайте витяг за ідентифікатором


31

Чому так не можна отримати уривок за ідентифікатором, як з заголовком та більшістю інших елементів.

напр. 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;?>

що саме є "деяким" змістом?
кайзер

Функція уривку в wordpress повертає уривок допису. Якщо у публікації немає уривку, він повертає певну кількість символів вмісту, за якими слідує "..." або "читати більше" або все, що передбачено в шаблоні
Робін I лицар,

1
Не бути ПДФА, але правилами громади забороняють підписи та стандартні закриття. Щоб дотримуватися правил і не допускати, щоб Джефф Етвуд надсилав вам суворе повідомлення після редагування всіх питань, будь ласка, перестаньте використовувати "Marvelous" як закриття. (І, будь ласка, не стріляйте в месенджера)
MikeSchinkel

Відповіді:


20

Привіт @ Робін І. Лицар:

Я розглядаю 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, і чомусь топ-2 отримують повідомлення завжди однакові. Ось посилання, і ви побачите, що я маю на увазі. Подивіться на 4 повідомлення праворуч. divethegap.com/update/community/feedback/2010/06/steve-riches
Робін І лицар

@Robin I Knight: Будь ласка, опублікуйте свій вихідний код циклу як оновлення свого питання; дуже важко налагоджувати код, не бачачи коду. Можливо, це також плагін, який викликає проблему; спробуйте відключити їх по черзі.
MikeSchinkel

Вихідний код циклу, про який йдеться вище ^^
Робін I лицар,

До речі, я змінив назву функції 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;замість цього.
MikeSchinkel

16

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

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

що про wp_reset_query (); ?
cwd

1
@cwd, якщо тільки використання setup_postdata()глобального запиту не впливає і потрібно лише скинути дані публікації.
Рарст

Це рішення є більш чистим, ніж зберігання посади в іншому варі та вимагає іншого повідомлення лише для того, щоб отримати його глобальним. +1
Barry Kooij

Дякую @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 ().


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;

}

Я припускаю, що якщо ви використовуєте це за межами циклу, він не повинен втручатися в інші налаштування_postdata.

Ура


Я спробував відповідь MikeSchinkel, і це не спрацювало. Налаштування даних публікації зробило свою справу. У моєму випадку без 'setup_postdata' функція повертає заголовок + уривок батьківського допису.
турзифер

2

Спираючись на відповідь @ Maxime, чи вдасться це?

$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, щоб він працював.


Чи потрібно wp_reset_post_data()це працювати всередині циклу?
Кріс Пінк

Мабуть (після обходу цього конкретного будинку) він зараз є частиною основної.
Кріс Пінк

0

Це маленький дволінійний я багато використовую wp_trim_words . Я постійно знаходжу потрібну абревіатуру і читаю більше функцій поза циклом. Хтось ще може вважати це корисним. Отже, це те, що я використовую:

  1. Отримайте витяг за ідентифікатором POST
  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 (посилання / текст)

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.