Detectar si el archivo de imagen es una miniatura

2

Quiero poder detectar si un archivo en una determinada ruta es una miniatura generada por WordPress. La única característica distintiva de la miniatura de WordPress, en lo que respecta a archivos individuales, es que terminaría con dos o tres números, 'x', otros dos o tres números y luego la extensión del archivo. La única forma en que puedo pensar en hacer esto sería usar una expresión regular para detectar literalmente ese patrón en el nombre del archivo. ¿Hay una mejor manera en la que no estoy pensando? Si no, ¿puede alguien ayudarme con la expresión regular?

    
pregunta heller_benjamin 18.03.2017 - 07:27

3 respuestas

0

Ok, así es como lo hice. Primero verifiqué si era compatible con las extensiones de archivo de imagen porque, si no, podemos guardar una consulta de base de datos. Luego simplemente revisé la base de datos para un ID de archivo adjunto. Si no hay un ID de archivo adjunto, asumo que esta es una miniatura. Quizás no sea perfecto para todas las soluciones pero funcionará para mi aplicación. Gracias por las sugerencias que hicieron que mi mente fluyera en la dirección correcta.

function is_not_thumbnail( $url ) {
    $result = true;
    $ext = substr( $url, -4 );

    if ( 
        $ext === '.jpg' || 
        $ext ===  '.JPG' ||
        $ext === 'jpeg' ||
        $ext === 'JPEG' ||
        $ext === '.png' ||
        $ext === '.PNG' ||
        $ext === '.gif' ||
        $ext === '.GIF' ||
        $ext === '.ico' ||
        $ext === '.ICO' 
     ) {
        if ( get_attachment_id_from_url( $url ) === 'null' ) {
            $result = false;
        }
    }

    return $result;

}

function get_attachment_id_from_url( $url ) {
    global $wpdb;

    $result = $wpdb->get_results( 'SELECT ID FROM ' . $wpdb->prefix . 'posts WHERE guid = "' . $url . '"' );


    if ( !empty( $result[0] ) ) {
        return $result[0]->ID;  
    } else {
        return false;
    }

}
    
respondido por el heller_benjamin 23.03.2017 - 06:42
3

Debe conocer la configuración actual de la dimensión de la miniatura de su sitio para que pueda detectar si el $ url es del tamaño de la miniatura.

$thumbnail_width = get_option( 'thumbnail_size_w' );
$thumbnail_height = get_option( 'thumbnail_size_h' );

// The do detection
// Assuming you have the image $url

$pattern = '%' . $thumbnail_width . 'x' . $thumbnail_height . '%';

if ( preg_match( $pattern, $url ) ) {
    // do your stuff here ...
}
    
respondido por el Irene Mitchell 18.03.2017 - 14:10
1

Aquí hay otros dos enfoques que podrían o no ser adecuados para su caso:

Enfoque # 1

Tomemos el tamaño de 300x200 por ejemplo:

https://example.tld/wp-content/2017/03/vatnajokull-300x200.jpg

Entonces, aquí hay una forma de cómo podemos verificar si es realmente parte de la biblioteca de medios:

  1. Quita la parte -\d+x\d+ del nombre del archivo para que se convierta en:

    $url = 'https://example.tld/wp-content/2017/03/vatnajokull.jpg';
    
  2. Use la función básica $attachment_id = attachment_url_to_postid( $url ) para obtener el ID de archivo adjunto posible.

  3. Use el ID de archivo adjunto de la parte 2. para obtener los metadatos con $meta = wp_get_attachment_metadata( $attahcment_id ) que contiene todo el contenido generado tamaños de imagen. Obtiene el valor meta _wp_attachment_metadata .
  4. Verifique si el tamaño 300x200 se ha generado al mirar la matriz de metadatos de tamaños (es decir, $meta['sizes'] ) y, por ejemplo, file_exists( $path ) para asegurarse de que realmente existe.

Espero que puedas completar las partes faltantes ;-)

Enfoque # 2

El núcleo utiliza una búsqueda con comodín LIKE en los valores meta _wp_attachment_metadata , dentro de wp_delete_attachment() ( source ), para ver si otros archivos adjuntos lo utilizan como pulgar, antes de eliminarlo. Esto podría funcionar aquí, pero sería menos preciso ya que busca en matrices serializadas. Se parece a esto en el núcleo:

if ( ! $wpdb->get_row( 
    $wpdb->prepare( 
        "SELECT meta_id FROM $wpdb->postmeta 
         WHERE meta_key = '_wp_attachment_metadata' 
             AND meta_value LIKE %s 
             AND post_id <> %d", 
        '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', 
        $post_id
    )
) ) {
    
respondido por el birgire 19.03.2017 - 19:02

Lea otras preguntas en las etiquetas