¿Cómo encontrar un archivo adjunto por su nombre?

8 oct 2013, 08:57:06
Vistas: 38.5K
Votos: 6

¿Es posible obtener el ID de un archivo adjunto por su nombre? Y de una vez, ¿es posible obtener la publicación principal a la que está asignado este archivo adjunto?

4
Comentarios

@Wyck, simplemente no pude encontrar ninguna función para encontrar un archivo por su nombre.

Kirix Kirix
8 oct 2013 09:16:50

Reforzando lo que dice Wyck, porque al buscar en Google "wordpress get attachment id from guid" o "wordpress get attachment id from name" aparecen varias soluciones.

helgatheviking helgatheviking
8 oct 2013 12:04:17

@helgatheviking ¿y lo probaste o solo buscaste en Google?

Kirix Kirix
8 oct 2013 13:28:34

No lo intenté. Mi punto era que Wyck preguntó qué habías probado y que hay muchas funciones disponibles para que pruebes. Si nos puedes decir qué has intentado y exactamente qué no está funcionando, podemos ayudarte a ajustarlo. Además, hilos de soporte como http://wordpress.org/support/topic/need-to-get-attachment-id-by-image-url están marcados como resueltos, por lo que alguien debió pensar que la solución era válida.

helgatheviking helgatheviking
8 oct 2013 13:45:23
Todas las respuestas a la pregunta 6
8
12

Tienes que escribir código personalizado para obtener el ID del adjunto y el post_parent por nombre/slug o nombre del archivo (si no ha sido cambiado durante la subida de archivos).

Coloca el siguiente código en el archivo functions.php de tu tema:

if( ! ( function_exists( 'wp_get_attachment_by_post_name' ) ) ) {
    function wp_get_attachment_by_post_name( $post_name ) {
            $args           = array(
                'posts_per_page' => 1,
                'post_type'      => 'attachment',
                'name'           => trim( $post_name ),
            );

            $get_attachment = new WP_Query( $args );

            if ( ! $get_attachment || ! isset( $get_attachment->posts, $get_attachment->posts[0] ) ) {
                return false;
            }

            return $get_attachment->posts[0];
    }
}

Luego puedes llamar a la función donde la necesites de la siguiente manera:

$attachment = wp_get_attachment_by_post_name( $post_name );
// Reemplaza post_name por el nombre/slug del adjunto
// Te dará un objeto, el cual puedes usar como se muestra a continuación para obtener el ID y post_parent
if ( $attachment ) {
    echo $attachment->ID; // Devuelve el ID del adjunto
    echo $attachment->post_parent; // Devuelve el ID del post_parent
    echo $attachment->post_title; // Devuelve el título del adjunto.
}
8 oct 2013 11:34:09
Comentarios

no tengo el nombre de la publicación, solo tengo el nombre del archivo

Kirix Kirix
8 oct 2013 11:50:07

ok, por nombre pensé que te referías al nombre de la publicación

Maruti Mohanty Maruti Mohanty
8 oct 2013 12:06:38

Puedes intentar usar el nombre del archivo en lugar del post_name como parámetro, ya que WordPress crea el slug para el adjunto con el nombre del archivo a menos que sea modificado.

Maruti Mohanty Maruti Mohanty
8 oct 2013 12:46:20

no funciona....

user1692333 user1692333
8 oct 2013 22:57:35

@user1692333 ¿Podrías explicar tu situación donde este fragmento no funciona? y hagamos que funcione

Maruti Mohanty Maruti Mohanty
9 oct 2013 08:38:01

lo hice de una manera más simple, solo usé wp_query con búsqueda y obtuve de ahí el ID del post.

user1692333 user1692333
10 oct 2013 00:14:24

¡¡¡Genial!!! ¿Por qué no publicas lo que hiciste?

Maruti Mohanty Maruti Mohanty
17 oct 2013 09:51:24

usar el namespace wp_ para funciones que no son de WordPress es una mala práctica

Toskan Toskan
12 oct 2016 23:10:07
Mostrar los 3 comentarios restantes
0

Otro enfoque posible es usar directamente $wpdb para realizar una consulta SQL, en la tabla de posts, con el título del post buscado y con post_type "attachment".

