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


10

私はこのコードを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

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

私は何か間違ったことをしていますか、それとも最初からコードに何か問題がありますか?

回答:


22

コンテンツに挿入された画像(ホットリンクされた画像など)を表示する場合、次のような関数を使用する必要があります(ソース)

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の機能である注目画像として設定できません。


はい、私はそのコードを見てきました...ちょっとハックのようです、「WordPress」の方法があると思います...コーデックスができると言っているときになぜpreg_matchを使用する必要があるのか​​と思います上記で投稿したとおりです。それは正直に言うと私の質問です。投稿したコードは間違っていますか?...実際に機能させるよりも。しかし、おかげで私はこれを使用しなければならなくなるかもしれません。「コンテンツに配置したばかりの画像を注目画像として設定できない」の意味がわかりません。これは何らかの形でこれに影響を与えますか?注目の画像ではなく、投稿の最初の画像を表示しようとしています。
byronyasgur 2012

投稿/ページコンテンツ内に画像リンクを配置することと、画像を添付することには大きな違いがあります。画像を一切表示せずに添付できます。Codexの例は、投稿/ページにファイルを添付することです。リンクによって画像を内部に配置する方法はありません。また、ホットリンクは、WPがPHP正規表現なしで処理する機能ではありません。
ダイアナ

COdexリファレンスについて:関数名の後にdocが呼び出されることがわかるようget_childreに、添付ファイルは子の投稿であるため、この例は添付されたコンテンツに対してのみ機能します。
ダイアナ

はい、挿入せずに画像を添付できることはわかっていますが、ビットは明らかです...しかし、添付せずに画像を挿入する方法がわかりません...アップロード/挿入を押すと、コンピューターからファイルをアップロードします投稿に挿入して更新し、メディアライブラリライブラリに移動すると、アップロードした画像が投稿に「添付」されていることがわかります。...またはここでセマンティクスを話しているのは、添付された画像に対してのみ機能するそのコードのコードについてあなたが言っていることが理解できるからです。
byronyasgur 2012

1
画像ファイルはどこにでもホットリンクできます。[画像/メディアの挿入]をクリックすると、[URLから]タブがあり、画像のURL、つまりimageshackサービスに通知します。正規表現はこの画像を(「そのまま」)取得できますが、WPはこの画像を注目画像として使用できません。
ダイアナ

3

2つの方法をお勧めします。

プラグインを使用する

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

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

上記はこの順番で実行しようとします:

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

テーマでサポートを構築する

ただし、上記のリストの最初の2つの項目を実装する関数をプラグインで使用しています。

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

テーマは商業的に販売される予定なので、プラグインをインストールする必要があることをエンドユーザーに伝えたくありませんが、感謝します。
byronyasgur

@byronyasgur回答を編集して、2つの解決策を提供したことを明確にしました。2番目のプラグインに従うためにプラグインをインストールする必要はありません。
vmassuchetto 2012

2

コードは完全に安全に見えます。言ったように、投稿に画像が添付されていません。

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

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


「添付」が正確に何を意味するのかについて誤解がありますか?....投稿に画像があります... [投稿に追加]をクリックしても画像は添付されませんか?
byronyasgur 2012

1
あなたの質問から、あなたは必ずしもwpで添付されていない画像にリンクするhtmlコードを入力したようです。
pcarvalho 2012

1

これは非常に古い質問であることは理解していますが、投票した回答のほとんどが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の使用は本当に優れています。

ワードプレス関数(CODEXとコアからの関数)を使用して最初のイメージを取得するための答えを出したいのですが、それも私が扱っている問題です。

これはすべてのケースで答えになるわけではありません!

画像サイズを最適化する場合を考えます。その場合、投稿には任意のサイズの画像を含めることができるため、このコードを使用することはできません。


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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.