web-dev-qa-db-ja.com

投稿に添付されたREALの最初の画像を抽出して表示 - the_post_thumbnail()を拡張

私はここに誰かが解決できると確信している面白い問題があります。私は、投稿に関連する主要な画像を抽出するのに最適なコードを検索するために、さまざまなプラグインとコードスニペットを調べました

新しいWP 3.0のおすすめ画像要素が使用されている場合はもちろん問題はありませんが、投稿に「おすすめの画像」が割り当てられていない可能性があります。このような状況で、次の標準コードを使用したとします。

<?php echo the_post_thumbnail( array(200,200) ); ?>

テンプレートに...何も表示されません。

このような状況では、私は完璧な解決策を探しています。基本的に、必要なのはthe_post_thumbnailが存在しないときに一種の "failover"を持つことができることですが、the_post_thumbnailのコードを使ってできるのと同じようにイメージサイズを設定することもまだ必要です。

この「フェイルオーバー」には2つのステップがあるはずです。

  1. この投稿の "Media Gallery"をチェックして、ソート順が最も高い(または下のプラグインに示すように投稿の親を追加)画像を見つけます。
  2. ソート順が設定されていない場合、または空白の場合は、投稿コンテンツから最初の画像を抽出します。

幸いなことに、上記の2つの点について、これらの要求を個別に処理する2つの別々のコードの断片(レビュー用に以下にコピー)が見つかりましたが、3つの要素すべてを1つにまとめたものはありません。

要約すると:投稿のサムネイルが存在するかどうかをチェックするためにif/thenの呼び出しを行う代わりに、以下のコードに対してチェックを実行する代わりに、誰かが私を許可するクリーン/複合機能を提供できるかもしれません上記の3つの目標すべてを達成することができるサイズ変数と共に単一の関数をエコーすること。

上記のコードのBITSは次のとおりです。


FOR#1:Media Galleryからの注文に基づいて最初の画像を取得します。このコードは、まずwp_postsデータベーステーブルで添付ファイルを探します。現在の投稿に一致する「post_parent」IDを持ち、複数の画像添付ファイルがある投稿の2番目のステップとして、「menu_order」フィールドを「1」に設定して添付ファイルを返します。現在の投稿IDに一致する添付ファイルがない場合、プラグインは“ false”を返します。

// AUTOMATICALLY EXTRACT IMAGES BASED ON ASSOCIATED GALLERY ORDER
// THIS CODE EXTRACTS THE FIRST IMAGE BASED ON THE ORDER IN THE MEDIA GALLERY
// PLUGIN FROM: http://mekosh.org/projects/ordered-thumbnails
   function ordered_thumbnails( $display = 'true', $class='' ) {
    global $post;
    // get all image attachments for this post
    $images = get_children( array( 'post_type' => 'attachment', 'post_parent' => $post->ID, 'post_mime_type' => 'image', order=>"asc" ) );
    // if the post has image attachments
    if( $images !== false ) {
        // find the image in position 1
        foreach($images as $i) {
            if ( $i->menu_order == 1 ) {
                $img_id = $i->ID;
            }
        }
        // if the images were unordered
        if ( $img_id == '' ) {
            $i = array_slice( $images, 0, 1 );
            $img_id = $i[0]->ID;
        }
        // get image data
        $image = wp_get_attachment_image_src( $img_id, 'thumbnail' );
        $result = array(
            'url'       => $image[0],
            'width' => $image[1],
            'height'    => $image[2]
        );
        // should the image be displayed or should data be returned as an array?
        if ( $display == 'true' ) {
            return _e( '<img src="'.$result['url'].'" width="'.$result['width'].'" height="'.$result['height'].'" class="'.$class.'" />' );
        } else {
            return $result;
        }
    } else {
        // post does not have any image attachments
        return (bool) false;
    }
   }
// create template tag "ordered_thumbnails"
   add_action( 'ordered_thumbnails', 'ordered_thumbnails', 2 );

FOR#2:投稿内容から最初の画像を抽出する

// THIS CODE GETS THE FIRST IMAGE EXTRACTED DIRECTLY FROM THE POST CONTENT

    function bm_extract_string($start, $end, $original) {
    $original = stristr($original, $start);
    $trimmed = stristr($original, $end);
    return substr($original, strlen($start), -strlen($trimmed));
    }
    function getFirstImage() {
    $content = get_the_content();
    $pic_string = bm_extract_string('src="','" ',$content);
    $imagesize = getimagesize($pic_string);
    list($width, $height, $type, $attr) = getimagesize($pic_string);
    $link = get_permalink();
    $title = get_the_title($post->post_title);
    echo '<a href="'.$link.'" style="background:url('.$pic_string.'); display:block; width:'.$width.'px; height:'.$height.'px;" title="'.$title.'"></a>';
    }
2

ここに興味がある人のための私の問題の解決策があります。

これをあなたのfunctions.phpファイルに含めてください

