Отримайте уривок, використовуючи get_the_excerpt поза циклом


31

У мене є код, який дзвонить, get_the_title()і він працює, але get_the_excerpt()повертається порожнім. Як я можу змусити це працювати?

Цей код знаходиться у плагіні під назвою "протокол відкритого графіку WP Facebook". Ось частина, яку я хочу змінити:

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"


ок, отримав це за допомогою my_excerpt($post->post_content, get_the_excerpt())та використання my_excerpt()функції від wordpress.stackexchange.com/questions/6961/…
аріель

3
Будь ласка, додайте рішення, на яке ви придумали відповідь, щоб це не переслідувало сайт як питання без відповіді. :)
Рарст

Просто скористайтеся the_post()функцією (вона працює і на шаблоні одного посту) перед тим, як get_the_excerpt()її зателефонувати, вона встановить необхідні для вас дані.
Сисір

Відповіді:


29

Це питання я знайшов, коли дивився, як це зробити без об’єкта публікації.

Моє додаткове дослідження виявило цю гладку техніку:

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


1
Це слід сприймати як відповідь, оскільки це рекомендований спосіб витягнути дані за межі циклу. Також не потрібна спеціальна функція або переосмислення $postглобальної змінної.
MacK

4
він повертає порожню рядок.
Kyaw Tun

1
@KyawTun - працює, доки $post_idвстановлено (яке значення $post_id? І $post_idчи дійсний, законний ідентифікатор повідомлення.
cale_b

2
@cale_b Дякую Я використовую запит get_posts і отримую ідентифікатор з отриманого масиву. Об'єкт публікації має post_title, post_content, ID тощо. Але не працює.
Kyaw Tun

Якщо вам потрібно ПРОСТО ТЕКСТ, а не тег <p>, який включений у фільтр_excerpt, тоді використовуйте фільтр "get_the_excerpt", щоб над цим фільтром став: $ text = apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); це дасть вам лише текст RAW, який ви можете вставити будь-де у власній розмітці.
Мохін

22

Оскільки, здається, у вас вже є об’єкт публікації, для якого вам потрібен уривок, ви можете просто змусити роботу працювати:

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

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


1
Це працює, але: "Ви повинні пройти посилання на глобальну $postзмінну, інакше функції, як-от the_title(), не працюють належним чином." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
деч

setup_postdata($post);FTW !!!!
squarecandy

18

Спробуйте це:

Створіть нову функцію в function.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
Відповідь EAMann - це набагато кращий підхід до цієї проблеми, і це слід вважати найкращою практикою. Цей підхід в основному дублює внутрішні процеси Core, а не використовує API.
Іван Данн

9

Тепер ви можете просто використовувати get_the_excerpt( $postID )функцію. З тих пір: WordPress 4.5.0 ввів $postпараметр.


1
Це має бути нова прийнята відповідь, оскільки ми перебуваємо в епосі WP 4.5 +.
Matija Mrkaic

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 () поза циклом


2
Відповіді лише на посилання не є корисними. Скопіюйте тут відповідний код. Якщо це посилання розірвано, той сайт не працює / не працює, ця відповідь не має значення.
cale_b

Це прекрасно працювало для мене!
Сайкат

1

Якщо у вас немає об’єкта публікації, ось коротка функція, подібна до Вітерса.

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}

Але у запитувача є об'єкт поштового зв’язку, як зазначено у питанні.
fuxia

3
Виправте мене, якщо я помиляюся, цей метод поверне вручну витяг, але при необхідності не створить його
Білл

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;
}

Це самий прямий спосіб зробити це. Не впевнений, що це чудова ефективність роботи. Ви все одно отримуєте мій +1
Білл

1

Якщо ви хочете автоматично генерувати уривок із вмісту в одному рядку - ви можете скористатись wp_trim_wordsтакою функцією:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

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