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.