Отримайте перше зображення з вмісту публікації (наприклад: гарячі посилання)


10

Я використовую цей код безпосередньо з кодексу .

function echo_first_image ($postID)
{                   
    $args = array(
    'numberposts' => 1,
    'order'=> 'ASC',
    'post_mime_type' => 'image',
    'post_parent' => $postID,
    'post_status' => null,
    'post_type' => 'attachment'
    );

    $attachments = get_children( $args );

    //print_r($attachments);

    if ($attachments) {
        foreach($attachments as $attachment) {
            $image_attributes = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' )  ? wp_get_attachment_image_src( $attachment->ID, 'thumbnail' ) : wp_get_attachment_image_src( $attachment->ID, 'full' );

            echo '<img src="'.wp_get_attachment_thumb_url( $attachment->ID ).'" class="current">';

        }
    }
}

Я називаю це в циклі так echo_first_image ($post->ID);

Функція виконує дзвінки, але нічого не отримує виводу ... наскільки я бачу, нічого в цьому немає $attachments

У мене є зображення в публікації, яку я використовую. Це не зображене зображення або в галереї, просто в дописі.

Я щось роблю не так, або в першу чергу щось не так з кодом?

Відповіді:


22

Якщо ви хочете відобразити зображення, яке вставлено у ваш вміст (наприклад, гаряче посилання), ви повинні використовувати функцію, подібну до цієї (джерело) :

додати у function.php :

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  $first_img = $matches [1] [0];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

Потім розмістіть місце, <?php echo catch_that_image() ?>де ви хочете відобразити зображення.

Примітка: зображення з гарячою посиланням, щойно розміщене у вашому вмісті, не може бути встановлене як Featured Image, як основна функція WordPress.


Так, я бачив, що цей код навколо ... здається, трохи злому, ви можете подумати, що існує спосіб "WordPress" ... Цікаво, чому мені потрібно використовувати preg_match, коли в кодексі сказано, що ти можеш зробити це, як я розмістив вище. Це моє питання справді, якщо чесно. Чи неправильний код, який я розмістив? ... тим більше, ніж намагатися змусити його реально працювати. Але дякую, що я можу в кінцевому підсумку використати це. Я не розумію значення "зображення, щойно розміщене у вашому вмісті, не може бути встановлено як" Образне зображення ". Чи впливає це певним чином на це. Я просто намагаюся вивести перше зображення з поста, а не зображене зображення.
byronyasgur

Існує велика різниця між тим, як розмістити посилання на зображення всередині вмісту публікації / сторінки та прикласти зображення. Ви можете прикріпити зображення, не показуючи його взагалі. Приклад Codex - це отримання файлу, приєднаного до вашої публікації / сторінки, немає ніякого способу встановити зображення, розміщене всередині, посилаючись, також гаряча посилання - це не функція, з якою WP буде працювати без PHP-регексу.
Діана

Про посилання COdex: як ви бачите, що документ називається після імені функції get_childre, додаток - це дочірнє повідомлення, тому цей приклад може працювати лише для доданого вмісту.
Діана

Так, я знаю, що можу приєднати зображення, не вставляючи його, цей біт зрозумілий ... але я не бачу, як можна вставити зображення, не додаючи його ..., коли натискаю кнопку "Завантажити / вставити", завантажити файл з мого комп'ютера і натисніть кнопку "Вставити в пост" та оновити, потім перейдіть до бібліотеки медіатеки, і мені це сказано, що завантажене нами зображення "додається" до публікації? ... чи ми говоримо тут про семантику, тому що я розумію, що ви говорите про цей біт коду, який працює лише для доданих зображень.
byronyasgur

1
Ви можете посилання гарячого посилання на файл зображення будь-де. При натисканні кнопки Вставити зображення / медіа з'являється вкладка "Від URL-адреси", де ви повідомляєте URL-адресу зображення, тобто послугу обміну зображеннями. Регекс зможе отримати це зображення ("як є"), але WP не зможе використовувати це зображення, наприклад, Featured Image
Діана

3

Я пропоную два способи:

Використання плагіна

Я б подумав використовувати плагін Get The Image , щоб ви могли зробити щось на кшталт:

$args = array(
    'post_id' => <id>
    'image_scan' => true
);
get_the_image($args);

Вищевказане намагатиметься робити в такому порядку:

  1. Шукайте ескіз допису
  2. Шукайте перше додане зображення
  3. Скануйте вміст публікації для вставленого зображення.

Побудова підтримки у вашій темі

Однак я використовую функцію в плагіні, який реалізує перші два пункти списку вище.

function gpi_find_image_id($post_id) {
    if (!$img_id = get_post_thumbnail_id ($post_id)) {
        $attachments = get_children(array(
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'numberposts' => 1,
            'post_mime_type' => 'image'
        ));
        if (is_array($attachments)) foreach ($attachments as $a)
            $img_id = $a->ID;
    }
    if ($img_id)
        return $img_id;
    return false;
}

Ви можете адаптувати його так, щоб він відповідав третьому елементу в фрагменті Діани:

function find_img_src($post) {
    if (!$img = gpi_find_image_id($post->ID))
        if ($img = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches))
            $img = $matches[1][0];
    if (is_int($img)) {
        $img = wp_get_attachment_image_src($img);
        $img = $img[0];
    }
    return $img;
}

Просто вставте ці дві функції у свій functions.phpфайл і використовуйте їх у циклі, як:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>

Тема повинна продаватися комерційно, тому я не хочу сказати кінцевому користувачеві, що їм потрібно встановити плагін, але дякую.
byronyasgur

@byronyasgur Редагував відповідь, щоб уточнити, що я дав вам два рішення. Вам не потрібно встановлювати плагін, щоб слідкувати за другим.
vmassuchetto

2

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

Подумайте про те, щоб перейти до панелі адміністратора медіа та приєднати зображення до цієї публікації.

По черзі скрапте вміст публікації за допомогою регулярного вираження для зображень у ньому.


Чи є у мене непорозуміння того, що саме означає «додається»? .... У мене немає зображення в публікації ... чи не додається воно, коли ви натискаєте "додати до публікації"?
byronyasgur

1
з вашого запитання здавалося, що ви ввели html-код, що посилається на зображення, не обов'язково додане wp.
pcarvalho

1

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

preg_match не є гарним підходом до розбору HTML у PHP, оскільки preg_match призначений для регулярного вираження, а HTML - не регулярного вираження.

Ми можемо використовувати DOM замість цього.

function firstImg($html){
  $dom = new DOMDocument;
  $dom->loadHTML($html);
  $images = $dom->getElementsByTagName('img');
  foreach ($images as $image) {
    return $image->getAttribute('src');
  }
  return false;
}

Використання DOM дуже добре, оскільки ви можете зробити більше, ніж просто отримати перше зображення, і це правильний спосіб розбору HTML.

Я хочу, щоб я міг відповісти за використання функцій wordpress (функції від CODEX та core), щоб отримати перше зображення, але це також проблема, з якою я маю справу.

Це не відповідь на кожен випадок!

Розглянемо випадок оптимізації розміру зображення. У цьому випадку ви не можете просто використовувати цей код, оскільки повідомлення може містити зображення будь-якого розміру.


0

Цей код працює для мене:

function get_first_image( $post_id ) {
    $attach = get_children( array(
        'post_parent'    => $post_id,
        'post_type'      => 'attachment',
        'post_mime_type' => 'image',
        'order'          => 'DESC',
        'numberposts'    => 1
    ) );
    if( is_array( $attach ) && is_object( current( $attach ) ) ) {
        return current( $attach )->guid;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.