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

24 авг. 2011 г., 02:55:39
Просмотры: 77.9K
Голосов: 32

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

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

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 всегда возвращает false, а get_the_excerpt($post->ID) больше не работает (устарел).

Так как же мне отобразить отрывок там?

ps: Я также использую плагин "Advanced Excerpt"

3
Комментарии

ок, понял, использовал my_excerpt($post->post_content, get_the_excerpt()) и функцию my_excerpt() из http://wordpress.stackexchange.com/questions/6961/using-wp-trim-excerpt-to-get-the-excerpt-outside-the-loop

ariel ariel
24 авг. 2011 г. 03:44:37

Пожалуйста, добавьте найденное решение в качестве ответа, чтобы этот вопрос не оставался без ответа на сайте. :)

Rarst Rarst
12 сент. 2011 г. 00:56:46

Просто используйте функцию the_post() (она работает и в шаблоне одиночной записи) перед вызовом get_the_excerpt() - это установит необходимые данные для вас.

Sisir Sisir
18 сент. 2014 г. 19:01:20
Все ответы на вопрос 9
6
32

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

В ходе дополнительного исследования я обнаружил этот изящный способ:

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

18 июн. 2014 г. 18:33:10
Комментарии

Это должно быть принято в качестве ответа, так как это рекомендуемый способ получения данных вне цикла. Также не требует создания пользовательских функций или переопределения глобальной переменной $post.

MacK MacK
16 июн. 2015 г. 19:43:21

возвращает пустую строку.

Kyaw Tun Kyaw Tun
20 янв. 2016 г. 09:45:54

@KyawTun - это работает, при условии что $post_id установлен (какое значение у $post_id?) И $post_id является действительным, корректным ID поста.

random_user_name random_user_name
20 янв. 2016 г. 17:03:25

@cale_b Спасибо. Я использую запрос get_posts и получаю ID из результирующего массива. Объект поста действительно содержит post_title, post_content, ID и т.д. Но не работает.

Kyaw Tun Kyaw Tun
21 янв. 2016 г. 14:30:01

Если вам нужен ТОЛЬКО ТЕКСТ без тега <p>, который включается фильтром the_excerpt, тогда используйте фильтр "get_the_excerpt", чтобы приведенный выше фильтр стал: $text = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post_id)); это даст вам просто СЫРОЙ текст, который вы можете вставить в любую часть вашей разметки.

Muhammad Asad Muhammad Asad
20 мая 2016 г. 21:42:28

У меня тоже не работает. Помните: "это либо пользовательское краткое описание, которое возвращается без изменений, либо автоматически сгенерированная урезанная версия полного содержимого поста с подсчетом слов". Возможно, работает для пользовательского? Я искал автоматически сгенерированное краткое описание.

Fabien Snauwaert Fabien Snauwaert
21 мар. 2019 г. 00:15:12
Показать остальные 1 комментариев
2
22

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

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

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

9 июн. 2012 г. 02:06:40
Комментарии

Это работает, но: "Вы должны передать ссылку на глобальную переменную $post, иначе функции типа the_title() не будут работать корректно." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();

deach deach
20 янв. 2017 г. 01:35:47

setup_postdata($post); FTW!!!!

squarecandy squarecandy
30 апр. 2017 г. 20:48:28
2
18

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

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

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); // Получаем ID записи
    $the_excerpt = $the_post->post_content; // Получаем post_content для использования в качестве основы для анонса
    $excerpt_length = 35; // Устанавливаем длину анонса в словах
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); // Удаляем теги и изображения
    $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;
}

Вот статья с описанием кода.

9 июн. 2012 г. 02:02:37
Комментарии

Отличная находка, друг. Я никогда не понимал, почему WordPress объявил устаревшей такую важную функцию. По сути, это её повторная реализация с нуля, но она работает. Учитывая, как часто мы используем цитаты вне цикла, например, в плагинах для социальных сетей, вероятно, её стоило оставить в ядре.

Imperative Ideas Imperative Ideas
15 мая 2014 г. 05:56:30

Ответ EAMann предлагает гораздо лучшее решение этой проблемы, и его следует считать наилучшей практикой. Данный подход по сути дублирует внутреннюю логику ядра вместо использования API.

Ian Dunn Ian Dunn
24 мар. 2015 г. 03:18:53
3

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

20 мая 2016 г. 14:07:23
Комментарии

Этот ответ должен быть принятым, так как мы сейчас в эпоху WordPress 4.5+.

Matija Mrkaic Matija Mrkaic
13 июн. 2016 г. 15:18:58

Это не будет работать, если краткое описание пустое, так как фильтр wp_trim_excerpt вернет краткое описание для текущей записи.

Dylan Dylan
17 авг. 2016 г. 01:24:22

Подробности о том, что сказал @Dylan, смотрите по ссылке https://core.trac.wordpress.org/ticket/36934

kraftner kraftner
14 сент. 2016 г. 10:18:21
2

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

13 сент. 2011 г. 08:44:24
Комментарии

Ответы, содержащие только ссылки, не имеют ценности. Скопируйте соответствующий код сюда. Если ссылка перестанет работать, сайт будет недоступен или удален, тогда этот ответ потеряет всякую пользу.

random_user_name random_user_name
18 июн. 2014 г. 18:23:26

У меня всё сработало идеально!

Saikat Saikat
24 июл. 2017 г. 15:19:09
2

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

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); // Получаем запись по ID
    $the_excerpt = $the_post->post_excerpt; // Извлекаем краткое описание
    return $the_excerpt; // Возвращаем краткое описание
}
25 нояб. 2012 г. 21:28:20
Комментарии

Но у спрашивающего есть объект записи, как указано в вопросе.

fuxia fuxia
25 нояб. 2012 г. 21:51:04

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

Bill Bill
7 нояб. 2014 г. 14:46:39
1

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

// Функция для получения отрывка по ID записи вне цикла
function custom_get_excerpt($post_id) {
    // Сохраняем глобальную переменную $post
    global $post;
    $temp = $post;
    
    // Получаем запись по ID
    $post = get_post($post_id);
    setup_postdata($post);

    // Получаем отрывок
    $excerpt = get_the_excerpt();

    // Восстанавливаем оригинальную переменную $post
    wp_reset_postdata();
    $post = $temp;

    // Возвращаем отрывок
    return $excerpt;
}
1 окт. 2014 г. 02:17:27
Комментарии

Это самый прямой способ сделать это.. Не уверен, что это хорошо с точки зрения производительности. Тем не менее, получаешь мой +1

Bill Bill
7 нояб. 2014 г. 14:47:23
0

Если вам нужно автоматически сгенерировать краткое описание (эксперт) из содержимого в одну строку - вы можете использовать функцию wp_trim_words следующим образом:

// 30 - это количество слов в экспертe
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
15 мая 2017 г. 21:25:17
1
-1
$trimexcerpt = get_the_content(); // Получаем содержимое поста
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); // Обрезаем текст до 18 слов, добавляем многоточие
echo $shortexcerpt; // Выводим обрезанный текст
14 мар. 2018 г. 18:53:02
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
14 мар. 2018 г. 22:25:18