こんにちは
REST API の media エンドポイントを使用するのはどうでしょうか?
取得したデータの中にはサイズごとの URL も含まれています。
例:
$resturl = '〇〇〇/wp/v2/media/123';
$json = file_get_contents( $resturl );
$data = json_decode( $json );
if ( $data ) {
$url = $data->media_details->sizes->medium->source_url;
echo $url;
}
※ 123 は画像 ID。
@ishitaka 様
毎回的確に教えていただき本当にありがうございます。
最終的に以下のコードをループ内に記述することで、
画像サイズを指定しつつ、各投稿の画像を出力することができました。
<?php
$imgID = $data['acf']['field_name'];
$restURL = '〇〇〇/wp-json/wp/v2/media/'.$imgID;
$json = file_get_contents( $restURL );
$data = json_decode( $json );
if ( $data ):
$imgURL = $data->media_details->sizes->medium->source_url;
?>
<img src="<?php echo $imgURL; ?>" alt="">
<?php endif; ?>
ありがとうございました。解決済みとさせていただきます。
解決したということなので、以下のことは気が向いたらお読みください。
ループ内ということなので、比較的遅い処理である画像(メディア)の取得を1回で取得されたほうがいいかと思います。
include で ID を複数指定することができます。
例:
// $ids = [1,2,3]; // 画像 ID の配列
$resturl = '〇〇〇/wp-json/wp/v2/media/?include=' . implode( '+', $ids );
@ishitaka 様
ありがとうございます。
全体コードは以下なのですが、各画像IDはランダムで呼び出された記事と関連づけられておりまして、ページを読み込むたびに画像IDが変わります。
この場合、画像の取得を一回で行うにはどこをどう修正すれば良いでしょうか…
<?php
$siteURL = 'https://〇〇〇';
$restURL = $siteURL.'/wp-json/wp/v2/typename?per_page=30&orderby=rand';
$json = mb_convert_encoding(file_get_contents($restURL), 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);
?>
<?php foreach($arr as $data): ?>
<div class="seeds_list">
<a href="<?php echo $data['link']; ?>">
<h1><?php echo $data['title']['rendered']; ?></h1>
<?php
$imgID = $data['acf']['seeds_thumbnail'];
$restURL = $siteURL.'/wp-json/wp/v2/media/'.$imgID;
$json = file_get_contents( $restURL );
$data = json_decode( $json );
if ( $data ):
$imgURL = $data->media_details->sizes->seeds_thumbnail->source_url;
?>
<img src="<?php echo $imgURL; ?>" alt="">
<?php endif; ?>
</a>
</div>
<?php endforeach; ?>
ループ (foreach) の前で、同じループをして画像 ID の配列を作成するといいかと思います。
こんな感じでしょうか?
<?php foreach($arr as $data): ?>
の直前あたりに、
$image_ids = array();
foreach( $arr as $data ) {
$image_ids[] = $data['acf']['seeds_thumbnail'];
}
$resturl = $siteURL . '/wp-json/wp/v2/media/?include=' . implode( '+', $image_ids );
$json = file_get_contents( $resturl );
$images = json_decode( $json );
$images_index = 0;
ループ内に、
$url = $images[ $images_index ]->media_details->sizes->medium->source_url;
$images_index++;
@ishitaka 様
有難うございます!
下記のコードで試してみたのですが、それぞれの記事に対する画像が表示されず、src=”<?php echo $url; ?>”の部分に(unknown)や別記事の画像urlが出力されたりします。
<?php
$siteurl = 'https://〇〇〇';
$resturl = $siteurl . '/wp-json/wp/v2/seeds?per_page=5&orderby=rand';
$json = mb_convert_encoding(file_get_contents($resturl), 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);
$image_ids = array();
foreach( $arr as $data ) {
$image_ids[] = $data['acf']['seeds_thumbnail'];
}
$resturl = $siteurl . '/wp-json/wp/v2/media/?include=' . implode( '+', $image_ids );
$json = file_get_contents( $resturl );
$images = json_decode( $json );
$images_index = 0;
?>
<?php foreach($arr as $data): ?>
<div class="seeds_list">
<a href="<?php echo $data['link']; ?>">
<h1><?php echo $data['title']['rendered']; ?></h1>
<p><?php echo $data['acf']['seeds_subtitle']; ?></p>
<?php
if ( $data ):
$url = $images[ $images_index ]->media_details->sizes->medium->source_url;
$images_index++;
?>
<img src="<?php echo $url; ?>" width="150px" height="100px" alt="">
<?php endif; ?>
</a>
</div>
<?php endforeach; ?>
記事リストをランダムで出力していますが、インクリメントの部分が次のインデックスを呼び出せていない気がするのですが、教えていただいたコードの記述位置がおかしいのでしょうか。
何度も申し訳ありません。
すみません、サンプルコードでは画像配列($images)が順番に並んでいるものとしてしまいました。
ループ内では、ID で検索して使用してください。
例:
$url = $images[ $images_index ]->media_details->sizes->medium->source_url;
↓
$url = $images[ array_search( $data['acf']['seeds_thumbnail'], array_column( $images, 'id' ) ) ]->media_details->sizes->medium->source_url;
@ishitaka 様
ありがとうございます。 うまく機能しました。
ページ読み込みスピードも格段に速くなりました。
感謝申し上げます。