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 );

}

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 );

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

Perfekt, danke
Rob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.