it-swarm.dev

Extrahovat a zobrazit první obrázek REAL připojený k příspěvku - rozšířit soubor the_post_thumbnail ()

Mám zajímavý problém, který jsem si jistý, že tu někdo může vyřešit. Prošel jsem spoustu různých pluginů a úryvků kódu při hledání dokonalého kódu pro extrahování primárního obrázku, který má být spojen s příspěvkem .

Je-li použit nový prvek s obrazem WP 3.0, pak samozřejmě neexistuje žádný problém, ale je zde spousta situací, kdy příspěvek nemusí mít přiřazený "zobrazený obrázek". V těchto situacích používejte standardní kód:

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

ve vaší šabloně ... nic se nezobrazí.

Pro tyto typy situací hledám perfektní řešení. V podstatě to, co potřebuju, je schopnost mít typ "převzetí služeb při selhání", když the_post_thumbnail neexistuje, ale také stále potřebuji schopnost nastavit velikost obrázku stejně jako já s kódem z the_post_thumbnail.

Věřím, že tento "failover" by měl mít dva kroky:

  1. Zaškrtněte „Media Gallery“ pro tento příspěvek a najděte obrázek s nejvyšším tříděním (nebo přidejte rodičovskou poštu podle níže uvedeného pluginu)
  2. Není-li nastaveno pořadí řazení nebo je prázdné, extrahujte první obrázek z obsahu příspěvku.

Dobrou zprávou je, že pro dva body výše jsem se zdá, že jsem našel dva samostatné výstřižky kódu, které se o tyto požadavky postarají individuálně (zkopírované níže pro přehodnocení), avšak nic, co by v sobě spojilo všechny tři tyto prvky.

Takže, k rekapitulaci: Namísto toho, abych udělal spoustu if/pak volá zkontrolovat, zda post miniatura existuje a pak spustit kontrolu proti níže uvedenému kódu jsem doufal, že někdo může být schopen poskytnout čistou/kombinovanou funkci, která by mi umožnila echo jednu funkci spolu s proměnnými velikosti, které mohou dosáhnout všech tří těchto cílů, jak je uvedeno výše.

ZDE JSOU BITS Z KÓDU UVEDENÉHO:


PRO # 1: Získejte první obrázek na základě objednávky z Galerie médií: Tento kód funguje tak, že nejprve hledá všechny přílohy v tabulce databáze wp_posts, mít „post_parent“ ID, které odpovídá aktuálnímu příspěvku, a jako druhý krok pro příspěvky s více obrazovými přílohami, navrácení přílohy s polem „menu_order“ nastaveným na „1“. Pokud žádné přílohy obrázků neodpovídají aktuálnímu ID příspěvku, modul vrátí hodnotu „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: Extrahujte první obrázek z obsahu příspěvku

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

Zde je řešení mého problému pro každého, kdo má zájem.

Zahrnout toto do souboru 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 );

Vytvořte nový soubor a pojmenujte jej "extract-post-thumbnail.php", umístěte jej do složky s názvem "custom" a umístěte jej do stejného adresáře, ve kterém je umístěn soubor themes.php. Nakonec za kód níže do tohoto souboru.

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

Doporučuji check out Získejte plugin Image . V podstatě je to jediná funkce, která funguje jako flexibilní a konfigurovatelný wrapper pro důlní příspěvky pro obrazy pomocí různých metod (post meta pole, představované obrazy, připojené obrázky, obrázky v těle pošty).

2
Rarst

Zde si můžete zkontrolovat užitečné kódy zde Zjistili jsme, že je užitečné vytáhnout první obrázek z příspěvku.

0
me-too

@ NetConstructor,

Tato funkce nevyřeší všechny vaše problémy, ale myslel jsem, že to pomůže. Dostane první obrázek připojený k příspěvku a přidá obrázek střední velikosti do souboru the_content Pokud není nastaveno žádné pořadí řazení, zobrazí se obraz s pořadí řazení "0". Nezahrnuje nic z obsahu příspěvku a pokud je obrázek v obsahu příspěvku, zobrazí se dvakrát.

Použil jsem ho pro klienta, který měl problémy s vkládáním obrázků do příspěvků. S touto funkcí stačí kliknout na tlačítko "přidat média", nahrát obrázek a kliknout na tlačítko Uložit, aniž by musel "vložit" to.

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