function get_attachment_url_by_title( $title ) {
    global $wpdb;

    $attachments = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_title = '$title' AND post_type = 'attachment' ", OBJECT );
    //print_r($attachments);
    if ( $attachments ){

        $attachment_url = $attachments[0]->guid;

    }else{
        return 'image-not-found';
    }

    return $attachment_url;
}
// uso:
get_attachment_url_by_title('tu_titulo_de_imagen');

Ten en cuenta que este código devolverá el primer adjunto con este título.


Forma alternativa, sin consulta SQL. Mejor en la mayoría de los casos:

function get_attachment_url_by_title( $title ) {

$attachment = get_page_by_title($title, OBJECT, 'attachment');
//print_r($attachment);

  if ( $attachment ){

    $attachment_url = $attachment->guid;

  }else{
    return 'image-not-found';
  }

  return $attachment_url;
}

echo get_attachment_url_by_title('tu_titulo_de_imagen');
29 ago 2016 17:45:52
0

get_page_by_title() hará el trabajo.

Con una URL completa como título:

get_page_by_title( pathinfo( 'https://www.example.com/file.jpg' )['filename'], "OBJECT", 'attachment' );

Devuelve un objeto WP_Post o Null, si no se encontraron posts/adjuntos.

12 mar 2018 14:59:43
0

Basado en el Código de WordPress,

'attachment' - un adjunto. Mientras que el post_status predeterminado de WP_Query es 'publish', los adjuntos tienen un post_status predeterminado de 'inherit'. Esto significa que no se devolverán adjuntos a menos que también establezca explícitamente post_status como 'inherit' o 'any'. (Ver post_status, abajo)

31 dic 2016 06:39:17
3

Acabo de pasar un par de horas intentando resolver este mismo problema. Había un nombre de archivo que get_page_by_title no podía encontrar. Adapté la respuesta de @Snade para mis propósitos.

Solo tengo el nombre del archivo y necesito obtener la URL de la imagen desde la biblioteca de medios. Snade estuvo muy cerca, pero incluso así su función no funcionó en mis circunstancias. La función que proporcionó me llevó en la dirección correcta.

Esta solución que estaré probando, parece funcionar. Básicamente todo lo que necesito es encontrar el nombre del archivo en el guid. Como el título eliminó la extensión y añadió espacios, no pude encontrar esta imagen de otra manera.

A hacer más pruebas...

function get_attachment_url_by_guid( $filename ) {
        global $wpdb;

        $ext = array(".png", ".jpg", ".gif", ".jpeg");
        $filename = str_replace($ext, "", $filename);
        $clean_filename = trim(html_entity_decode(sanitize_title($filename)));

    
        $attachments = $wpdb->get_results( "SELECT guid FROM $wpdb->posts WHERE guid LIKE '%$clean_filename%' AND post_type = 'attachment' ", OBJECT );
        //print_r($attachments);
        if ( $attachments ){    
            $attachment_url = $attachments[0]->guid;    
        }else{
            return 'image-not-found';
        }   
        return $attachment_url;
}
4 sept 2020 06:25:39
Comentarios

Sería mejor usar $wpdb->prepare para la consulta get_results @Robbiegod

Tami Tami
20 ene 2021 23:22:43

¡Tienes toda la razón! @Tami Pero este código solo está dentro de un plugin que no se distribuye. Solo es un plugin personalizado para mi sitio. Lo actualizaré en el futuro. Buen apunte.

Robbiegod Robbiegod
9 feb 2021 18:39:38

¡De acuerdo @Robbiegod! También encontré útil tu respuesta :)

Tami Tami
11 feb 2021 02:58:11
0

He tenido que dedicar demasiado tiempo a esto ya que algunas de las soluciones anteriores funcionan en ciertos casos pero no en otros. El punto clave es para archivos adjuntos subidos con una resolución mayor a 2560px. WordPress añade '-scaled' al nombre de archivo devuelto por get_attached_file(), pero esto no se refleja en la columna 'guid' de la base de datos.

Al final, analicé el código de get_attached_file() y desarrollé la siguiente solución:

/**
 * Obtiene el ID de un adjunto por su nombre de archivo
 * 
 * @param string $filename Nombre del archivo a buscar
 * @return int|false ID del adjunto o false si no se encuentra
 */
function get_attachment_id_by_filename($filename) {
    global $wpdb;
    $attachments = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file' AND meta_value like'%$filename'", OBJECT);
    return $attachments[0]->post_id ?? false;
}
26 abr 2022 08:13:31