さまざまな理由から、私はWordpressの組み込みThumbnail機能を使用できません。
代わりに、投稿の最初の画像をサムネイルとして使用します。
これが私がコーデックスで見つけたものです: 投稿に関連した最初の画像を表示します 。
ただし、問題は、投稿に複数の画像が含まれていても、投稿の最初の画像が実際に最初にアップロードされたものではない場合、最初の画像ではなく2番目の画像が表示されることです。
そこで、私は このアプローチ に似たものを使うことにしました - /、最初の投稿を見つけるためにthe_content
を解析するために正規表現を使います。
これはうまくいきますが、投稿で使用されていた画像サイズが最終的に表示されるので、サムネイルサイズのみを使用します。
だから、ここに質問です:私は画像へのリンクがある場合、私は別のサイズを得ることができる方法はありますか?
私が必要としているのは、私がこれで画像サイズを取得することができるように、どういうわけか添付ファイルIDを取得することです:
wp_get_attachment_link( $id, 'thumbnail' );
問題は、URLがだけだとしたらどうやってIDを取得できますか?
私はこれを使うことにしました。これは@ AndresYanezの答えに基づいています。
function get_image_id_by_link($link)
{
global $wpdb;
$link = preg_replace('/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $link);
return $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE BINARY guid='$link'");
}
これははるかに簡潔です(最初に拡張子を削除してから再び追加するというフープを飛び越えないので)、そしてもう少し正確です(.
がエスケープされ、クエリが大文字と小文字を区別するため)。
function get_attachment_id_from_src ($src) {
global $wpdb;
$reg = "/-[0-9]+x[0-9]+?.(jpg|jpeg|png|gif)$/i";
$src1 = preg_replace($reg,'',$src);
if($src1 != $src){
$ext = pathinfo($src, PATHINFO_EXTENSION);
$src = $src1 . '.' .$ext;
}
$query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$src'";
$id = $wpdb->get_var($query);
return $id;
}
Pathorsleyへのクレジット: http://www.pathorsley.com/code/get-the-wordpress-post-attachment-id-from-an-image-src/
時々 The Codex はそんなに間違っていません...
これはCodexのややの変更例です。
<?php
// Do this inside The Loop (where $post->ID is available).
global $post;
$args = array(
'post_type' => 'attachment'
,'numberposts' => 1
,'post_status' => null
,'post_parent' => $post->ID
,'orderby' => 'ID'
,'order' => 'ASC'
);
$attachments = get_posts( $args );
if ( $attachments )
{
foreach ( $attachments as $attachment )
{
echo apply_filters( 'the_title' , $attachment->post_title );
the_attachment_link( $attachment->ID , false );
}
}
?>
Codexの例への変更は簡単です:numberposts
は1に設定され、orderby
の値はID
であり、最も低いIDの投稿を最初に取得するためにASC
をソートします。
それで、これがsmartである理由はここにあります:IDは順番に与えられます、それで最初にアップロードされた投稿は最も低いIDを持つでしょう。
上の例では、最後の関数をwp_get_attachment_link()
と単純に交換してそれを何らかのvarに保存することができます。後で再利用することができます。