require_once('custom/extract-post-thumbnail.php');
    $extract_img = new extract_post_image();
    add_filter( 'post_thumbnail_html', array(&$extract_img, 'get_post_image'),1,5 );

新しいファイルを作成し、「extract-post-thumbnail.php」という名前を付け、それを「custom」という名前のフォルダに配置し、それをthemes functions.phpファイルと同じディレクトリ内に配置します。最後に、以下のコードをこのファイルに貼り付けます。

<?php
class extract_post_image {
    public $html;
    public $post_id;
    public $post_image_id;
    public $size;
    public $attr;
    public function extract_post_image()  {
    }
    public function get_post_image ($html,$post_id, $post_image_id, $size, $attr) {
$this->html = $html;
        $this->post_id = $post_id;
        $this->post_image_id = $post_image_id;
        $this->size = $size;
        $this->attr = $attr;
    if ($this->html == '') {
         $this->post_image_id = $this->get_post_image_id ();
         if ($this->post_image_id) {
           do_action( 'begin_fetch_post_thumbnail_html', $this->post_id, $this->post_image_id, $this->size ); 
        $this->html = wp_get_attachment_image( $this->post_image_id, $this->size, false, $this->attr );
        do_action( 'end_fetch_post_thumbnail_html', $this->post_id, $this->post_image_id, $this->size );
    } else {
        $this->html = $this->get_image_in_content ();
    }
    }
    return $this->html;
}
public function get_post_image_id () {
    $images = get_children(
    array(
        'post_parent' => $this->post_id,
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'order' => 'ASC',
        'orderby' => 'menu_order',
        'numberposts' => 1
        )
    );
    if ($images) {
        foreach ($images as $img) {
        $img_id = $img->ID;
        }
        return $img->ID;
        } else {
           return NULL;
        }
}
public function remote_file_exists($image) {
    if ( @file($image)) {
        return true;
    }
    return false;
}
public function get_image_in_content () {
    $my_post = get_post($this->post_id);
    preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i', $my_post->post_content, $matches );
    if ( isset( $matches ) ) {
            $image = $matches[1][0];
    if ( $matches[1][0] && $this->remote_file_exists($image) ) {
            $altpattern = '/alt=([\'"])?(.*?)\\1/';
            preg_match($altpattern, $matches[0][0], $m);
            $alt = $m[2];
            $default_attr = array(
            'src'   => $image,
            'class' => "attachment-$size",
            'alt'   => $alt
        );
            $this->attr = wp_parse_args($this->attr, $default_attr);
        $attr = array_map( 'esc_attr', $this->attr );
        $attributes = '';
        foreach ( $this->attr as $name => $value ) {
            $attributes .= " $name=" . '"' . $value . '"';
        }
           $imgwh = getimagesize($image);
           $imgsize = image_constrain_size_for_editor($imgwh[0], $imgwh[1], $this->size);
           $wh = image_hwstring($imgsize[0], $imgsize[1]);
           $this->html = ' <img '.$attributes.' '.$wh.' />';
                return $this->html;
        }
        } else {
        return NULL;
        }
}
}
?>
1

Image プラグインを入手してください。基本的に、さまざまな方法で投稿用の投稿をマイニングするための柔軟で設定可能なラッパーとして機能する単一の機能です(投稿メタフィールド、おすすめ画像、添付画像、投稿本文内の画像)。

2
Rarst

あなたはここで役に立つコードスニペット をチェックすることができます 私はポストから最初の画像を引き出すのにそれらが有用であるとわかりました。

0
me-too

@ NetConstructor、

この機能はあなたの問題をすべて解決するわけではありませんが、助けになると思いました。投稿に添付された最初の画像を取得し、中サイズの画像をthe_contentに追加します。ソート順が設定されていない場合は、ソート順が「0」の画像が取得されます。投稿コンテンツからは何も抽出されず、画像が投稿コンテンツにある場合は2回表示されます。

投稿に画像を挿入するのに問題があるクライアントに使用しました。この機能で彼はそれを「挿入する」必要性なしで「媒体を加える」ボタンをクリックし、画像をアップロードしそして保存をクリックするだけでよい。

function the_image($size = 'medium' , $class = ”){
global $post;

//setup the attachment array
$att_array = array(
'post_parent' => $post->ID,
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order_by' => 'menu_order'
);

//get the post attachments
$attachments = get_children($att_array);

//make sure there are attachments
if (is_array($attachments)){
//loop through them
foreach($attachments as $att){
//find the one we want based on its characteristics
if ( $att->menu_order == 0){
$image_src_array = wp_get_attachment_image_src($att->ID, $size);

//get url – 1 and 2 are the x and y dimensions
$url = $image_src_array[0];
$caption = $att->post_excerpt;
$image_html = '<img src="%s" alt="%s" />';

//combine the data
$html = sprintf($image_html,$url,$caption,$class);

//echo the result
echo $html;
}
}
}
}
0
Chris_O