投稿に挿入した画像のリンクをクリックすると Lightbox のような感じで表示するようにしていたが、画像によってはサイズや位置が正しく表示されないことがあったので調べてみた際のメモ。
「メディアを追加」で「添付ファイルの表示設定」の「リンク先」を「メディアファイル」に指定すると画像(メディア)にその画像へのリンクが設定される。
get_posts のパラメータを以下のように指定すると画像の情報を取得できる。
しかしここに問題があった。
「’post_parent’」を「$post->ID」としているため、他の投稿に対して過去にアップロードした画像を投稿に挿入している場合、その画像の情報は取得できない。そのためサイズの情報が取得できず表示がおかしくなっていた。
<?php
$attachments = get_posts( array(
'post_parent' => $post->ID,
'orderby' => 'none',
'order' => 'ASC',
'post_status' => 'inherit',
'numberposts' => -1,
'offset' => 0,
'post_type' => 'attachment',
'post_mime_type' => 'image',
) );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
// $link_image_src にリンク先画像(添付ファイル)の指定したサイズの画像の情報を取得
$link_image_src = wp_get_attachment_image_src($attachment->ID, 'large'); //'full'と指定すればフルサイズの画像の情報を取得
echo '<p class="img_link">' .$link_image_src[0] .'</p>'; //URL
echo '<p class="img_width">' .$link_image_src[1] .'</p>'; //幅
echo '<p class="img_height">' .$link_image_src[2] .'</p>'; //高さ
// タイトルを取得
$title = esc_html(trim($attachment->post_title));
if($title) echo '<'.$tag.' class="img_title">' .$title.'</'.$tag.'>';
}
}
?>
functions.php に preg_match_all を使って以下のような関数を記述。
function getPostImages($mypost){
if(empty($mypost)){
return(null);
}
if(preg_match_all('/<a [^>]*"(http:[^">]*\/wp-content\/uploads\/[^">]*)"[^>]*>/u',$mypost->post_content,$img_array)){
$resultArray = $img_array[1];
}
return($resultArray);
}
この方法を使うとコンテンツからいろいろな情報が抽出できそう。但し「echo $post->post_content;」を使うのは危ないらしい。
参考情報:「echo $post->post_content; を避ける3つの理由」
以下をテンプレートのループ内に記述。
<?php
$postImages = getPostImages($post);
if($postImages != null) {
echo "<ol>\n";
for($i = 0; $i<count($postImages);$i++){
$img_src = trim($postImages[$i]);
list($width, $height, $type, $attr) = getimagesize($img_src);
echo '<li><span class="img_src">'. $img_src .'</span> ';
echo '<span class="img_width">'. $width .'</span> ';
echo '<span class="img_height">'.$height .'</span></li>'."\n" ;
}
echo "</ol>\n";
}
?>
これで画像の情報が取得できたので、jQuery などでこれを利用できる。