Làm cách nào để đặt hình ảnh nổi bật (hình thu nhỏ) theo URL hình ảnh khi sử dụng wp_insert_post ()?


61

Khi xem qua mục tham chiếu chức năng cho wp_insert_post () , tôi nhận thấy rằng không có tham số nào trong mảng mà nó yêu cầu sẽ cho phép tôi đặt 'Hình ảnh nổi bật' cho bài đăng, được hiển thị dưới dạng hình thu nhỏ của bài đăng trong chủ đề của tôi.

Tôi đã xem xét các hàm như set_post_thumbnail () , như đề xuất của ông Bennett, nhưng đây dường như là một bổ sung tương đối mới cho chính WordPress và codex WordPress. Như vậy, không có bất kỳ nguồn nào mà tôi có thể tìm thấy giải thích cách thu thập và cung cấp tham số $ USB_id. Nếu đây thực sự là chức năng để sử dụng, theo cách nào tôi có thể cung cấp cho nó một tham số $ USB_id hợp lệ khi tất cả những gì tôi có là một URL hình ảnh?

Cảm ơn trước!

Câu trả lời:


107

Bạn có thể đặt hình ảnh dưới dạng hình thu nhỏ của bài đăng khi nó nằm trong thư viện phương tiện của bạn. Để thêm một hình ảnh trong thư viện phương tiện của bạn, bạn cần tải nó lên máy chủ của bạn. WordPress đã có chức năng đưa hình ảnh vào thư viện phương tiện của bạn, bạn chỉ cần một tập lệnh tải lên tệp của mình.

Sử dụng:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

Chức năng:

function Generate_Featured_Image( $image_url, $post_id  ){
    $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, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


EDIT: Đã thêm đường dẫn

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


Cảm ơn sự nỗ lực của bạn! Tuy nhiên, điều này chỉ hoạt động khi sử dụng $ upload_dir ['Dựair'] (chứ không phải đường dẫn), vì khi tôi kiểm tra tệp đính kèm qua giao diện chỉnh sửa bài đăng, nó được tham chiếu là ... / uploads / FILENAME.EXT trong khi $ upload_dir ['path' ] sẽ lưu trữ nó trong một cái gì đó như ... / tải lên / 2012/02 / FILENAME.EXT. Có thể tốt hơn nữa bằng cách nào đó thay đổi cách tệp được tham chiếu, nhưng tôi không biết làm thế nào.
Chris

1
Thêm đường dẫn tạo trong câu trả lời của tôi.
Rob Vermeer

Đánh giá cao phản ứng nhanh chóng của bạn :). Tuy nhiên, tôi vẫn nhận được kết quả tương tự, đây là một ảnh chụp màn hình hiển thị vấn đề của tôi: i.imgur.com/iKTNs.png . Phần trên là kết quả của việc đặt một tiếng vang trong điều kiện của bạn, chỉ để xem những gì đang xảy ra.
Chris

Đã thay đổi một lần nữa, không chuyển đường dẫn đầy đủ đến wp_insert_attachment và wp_generate_attachment_metadata. Hy vọng điều này sẽ giải quyết vấn đề.
Rob Vermeer

1
Cảnh báo: Câu trả lời này viết lại tập tin nếu nó có cùng tên, hãy cẩn thận. Nó sẽ tạo tên bằng cách sử dụng $ post_id hoặc ít nhất là uniqid ()
Ivan Castellanos

10

Hãy thử sử dụng set_post_thumbnail().

Chỉnh sửa bởi Otto: Bạn đã làm rõ câu hỏi của mình, vì vậy tôi sẽ làm rõ câu trả lời mà Chip đưa ra.

Về cơ bản, bạn cũng cần tạo 'tệp đính kèm' cho bài đăng. Khi một hình ảnh được tải lên thư viện phương tiện WordPress, một mục đăng bài đặc biệt được tạo cho nó với một loại bài đăng đính kèm. Tệp đính kèm này được liên kết với một số bài đăng cụ thể thông qua định danh post_parent.

Vì vậy, nếu bạn biết ID của tệp đính kèm, sau đó gọi set_post_thumbnail với đối tượng bài đăng hoặc ID và ID tệp đính kèm sẽ chỉ đơn giản đặt cờ hình thu nhỏ của bài đăng.

