[wp-hackers] Newbie Q - can't get get_children to work

Gaarai gaarai at gaarai.com
Sat Apr 11 23:25:03 GMT 2009


Most current blog editors are able to embed images just fine without 
requiring this workaround. For example, if you use Raven 
(http://www.zoundryraven.com/), the software will automatically upload 
the images first, replace the img tag parameters with data returned from 
the blog, and then publish the post.

Sticking with the topic as you may have your own reasons for pursuing 
this path... Just so you know, doing a lookup by file name is 
error-prone. File attachments do not have to have unique file names. If 
you upload the same file name back-to-back, the second upload will have 
a digit added just before the extension in order to make it unique. 
However, if files with the same name are uploaded during different 
months or years, the duplicate file names are allowed.

Of course, this behavior changes depending on the specific settings of 
the blog in question. For example, if the "Organize my uploads into 
month- and year-based folders" option is disabled, files will be given 
unique names.

With this limitation in mind, I've produced a very rough working 
function that will do what you want. The code is as follows:

    function get_image_from_file_name( $file_name, $size = 'medium' ) {
        global $wpdb;   

        // Protect against db exploits
        $file_name = addslashes( $file_name );   

        // Find the relevant record.
        // Since attachments are not guaranteed to have unique names,
        // find the oldest match. This prevents existing images from
        // being replaced accidentally by another image that is
        // uploaded with the same name.
        $image_id = $wpdb->get_var( "SELECT ID FROM {$wpdb->posts} WHERE post_type='attachment' AND guid LIKE '%/$file_name' ORDER BY post_date LIMIT 1" );    

        return image_downsize( $image_id, $size )
    }

An example of using this code is as follows:

    list( $image_src, $image_width, $image_height ) = get_image_from_file_name( 'my-dog.png', 'medium' );
    if ( ! empty( $image_src ) )
        echo "<img src='$image_src' width='$image_width' height='$image_height' alt='My Dog' />";

The default sizes offered by WP are thumbnail, medium, large, and full. 
These can be modified by plugins however.

Since running the function for each image that needs to be rendered on a 
page is expensive, I recommend using the function that I've provided 
here and latching a filter onto wp_insert_post_data that replaces the 
short tag that you had in a previous message with an actual img tag. 
Doing this will save a ton of needless db queries and could potentially 
simplify your template code.

If you end up creating this filter, the get_image_from_file_name 
function could be improved to first look for a match that has a post 
date close to that of the actual post and then reverting to the original 
functionality if one is not found. This would allow for using duplicate 
file names.

I hope that this helps you.

Chris Jean
http://gaarai.com/
http://wp-roadmap.com/



Jan Erik Moström wrote:
> On 09-04-11 at 21.15, Gaarai <gaarai at gaarai.com> wrote:
>
>> Am I correct in that you simply need to get the attachment details 
>> given a specific file name?
>
> What I need to be able to get is
>
> +   the different size versions for one image
>
> +   get url for those versions
>
> +   get image and height for those versions
>
> I have no need to write or in any way modify anything, just reading.
>
> And the only thing I have as input is the URL (or filename) to the 
> original image.
>
>                 jem


More information about the wp-hackers mailing list