Es un caso común para migraciones en wordpress. Necesitamos que imágenes que están en una URL externa, quizá otro wordpress, se importen a la carpeta 'uploads' y que se genere correctamente un attachment de wordpress con sus metadatos, de manera que sea navegable desde la media gallery y se pueda asociar a un post. A esto le podemos añadir el comprobar que la imagen no exista ya para evitar trabajo redundante e innecesario.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
 *  Helper function to set the post title of an attachment
 *
 *  @param String $filename Name of the file, for instance 'Attachment Example.jpg'
 *
 *  @return String A valid post title for the attachment related to that filename, for instance 'attachment-example'
 */
function attachment_post_title($filename)
{
    return sanitize_title(
        substr(
            $filename,
            0,
            strrpos($filename, ".")
        )
    );
}

/**
 *  Helper function to download an image to uploads folder from a remote URL
 *
 *  @param String $url Absolute URL of remote asset
 *  @param String $date Date of the attachment in the WP default format 'yyyy-mm-dd hh:mm:ss'
 *  @param Integer $parent_id (optional) Id of the parent post
 *
 *  @return Integer $attach_id Id of the newly created attachment
 */
function insert_attachment_from($url, $date, $author=null, $parent_id=null)
{
    // Get URL and check the content type
    $get  = wp_remote_get($url);
    $type = wp_remote_retrieve_header($get, 'content-type');
    if(!$type) return false;

    // Get filename and post title
    $filename = basename($url);
    $title    = attachment_post_title($filename);

    // Check if file exists already
    if( post_exists($title, null, null, 'attachment') )
    {
        WP_CLI::log("File '" . $filename . "' exists already");
        $attach_id = get_page_by_title(
            $title,
            'OBJECT',
            'attachment'
        )->ID;
    } else {
        WP_CLI::log("Creating file '".$filename."' of type '".$type."'");
        // Create file in '/wp-content/uploads/YYYY/MM'
        $mirror = wp_upload_bits(
            $filename, '',
            wp_remote_retrieve_body($get),
            date('Y/m', strtotime($date))
        );
        // Create post of 'attachment' post type, linked to the media file
        $attachment_args = [
           'post_title'     => $title,
           'post_mime_type' => $type,
           'post_date'      => $date,
           'post_content'   => '',
           'post_status'    => 'inherit'
        ];
        if($author)
          $attachment_args['post_author'] = $author;
        if($parent_id)
          $attachment_args['post_parent'] = $parent_id;
        $attach_id = wp_insert_attachment(
            $attachment_args,
            $mirror['file']
        );
        // Set attachment metadata to be displayed in WP media gallery
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata(
            $attach_id,
            $mirror['file']
        );
        wp_update_attachment_metadata(
            $attach_id,
            $attach_data
        );
    }
    return $attach_id;
 }