Nhận $ image_id sau khi tải lên với media_sideload_image ()


10

Tôi muốn tải lên một hình ảnh và đặt nó như một hình ảnh đặc trưng trong một bài đăng. Những gì tôi đã cố gắng là thế này:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

Nhưng media_sideload_image()không phải là trả về image_id, mà là hình ảnh html kết xuất. Làm thế nào tôi có thể nhận được image_id?

Câu trả lời:


28

Dưới đây là một ví dụ về cách vượt qua giới hạn này bằng hành động / hook:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

Ý tưởng là khi media_sideload_imageđược chạy, nó:

  • tải hình ảnh
  • thêm nó như một tập tin đính kèm (một bài kiểu attachment)
  • sau đó đính kèm tệp đính kèm đó vào bài đăng có ID bạn đã cung cấp ($ post_id)

Vấn đề của bạn là nó không cung cấp ID bài đăng đính kèm mới được tạo.

Nhưng , khi một tệp đính kèm được tạo, một hành động được thực hiện có chứa ID của nó. Chúng tôi có thể kết nối điều này trước khi chúng tôi tạo tệp đính kèm và lưu hình thu nhỏ nổi bật với ID bài đăng mà nó đã cung cấp cho chúng tôi, sau đó mở ra sau đó.


1
Xuất sắc! Điều đó đã giúp rất nhiều.
m-torin

2
Nếu điều này trả lời câu hỏi của bạn, bạn có thể đánh dấu nó là chính xác?
Tom J Nowell

Tôi không thể đọc tiếng Anh của bạn. Ai đó có thể chỉnh sửa bài này?
HiDd3N

2
@ HiDd3N Tôi đã đơn giản hóa một số tiếng Anh được sử dụng, nó nên có những từ phổ biến hơn với độ tuổi đọc thấp hơn
Tom J Nowell

6

Tôi đã xây dựng một chức năng để lấy ID từ DB, tìm kiếm theo URL.

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

Bạn có thể nhận URL (theo mã html) với tham số thứ tư được đặt thành 'src' Codex: media_sideload_image ()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);


4

Câu trả lời của @Tom J Nowell là tại chỗ. Tôi tìm thấy một sự thay thế khác (sử dụng các chức năng khác nhau) được giải thích ở đây nhưng tôi thích cái này hơn.

Trong trường hợp của tôi, tôi có một mảng các bài đăng $ với tất cả các bài đăng tôi muốn chèn và một phương tiện $ media riêng (cùng khóa $ nid như $ bài đăng) với phương tiện truyền thông. Mã của tôi là giải pháp tương tự như của Tom nhưng được tái cấu trúc để sử dụng hàm ẩn danh:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

Trong trường hợp của tôi, tôi giả sử mục đầu tiên trong mỗi $ media [$ nid] sẽ là hình ảnh đặc trưng của bài đăng của nó.

WordPress shouold chắc chắn thay đổi media_sideload_image () để nó trả về $ id. Trong thực tế chức năng có nó trong tay, xem nguồn ở đây . Trong thực tế, có một vé theo dõi cho điều này và họ thậm chí có các bản vá để áp dụng điều này vào cốt lõi của bạn trong thời gian trung bình nếu bạn muốn.


Có vẻ như dự kiến ​​sẽ được vá trong 4,8
Tom Auger

3

Tôi đang tìm kiếm một giải pháp và quyết định xem xét mã media_sideload_image()rất đơn giản. Nó sử dụng media_handle_sideload()mà cung cấp cho chúng tôi các tập tin đính kèm id.

Tôi đã sửa đổi nó để trả về tệp đính kèm idthay vì nguồn html của hình ảnh và thậm chí đã thêm một cách để gửi tên tệp mới.

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // do the validation and storage stuff
        $id = media_handle_sideload( $file_array, $post_id, $desc );

        // If error storing permanently, unlink
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
        }
        return $id;
    }
    return null;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.