Pregunta

Tengo un problema interesante que estoy seguro de que alguien aquí puede resolver. He pasado por un montón de diferentes plugins y fragmentos de código en busca de el código perfecto para extraer una imagen primaria que se asocia con una entrada .

Si se utiliza el nuevo elemento de imagen destacada WP 3.0 a continuación, hay por supuesto ningún problema pero hay un montón de situaciones en las que un puesto puede no tener una "imagen destacada" asignado. En estas situaciones, si usted fuera a utilizar el código estándar de:

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

en la plantilla ... nada va a visualizar.

En este tipo de situaciones Estoy buscando la solución perfecta. En esencia, lo que necesito es la capacidad de tener un tipo de "conmutación por error" cuando the_post_thumbnail no existe, pero también todavía tengo la capacidad de fijar el tamaño de la imagen al igual que puedo con el código de the_post_thumbnail.

Esta "conmutación por error" Creo que deben tener dos pasos para que:

  1. Compruebe el "Media Gallery" para este puesto y localizar la imagen con el orden de clasificación más alta (o agregado de padres puesto como se muestra en el plugin abajo)
  2. Si hay un orden de clasificación se establece o si blanco a continuación, extraer la primera imagen del contenido de la entrada.

La buena noticia es que para los dos puntos por encima parece que he encontrado dos tijeras separadas de código que se ocupan de estas solicitudes de forma individual (copiado a continuación para su revisión) sin embargo nada que combina estos tres elementos en uno.

Así que, para recapitular: En vez de hacer un montón de si / entonces llama para comprobar si existe un puesto en miniatura y luego ejecutar un cheque contra el código de abajo tenía la esperanza de que alguien pueda ser capaz de proporcionar una función de limpieza / combinado que me permitiera eco de una sola función junto con variables de tamaño que puede alcanzar los tres de estos objetivos como se mencionó anteriormente.

Estos son los bits de código se ha mencionado anteriormente:


# 1: obtener la primera imagen con sede fuera del orden de la Galería de medios: Este código funciona, primero buscando para los archivos adjuntos en la tabla de base de datos wp_posts que tienen un ID “post_parent” que coincide con el puesto actual y como segundo paso para mensajes con múltiples archivos adjuntos de imagen, devolviendo el archivo adjunto con su conjunto de campo “menu_order” a “ 1 ". Si no hay archivos adjuntos de imagen coincide con el ID del mensaje actual, el plugin devuelve “falso”.

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

PARA # 2: Extracto de la primera imagen del contenido de la entrada

// 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>';
    }
¿Fue útil?

Solución 2

Aquí está la solución a mi problema para cualquier persona que esté interesada.

Incluir esto en su archivo 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 );

Crear un nuevo archivo y el nombre de "extracto de post-thumbnail.php", lugar en una carpeta con el nombre "a medida" y el lugar que en el mismo directorio que el archivo functions.php sus temas se encuentra. Por último, más allá de la siguiente código en este archivo.

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

Otros consejos

Sugiero de revisar obtener el complemento de imagen. Básicamente se trata de una sola función que actúa como envoltura flexible y configurable para mensajes de minas para imágenes a través de diferentes métodos (campos enviar meta, Imágenes, imágenes adjuntas, las imágenes en el cuerpo POST).

@NetConstructor,

Esta función no va a resolver todos sus problemas pero pensé que sería de ayuda. Se pone la primera imagen adjunta a un poste y añade la imagen de tamaño mediano a the_content Si hay un orden de clasificación se establece que tendrá la imagen con el "0" orden de clasificación. No extrae nada del contenido del post y si la imagen está en el contenido de la entrada se mostrará 2 veces.

Lo utilicé para un cliente que tenía problemas para insertar imágenes en los mensajes. Con esta función sólo tiene que hacer clic en el botón de "media Añadir", subir la imagen y haga clic en Guardar sin tener que "inserción" la misma.

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

You can check the helpful code snippets here I found them useful to pull out the first image from post.

Licenciado bajo: CC-BY-SA con atribución
scroll top