Programmgesteuertes Hinzufügen von Bildern zur Medienbibliothek

10

Ich versuche, programmgesteuert mehrere Bilder zur Medienbibliothek hinzuzufügen. Ich habe die Bilder hochgeladen und wp-content/uploadsversuche sie jetzt zu verwenden wp_insert_attachement.

Hier ist der Code, der jedoch nicht wie erwartet funktioniert. Ich denke, Metadaten werden nicht ordnungsgemäß generiert. Ich kann die Dateien in der Medienbibliothek anzeigen, aber ohne Miniaturansicht. Auch wenn ich das Bild bearbeite, wird eine Fehlermeldung angezeigt, dass das Bild erneut hochgeladen werden soll .

$filename_array = array(
   'article1.jpg',
   'article2.jpg',
);

// The ID of the post this attachment is for.
$parent_post_id = 0;

// Get the path to the upload directory.
$wp_upload_dir = wp_upload_dir();

foreach ($filename_array as $filename) {

    // Check the type of file. We'll use this as the 'post_mime_type'.
    $filetype = wp_check_filetype( basename( $filename ), null );

    // Prepare an array of post data for the attachment.
    $attachment = array(
        'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ), 
        'post_mime_type' => $filetype['type'],
        'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
        'post_content'   => '',
        'post_status'    => 'inherit'
    );

    // Insert the attachment.
    $attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id );

    // Make sure that this file is included, as   wp_generate_attachment_metadata() depends on it.
    require_once( ABSPATH . 'wp-admin/includes/image.php' );

    // Generate the metadata for the attachment, and update the database record.
    $attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
    wp_update_attachment_metadata( $attach_id, $attach_data );

}
Adrian
quelle

Antworten:

10
$image_url = 'adress img';

$upload_dir = wp_upload_dir();

$image_data = file_get_contents( $image_url );

$filename = basename( $image_url );

if ( wp_mkdir_p( $upload_dir['path'] ) ) {
  $file = $upload_dir['path'] . '/' . $filename;
}
else {
  $file = $upload_dir['basedir'] . '/' . $filename;
}

file_put_contents( $file, $image_data );

$wp_filetype = wp_check_filetype( $filename, null );

$attachment = array(
  'post_mime_type' => $wp_filetype['type'],
  'post_title' => sanitize_file_name( $filename ),
  'post_content' => '',
  'post_status' => 'inherit'
);

$attach_id = wp_insert_attachment( $attachment, $file );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
$attach_data = wp_generate_attachment_metadata( $attach_id, $file );
wp_update_attachment_metadata( $attach_id, $attach_data );
TrubinE
quelle
1
Woher kommt $ attach_id?
Dan Hastings
es fehlte ... ich fügte es hinzu
Omtara
1
Datei heruntergeladen, aber keine Miniaturansicht verfügbar, Anhang URL gibt auch 404
Umair Hamid
@UmairHamid Gleich hier. Dies liegt daran, dass das zweite Argument von wp_insert_attachmentder Dateipfad sein sollte (also $filein diesem Beispiel), nicht der Dateiname. Ich habe die Antwort bearbeitet und auf die Genehmigung gewartet.
philippe_b
und wie kann ich die neue url bekommen?
iKamy
2

Ich hatte Probleme mit der @ TrubinE-Lösung, bei der Bilddateien nicht geladen wurden.

Hier ist ein vollständiges Beispiel, das für mich funktioniert hat: https://gist.github.com/m1r0/f22d5237ee93bcccb0d9

Dies ist eine ähnliche Idee, aber verwenden Sie die WP-HTTP-Bibliothek, um den Inhalt im Vergleich zu file_get_contents () abzurufen. Hier ist der Inhalt der Github-Kernlösung von m1r0:

        if( !class_exists( 'WP_Http' ) )
        include_once( ABSPATH . WPINC . '/class-http.php' );
    $http = new WP_Http();
    $response = $http->request( $meta[ 'image_url' ] );
    if( $response['response']['code'] != 200 ) {
        return false;
    }
    $upload = wp_upload_bits( basename($meta[ 'image_url' ]), null, $response['body'] );
    if( !empty( $upload['error'] ) ) {
        return false;
    }
    $file_path = $upload['file'];
    $file_name = basename( $file_path );
    $file_type = wp_check_filetype( $file_name, null );
    $attachment_title = sanitize_file_name( pathinfo( $file_name, PATHINFO_FILENAME ) );
    $wp_upload_dir = wp_upload_dir();

    $post_info = array(
        'guid'           => $wp_upload_dir['url'] . '/' . $file_name,
        'post_mime_type' => $file_type['type'],
        'post_title'     => $attachment_title,
        'post_content'   => '',
        'post_status'    => 'inherit',
    );

    $attach_id = wp_insert_attachment( $post_info, $file_path, $parent_post_id );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file_path );
    wp_update_attachment_metadata( $attach_id,  $attach_data );
    return $attach_id; code here
Lance Cleveland
quelle
Perfekt, danke
Rob