web-dev-qa-db-ja.com

投稿コンテンツから最初の画像を取得します(例:ホットリンク画像)

私は codex から直接このコードを使っています。

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に何もないことがわかる限り

私が使用している投稿に画像があります。注目の画像やギャラリーではなく、投稿にあります。

私は何か悪いことをしているのでしょうか、それともそもそもコードに何か問題があるのでしょうか。

10
byronyasgur

あなたのコンテンツに挿入された画像を表示したい場合 (例えばホットリンクされた画像)、 (source) のような関数を使わなければなりません

functions.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() ?>を置きます。

注:コンテンツに配置されたばかりのホットリンクの画像をおすすめの画像、つまり素晴らしいWordPressの機能として設定することはできません。

21
Diana

私は二つの方法を提案します:

プラグインを使う

Get The Image プラグインを使用することを検討するので、次のようにします。

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

上記はこの順序で物事をやろうとします:

  1. 投稿のサムネイルを探す
  2. 最初の添付画像を探す
  3. 挿入された画像の投稿内容をスキャンします。

あなたのテーマでの建築支援

しかし、上のリストの最初の2つの項目を実装する plugin の関数を使用しています。

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

Dianaのスニペット内の3番目の項目と一致するように調整することもできます。

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

これら2つの関数を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; ?>
3
vmassuchetto

コードは完全に安全なようです。あなたが言ったように、あなたは画像に 添付 ポストを持っていません。

メディア管理パネルに行き、その投稿に画像を添付することを検討してください。

または、投稿コンテンツをその中の画像の正規表現でスクラップします。

2
pcarvalho

私はこれが非常に古い質問であることを理解しています、しかし投票された答えのほとんどはPHPに不慣れな人々には適切ではないので私はここに私の答えを入れています。

preg_matchは正規表現用であり、HTMLは正規表現用ではないため、preg_matchはPHP内の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;
}

最初の画像を取得する以外にも多くのことが可能であり、HTMLを解析するのに正しい方法であるため、DOMを使用することは本当に良いことです。

私は最初の画像を取得するためにワードプレス機能(コーデックスとコアからの機能)を使用するための答えを置くことができますが、それは私が扱っている問題でもあります。

これはすべての場合の答えではありません!

画像サイズの最適化の場合を検討してください。その場合、投稿には任意のサイズの画像を含めることができるため、このコードを使用することはできません。

1
Victor

このコードは私のために働きます:

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