wp_insert_post ()를 사용할 때 이미지 URL별로 추천 이미지 (축소판)를 설정하려면 어떻게합니까?


61

관통 보면서 wp_insert_post ()에 대한 함수 참조 항목 , 나는 나에게로 표시되는 게시물에 대한 '추천 이미지'설정 할 수 있습니다 그것을 필요로 배열에는 매개 변수가 없습니다 것으로 나타났습니다 게시물 섬네일 내 테마를.

Bennett이 제안한대로 set_post_thumbnail () 과 같은 기능을 살펴 보았지만 이는 WordPress 자체와 WordPress 코덱에 비교적 새로운 기능인 것 같습니다. 따라서 $ thumbnail_id 매개 변수를 획득하고 제공하는 방법을 설명하는 소스는 없습니다. 이것이 실제로 사용할 함수라면 이미지 URL 만 있으면 어떤 방법으로 유효한 $ thumbnail_id 매개 변수를 제공 할 수 있습니까?

미리 감사드립니다!

답변:


107

미디어 라이브러리에있을 때 이미지를 게시물 축소판으로 설정할 수 있습니다. 미디어 라이브러리에 이미지를 추가하려면 이미지를 서버에 업로드해야합니다. WordPress에는 이미 미디어 라이브러리에 이미지를 넣는 기능이 있으므로 파일을 업로드하는 스크립트 만 있으면됩니다.

용법:

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

기능:

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


편집 : 경로 생성 추가

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


당신의 노력에 감사드립니다! 포스트 편집 인터페이스를 통해 첨부 파일을 검사 할 때 ... / uploads / FILENAME.EXT 동안 $ upload_dir [ 'path'참조되므로 경로가 아닌 $ upload_dir [ 'basedir']을 사용할 때만 작동합니다. ]는 ... / uploads / 2012 / 02 / FILENAME.EXT와 같은 곳에 저장합니다. 어떻게 든 파일 참조 방법을 변경하는 것이 더 좋을지 모르지만 방법을 모르겠습니다.
Chris

1
내 답변에 경로 생성을 추가했습니다.
Rob Vermeer

빠른 답변 감사합니다 :). 여전히 동일한 결과를 얻지 만 i.imgur.com/iKTNs.png 문제를 보여주는 스크린 샷이 있습니다. 상단 섹션은 상황에 에코를 배치하여 결과를 확인하기위한 결과입니다.
Chris

다시 변경하여 wp_insert_attachment 및 wp_generate_attachment_metadata의 전체 경로를 전달하지 않았습니다. 이것이 문제를 해결하기를 바랍니다.
Rob Vermeer

1
경고 :이 응답은 동일한 이름을 가진 파일을 다시 쓰므로주의하십시오. 그것은 $ post_id를 적어도 uniqid ()를 사용하여 이름을 생성한다
이반 카스텔라

10

를 사용해보십시오 set_post_thumbnail().

오토에 의해 편집 : 당신은 당신의 질문을 명확하게, 그래서 칩이 준 응답을 명확하게합니다.

기본적으로 게시물에 대한 '첨부 파일'도 만들어야합니다. 이미지가 WordPress 미디어 라이브러리에 업로드되면 게시물 유형의 첨부 파일이있는 특별한 게시물이 작성됩니다. 이 첨부 파일은 post_parent 식별자를 통해 특정 게시물에 연결됩니다.

따라서 첨부 파일의 ID를 알고 있다면 게시 개체 또는 ID와 첨부 파일 ID로 set_post_thumbnail을 호출하면 단순히 게시 축소판 플래그가 설정됩니다.

첨부 파일을 아직 작성하지 않은 경우 먼저 첨부 파일을 작성해야합니다. 가장 쉬운 방법은입니다 wp_insert_attachment(). 이 함수는 몇 개의 매개 변수, 파일 이름 (파일이 이미 올바른 업로드 디렉토리에 있어야 함) 및 첨부 파일을 첨부 할 상위 게시물의 게시물 ID로 구성됩니다.

파일을 업로드하여 게시물에 첨부해도 자동으로 아무 작업도 수행되지 않습니다. 이것은 단순히 일종의 분류 메커니즘입니다. 예를 들어 갤러리 메커니즘은 첨부 된 게시물 이미지를 사용하여 해당 게시물에 대한 [갤러리]를 만듭니다. 게시물의 미리보기 이미지는 미리보기 이미지로 설정된 첨부 된 이미지 중 하나 일뿐입니다.

wp_insert_attachment 사용 방법에 대한 자세한 내용은 코덱 (위 링크)에서 찾을 수 있습니다.


당신의 답변에 감사드립니다! 그래도 썸네일 ID를 어떻게 검색합니까? 이미지 URL로 시작하므로 다른 기능을 사용하여 워드 프레스 라이브러리에 이미지를 추가해야한다고 생각합니까?
Chris

이미 게시물을 삽입 하고 있으므로 삽입 중인 게시물에 이미 이미지첨부 하고 있다고 가정했습니다 . 유효한 가정이 아닙니까?
Chip Bennett

죄송하지만 URL로 게시물에 실제로 이미지를 첨부하는 방법을 아직 찾지 못했습니다. 또한 이미지가 실제로 게시물 자체에 표시되기를 원하지 않습니다. 나는 현재 $ thumbnail_id를 반환하는 함수를 찾고 있는데, 이미 첨부 파일이 업로드 디렉토리에 있어야한다는 것을 알 때까지 wp_insert_attachment ()가 작동한다고 생각했습니다. URL로 이미지 파일을 얻는 방법을 모르겠으며, 이것이 내가 처음 찾는 기능인지 확실하지 않습니다. 도와 주셔서 감사합니다!
Chris

달성하려는 내용을 더 잘 설명하기 위해이 정보로 질문다시 작성할 수 있습니까 ? (또는 게시물을 삽입 할 때 첨부 파일 ID를 얻는 방법을 묻기 위해이 질문을 그대로두고 새로운 질문을 시작 하시겠습니까?)
Chip Bennett

원래 질문이 수정되어 부분적으로 다시 표시되었습니다. :)을 다시 확인하십시오.
Chris

9

나는 WP의 핵심 기능을 이용하여 훔치는 응답을 개선하고자 download_url하고media_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
WordPress 기본 기능을 사용하는 것이 가장 좋습니다. 감사합니다.
Mostafa Soufi

어떤 이유로이 버전에서 "유효한 URL이 제공되지 않았습니다"라는 오류가 발생했습니다. 반면 롭 베르메르의 대답 했다.
Flimm

3

set_post_thumbnail() 이 요구 사항에 가장 적합한 기능입니다.

나는 당신을 통해 첨부 파일의 ID를 찾을 생각 get_children()이나 get_posts(). 결과는 배열을 가지며이 배열 내부는 ID입니다. 테스트를위한 다음 예제; 나는 그것이 효과가 있기를 바랍니다. 테스트하지 않고 처음부터 작성하십시오.

귀하의 요구를 들어 당신이 변경하는 것이 중요하다 get_the_ID()당신과 post-ID; 첨부 파일의 ID를 반환하면 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

방금 이것을 발견하고 훨씬 간단하게 만들었지 만 보안 스크러버는 아닙니다.

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

간단하거나 무엇? 올바른 파일을 얻은 후 워드 프레스는 미디어를 처리하고 업로드 한 다음 축소판으로 설정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.