Получить отрывок, используя get_the_excerpt вне цикла

31

У меня есть код, который вызывает, get_the_title()и это работает, но get_the_excerpt()вернуть пусто. Как я могу заставить это работать?

Этот код находится внутри плагина под названием «Протокол WP Facebook Open Graph». Вот часть, которую я хочу изменить:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

Здесь has_excerptвсегда терпят неудачу и get_the_excerpt($post->ID)больше не работают (не рекомендуется).

Итак, как я могу отобразить отрывок там?

PS: я использую плагин "Advanced Excerpt"

Ariel
источник
хорошо, получил его, используя my_excerpt($post->post_content, get_the_excerpt())и используя my_excerpt()функцию из wordpress.stackexchange.com/questions/6961/…
Ариэль
3
Пожалуйста, добавьте решение, которое вы придумали в качестве ответа, чтобы этот сайт не преследовал вас как неотвеченный вопрос. :)
Первый
Просто используйте the_post()функцию (она работает и для шаблона одного сообщения), прежде чем вызывать get_the_excerpt()ее, чтобы настроить необходимые данные.
Сисир

Ответы:

29

Я нашел этот вопрос, когда смотрел, как это сделать без объекта post.

Мое дополнительное исследование подняло эту ловкую технику:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));

cale_b
источник
1
Это должно быть принято как ответ, так как это рекомендуемый способ вытащить данные за пределы цикла. Также не требуется никакой пользовательской функции или переопределения $postглобальной переменной.
MacK
4
это возвращает пустую строку.
Кья Тун
1
@KyawTun - это работает, пока $post_idустановлено (какое значение $post_id? И $post_idявляется действительным, законным идентификатором сообщения.
cale_b
2
@cale_b Спасибо. Я использую запрос get_posts и получаю ID из полученного массива. Объект post имеет post_title, post_content, ID и т. Д., Но не работает.
Кья Тун
Если вам нужен просто ТЕКСТ, а не тег <p>, который включен в фильтр_excerpt, тогда используйте фильтр «get_the_excerpt», чтобы вышеупомянутый фильтр стал: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); это даст вам только RAW текст, который вы можете вставить в любое место вашей разметки.
Мохсин
22

Поскольку кажется, что у вас уже есть объект post, для которого вам нужна выдержка, вы можете просто заставить вещи работать:

setup_postdata( $post );
$excerpt = get_the_excerpt();

setup_postdata()Функция глобализировать $postобъект и сделать его доступным для регулярной старой функции цикла. Когда вы находитесь внутри цикла, вы звоните, the_post()и он настраивает все для вас ... вне цикла вам нужно принудительно вызвать его вручную.

EAMann
источник
1
Это работает, но: «Вы должны передать ссылку на глобальную $postпеременную, в противном случае функции вроде the_title()не будут работать должным образом». global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
Дич
setup_postdata($post);FTW !!!!
Squarecandy
18

Попробуй это:

Создайте новую функцию в functions.php и затем вызывайте ее откуда угодно.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

Вот пост, описывающий код.

Увядает Дэвис
источник
1
Отлично найти моего друга. Я никогда не понимал, почему WordPress отказался бы от такой важной функции. Это эффективно восстанавливает его с нуля, но это работает. Учитывая, как часто мы используем отрывок вне цикла с такими функциями, как плагины для обмена в социальных сетях, он, вероятно, должен был остаться частью ядра.
Императивные идеи
1
Ответ Е.А.Манна - гораздо лучший подход к этой проблеме, и его следует рассматривать как лучшую практику. Этот подход в основном дублирует внутреннюю часть Core вместо использования API.
Ян Данн
9

Теперь вы можете просто использовать get_the_excerpt( $postID )функцию. С тех пор: в WordPress 4.5.0 введен $postпараметр.

докер
источник
1
Это должен быть новый принятый ответ, так как мы находимся в эпохе WP 4.5 +.
Матия Мркаич,
18
Это не будет работать, если выдержка пуста, так как wp_trim_excerptфильтр вернет выдержку для текущей записи.
Дилан
9
См. Core.trac.wordpress.org/ticket/36934 для подробностей о том, что сказал
@Dylan
5

получил его, используя my_excerpt($post->post_content, get_the_excerpt())и используя my_excerpt()функцию из Использование wp_trim_excerpt, чтобы получить the_excerpt () вне цикла

Ariel
источник
2
Ответы только на ссылки не годятся. Скопируйте соответствующий код здесь. Когда эта ссылка не работает, этот сайт не работает / не работает, тогда этот ответ не имеет значения.
cale_b
Это отлично сработало для меня!
Сайкат
1

В случае, если у вас нет объекта post, вот короткая функция, подобная той, что была в Withers.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}
OKParrothead
источник
Но у спрашивающего есть почтовый объект, как указано в вопросе.
fuxia
3
Поправьте меня, если я ошибаюсь, этот метод вернет выдержку из руководства, но не сгенерирует ее при необходимости
Bill
1

Это для случаев, когда вы хотите использовать get_the_excerpt()вне цикла:

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}
Gixty
источник
Это самый прямой способ сделать это .. Не уверен, что это здорово с точки зрения производительности. Вы все еще получаете мой +1
Билл
1

Если вы хотите автоматически сгенерировать отрывок из содержания в одну строку - вы можете использовать wp_trim_wordsтакую ​​функцию:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
Picard
источник
-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;
Rinzler
источник
Пожалуйста, измените свой ответ и добавьте объяснение: почему это может решить проблему?
fuxia