Extrahiere und zeige das REALE erste Bild an, das an einen Beitrag angehängt ist – extend the_post_thumbnail ()

Ich habe ein interessantes Problem, das ich hier sicher lösen kann. Ich habe eine Reihe verschiedener Plugins und Codeschnipsel durchsucht, um nach dem perfekten Code zu suchen , um ein primäres Bild zu extrahieren, das einem Beitrag zugeordnet werden kann .

Wenn das neue WP 3.0-Bildelement verwendet wird, gibt es natürlich kein Problem, aber es gibt eine Reihe von Situationen, in denen einem Post kein “Featured Image” zugewiesen ist. In diesen Situationen, wenn Sie den Standardcode von:

 

in deiner Vorlage … wird nichts angezeigt.

Für diese Art von Situationen suche ich die perfekte Lösung. Im Wesentlichen brauche ich die Möglichkeit, eine Art “Failover” zu haben, wenn the_post_thumbnail nicht existiert, aber ich brauche auch noch die Fähigkeit, die Bildgröße genau so einzustellen, wie ich es mit dem Code von the_post_thumbnail kann.

Dieses “Failover” sollte meines Erachtens zwei Schritte umfassen:

  1. Überprüfen Sie die “Mediengalerie” für diesen Beitrag und suchen Sie das Bild mit der höchsten Sortierreihenfolge (oder hinzugefügtem Elternteil wie im folgenden Plugin gezeigt)
  2. Wenn keine Sortierreihenfolge festgelegt ist oder leer ist, extrahieren Sie das erste Bild aus dem Post-Inhalt.

Die gute Nachricht ist, dass ich für die beiden oben genannten Punkte zwei separate Code-Snips gefunden habe, die sich einzeln um diese Anfragen kümmern (unten zur Überprüfung kopiert), aber nichts, was alle drei Elemente in einem vereint.

Also, um es noch einmal zu wiederholen: Anstatt eine Reihe von if / then-Anrufen zu machen, um zu überprüfen, ob ein Post-Thumbnail existiert und dann eine Überprüfung gegen den unten stehenden Code, hoffe ich, dass jemand eine saubere / kombinierte function zur Verfügung stellen könnte um eine einzelne function zusammen mit Größenvariablen wiederzugeben, die alle drei diese Ziele erreichen können, wie oben erwähnt.

HIER SIND DIE OBEN GENANNTEN BITS DES CODE:


FOR # 1: Holen Sie sich das erste Bild basierend auf der Reihenfolge aus der Mediengalerie : Dieser Code sucht zuerst nach Anlagen in der databasetabelle wp_posts, die eine “post_parent” ID haben, die mit dem aktuellen Post übereinstimmt und als zweiten Schritt für Posts Bei mehreren Bildanhängen wird der Anhang mit dem Feld “menu_order” auf “1” zurückgesetzt. Wenn keine Bildanhänge mit der aktuellen Post-ID übereinstimmen, gibt das Plugin “false” zurück.

 // 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( '' ); } 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: Extrahiere das erste Bild aus dem Post-Inhalt

 // 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 ''; } 

Solutions Collecting From Web of "Extrahiere und zeige das REALE erste Bild an, das an einen Beitrag angehängt ist – extend the_post_thumbnail ()"

Ich schlage vor, das Get-Image- Plugin zu testen. Im Grunde ist es eine einzelne function, die als flexibler und konfigurierbarer Wrapper fungiert, um Posts für Bilder mit verschiedenen Methoden zu bearbeiten (Post-Meta-Felder, vorgestellte Bilder, angehängte Bilder, Bilder im Post-Body).

Hier ist die Lösung für mein Problem für jeden, der interessiert ist.

Fügen Sie dies in Ihre Datei functions.php ein

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

Erstelle eine neue Datei und nenne sie “extract-post-thumbnail.php”, lege sie in einen Ordner mit dem Namen “custom” und lege ihn in das Verzeichnis, in dem sich die Datei functions.php deiner Themes befindet. Schließlich, nach dem Code unten in dieser Datei.

 < ?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( '||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 = ' '; return $this->html; } } else { return NULL; } } } ?> 

@NetConstructor,

Diese function wird nicht alle Ihre Probleme lösen, aber ich dachte, es würde helfen. Es wird das erste Bild an einen Post angehängt und fügt das Medium-Bild zu dem the_content Wenn keine Sortierreihenfolge eingestellt ist, wird das Bild mit der Sortierreihenfolge “0” erhalten. Es extrahiert nichts aus dem Post-Inhalt und wenn das Bild im Post-Inhalt ist, wird es 2 mal angezeigt.

Ich habe es für einen Kunden verwendet, der Probleme beim Einfügen von Bildern in Posts hatte. Mit dieser function muss er nur auf die Schaltfläche “Medien hinzufügen” klicken, das Bild hochladen und auf Speichern klicken, ohne es “einzufügen”.

 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 = 'http://img.daswordpress.com/customization/%s'; //combine the data $html = sprintf($image_html,$url,$caption,$class); //echo the result echo $html; } } } } 

Sie können die hilfreichen Code-Schnipsel hier überprüfen. Ich fand sie nützlich, um das erste Bild aus dem Post herauszuziehen.