Nếu bạn chưa tạo tệp đính kèm, thì bạn sẽ cần phải làm điều đó trước. Cách dễ nhất để làm điều đó là với wp_insert_attachment(). Hàm này có một mảng gồm một vài tham số, tên tệp (tệp phải có trong thư mục tải lên thích hợp) và ID bài đăng của bài đăng gốc mà bạn muốn đính kèm tệp đính kèm.

Chỉ cần có một tệp được tải lên và đính kèm vào một bài đăng sẽ không làm gì tự động. Đây chỉ đơn giản là một loại cơ chế phân loại. Ví dụ, cơ chế thư viện sử dụng các hình ảnh đính kèm của bài đăng để xây dựng [thư viện] cho bài đăng đó. Hình thu nhỏ cho bài đăng chỉ là một trong những hình ảnh đính kèm được đặt thành hình thu nhỏ.

Thông tin thêm về cách sử dụng wp_insert_attachment có thể được tìm thấy trong codex (được liên kết ở trên).


Cảm ơn bạn đã trả lời của bạn! Làm thế nào tôi có thể lấy lại ID hình thu nhỏ? Tôi đang bắt đầu với một URL hình ảnh, vì vậy tôi đoán rằng bằng cách nào đó tôi nên thêm một hình ảnh vào thư viện wordpress bằng một chức năng khác?
Chris

Vì bạn đã chèn một bài đăng, tôi đã giả sử rằng bạn đã đính kèm hình ảnh vào bài đăng bạn đang chèn. Đó không phải là một giả định hợp lệ?
Chip Bennett

Xin lỗi, nhưng tôi chưa tìm ra cách thực sự đính kèm hình ảnh vào bài đăng bằng URL. Ngoài ra, tôi sẽ không muốn hình ảnh thực sự được hiển thị trong chính bài đăng. Tôi hiện đang tìm kiếm hàm sẽ trả về $ Thumb_id và nghĩ rằng có thể wp_insert_attachment () sẽ hoạt động, cho đến khi tôi nhận thấy nó đã yêu cầu tệp đính kèm phải có trong thư mục tải lên. Tôi không biết làm thế nào để có được một tệp hình ảnh ở đó bằng URL của nó và tôi không chắc liệu đây có phải là chức năng tôi đang tìm kiếm ở nơi đầu tiên không. Cảm ơn sự giúp đỡ của bạn!
Chris

Bạn có thể vui lòng viết lại câu hỏi của bạn với thông tin này, để mô tả rõ hơn những gì bạn đang cố gắng thực hiện không? (Hoặc, để nguyên câu hỏi này và bắt đầu một câu hỏi mới, để hỏi cách lấy ID tệp đính kèm khi chèn bài đăng?)
Chip Bennett

Câu hỏi ban đầu đã được chỉnh sửa và một phần được đăng lại, vui lòng kiểm tra lại :).
Chris

9

Tôi muốn cải thiện câu trả lời của Rob bằng cách sử dụng các chức năng cốt lõi của WP download_urlmedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $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 set_post_thumbnail( $post_id, $id );

}

1
Sử dụng các chức năng riêng của WordPress là cách thực hành tốt nhất, Cảm ơn bạn.
Mostafa Soufi

Vì một số lý do, phiên bản này đã cho tôi lỗi khi nói rằng "Một URL hợp lệ không được cung cấp." , trong khi câu trả lời của Rob Vermerer đã có hiệu quả.
Flimm

3

set_post_thumbnail() là chức năng tốt nhất cho yêu cầu này.

Tôi nghĩ rằng, bạn tìm thấy ID của một tệp đính kèm thông qua get_children()hoặc get_posts(). Kết quả có một mảng và bên trong mảng này là ID. Ví dụ sau để thử nghiệm; Tôi hy vọng nó hoạt động; viết mà không cần kiểm tra, chỉ trên đầu.

Đối với yêu cầu của bạn, điều quan trọng là bạn thay đổi get_the_ID()với post-ID; trả lại ID của Tài liệu đính kèm và bạn có thể sử dụng foth set_post_thumbnail().

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}

3

Chỉ cần tìm thấy điều này và làm cho nó đơn giản hơn nhiều, hoạt động nhưng tôi không có trình kiểm tra bảo mật

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

đơn giản hay sao? Sau khi nhận được đúng tệp, wordpress sẽ xử lý phương tiện và tải nó lên, sau đó đặt nó làm hình thu nhỏ.

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.