it-swarm.com.de

Extrahiere und zeige das REAL erste Bild an, das an einen Post angehängt wird - erweitere das_post_thumbnail ()

Ich habe ein interessantes Problem, das sicher jemand hier lösen kann. Ich habe eine Reihe verschiedener Plugins und Code-Schnipsel durchsucht, um den perfekten Code zum Extrahieren eines Primärbilds zu finden, das mit einem Beitrag verknüpft werden soll .

Wenn das neue Feature-Image-Element WP 3.0 verwendet wird, besteht natürlich kein Problem, aber es gibt eine Reihe von Situationen, in denen einem Beitrag möglicherweise kein Feature-Image zugewiesen ist. In diesen Situationen, wenn Sie den Standardcode von verwenden:

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

in Ihrer Vorlage wird nichts angezeigt.

Für diese Art von Situationen suche ich die perfekte Lösung. Was ich brauche, ist im Wesentlichen die Fähigkeit, eine Art "Failover" zu haben, wenn das_post_thumbnail nicht existiert, aber ich brauche weiterhin die Fähigkeit, die Bildgröße genau so einzustellen, wie ich es mit dem Code aus dem_post_thumbnail tun kann.

Dieses "Failover" sollte meiner Meinung nach zwei Schritte umfassen:

  1. Überprüfen Sie die "Mediengalerie" für diesen Beitrag und suchen Sie das Bild mit der höchsten Sortierreihenfolge (oder fügen Sie einen übergeordneten Beitrag hinzu, wie im Plugin unten gezeigt).
  2. Wenn keine Sortierreihenfolge festgelegt oder leer ist, extrahieren Sie das erste Bild aus dem Inhalt des Beitrags.

Die gute Nachricht ist, dass ich für die beiden obigen Punkte anscheinend zwei separate Codeschnipsel gefunden habe, die diese Anforderungen einzeln bearbeiten (zur Überprüfung unten kopiert), aber nichts, was alle drei dieser Elemente in einem vereint.

Also, um es noch einmal zusammenzufassen: Anstatt ein paar if/then-Aufrufe zu machen, um zu prüfen, ob ein Post-Thumbnail vorhanden ist, und dann eine Prüfung anhand des folgenden Codes durchzuführen, hatte ich gehofft, dass jemand in der Lage sein könnte, eine saubere/kombinierte Funktion bereitzustellen, die es mir ermöglicht eine einzelne Funktion zusammen mit Größenvariablen wiederzugeben, die alle drei oben genannten Ziele erreichen können.

HIER SIND DIE BITS DES OBEN GENANNTEN CODES:


FÜR # 1: Holen Sie sich das erste Bild basierend auf der Reihenfolge aus der Mediengalerie: Dieser Code sucht zunächst nach Anhängen in der wp_posts-Datenbanktabelle, die eine "post_parent" -ID haben, die mit dem aktuellen Beitrag übereinstimmt, und als zweiten Schritt für Beiträge mit mehreren Bildanhängen, wobei der Anhang mit dem Feld "menu_order" auf "1" zurückgegeben wird. Wenn keine Bildanhänge mit der aktuellen Beitrags-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( '<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: Extrahiere das erste Bild aus dem Inhalt des Beitrags

// 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

Hier ist die Lösung für mein Problem für alle, die interessiert sind.

Fügen Sie dies in Ihre functions.php-Datei 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 );

Erstellen Sie eine neue Datei mit dem Namen "extract-post-thumbnail.php", legen Sie sie in einem Ordner mit dem Namen "custom" ab und legen Sie diese im selben Verzeichnis ab, in dem sich Ihre Datei themes functions.php befindet. Fügen Sie abschließend den folgenden Code in diese Datei ein.

<?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

Ich schlage vor, das Image Plugin herunterzuladen. Grundsätzlich handelt es sich um eine einzelne Funktion, die als flexibler und konfigurierbarer Wrapper fungiert, um Posts für Bilder über verschiedene Methoden abzurufen (Post-Metafelder, ausgewählte Bilder, angehängte Bilder, Bilder im Post-Body).

2
Rarst

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

0
me-too

@ NetConstructor,

Diese Funktion wird nicht alle Ihre Probleme lösen, aber ich dachte, es würde helfen. Es wird das erste Bild an einen Beitrag angehängt und das mittelgroße Bild zu the_content hinzugefügt. Wenn keine Sortierreihenfolge festgelegt ist, wird das Bild mit der Sortierreihenfolge "0" abgerufen. Es wird nichts aus dem Inhalt des Beitrags extrahiert. Befindet sich das Bild im Inhalt des Beitrags, wird es zweimal angezeigt.

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

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