Получить отрывок используя get_the_excerpt вне цикла
У меня есть код, который вызывает 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"
Это должно быть принято в качестве ответа, так как это рекомендуемый способ получения данных вне цикла. Также не требует создания пользовательских функций или переопределения глобальной переменной $post
.

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

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

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

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

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

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

Попробуйте это:
Создайте новую функцию в 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;
}

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

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

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

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

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

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

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

Если у вас нет объекта записи, вот короткая функция, подобная той, что у Withers.
function get_excerpt_by_id($post_id){
$the_post = get_post($post_id); // Получаем запись по ID
$the_excerpt = $the_post->post_excerpt; // Извлекаем краткое описание
return $the_excerpt; // Возвращаем краткое описание
}

Это используется, когда вам нужно получить 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;
}

Если вам нужно автоматически сгенерировать краткое описание (эксперт) из содержимого в одну строку - вы можете использовать функцию wp_trim_words
следующим образом:
// 30 - это количество слов в экспертe
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
