Jak ustawić wyróżniony obraz (miniaturę) według adresu URL obrazu przy użyciu wp_insert_post ()?

61

Przeglądając pozycję odniesienia funkcji dla wp_insert_post () , zauważyłem, że w wymaganej tablicy nie ma parametru, który pozwoliłby mi ustawić „Featured Image” dla posta, wyświetlanego jako miniatura postu w moim motywie.

Zajrzałem do funkcji takich jak set_post_thumbnail () , zgodnie z sugestią pana Bennetta, ale wydaje się, że jest to stosunkowo nowy dodatek do samego WordPressa i kodeksu WordPress. W związku z tym nie ma żadnych źródeł, które mogłyby wyjaśnić, w jaki sposób należy pobrać i podać parametr $ thumbnail_id. Jeśli tak naprawdę należy użyć tej funkcji, to w jaki sposób mogę podać jej prawidłowy parametr $ thumbnail_id, gdy wszystko, co mam, to adres URL obrazu?

Z góry dziękuję!

Chris
źródło

Odpowiedzi:

107

Możesz ustawić obraz jako miniaturę postu, gdy jest on w bibliotece multimediów. Aby dodać obraz z biblioteki multimediów, musisz załadować go na swój serwer. WordPress ma już funkcję umieszczania obrazów w bibliotece multimediów, potrzebujesz tylko skryptu, który prześle twój plik.

Stosowanie:

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

Funkcjonować:

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


EDYCJA: Dodano tworzenie ścieżki

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

Rob Vermeer
źródło
Dziękuję za Twój wysiłek! Działa to tylko wtedy, gdy używasz $ upload_dir ['basedir'] (zamiast ścieżki), ponieważ kiedy sprawdzam załącznik przez interfejs edycji postu, jest on określany jako ... / uploads / FILENAME.EXT, podczas gdy $ upload_dir ['path' ] umieściłby go w czymś takim jak ... / uploads / 2012/02 / FILENAME.EXT. Może nawet lepiej jest zmienić sposób odwoływania się do pliku, ale nie wiedziałbym, jak to zrobić.
Chris
1
Dodano tworzenie ścieżki w mojej odpowiedzi.
Rob Vermeer,
Doceń swoją szybką odpowiedź :). Nadal jednak otrzymuję ten sam wynik, oto zrzut ekranu pokazujący mój problem: i.imgur.com/iKTNs.png . Górna część jest wynikiem umieszczenia echa w warunku, aby zobaczyć, co się dzieje.
Chris
Zmieniono go ponownie, nie przekazano pełnej ścieżki do wp_insert_attachment i wp_generate_attachment_metadata. Mam nadzieję, że to rozwiąże problem.
Rob Vermeer
1
Ostrzeżenie: ta odpowiedź przepisuje plik, jeśli ma taką samą nazwę, uważaj. Powinien generować nazwy za pomocą $ post_id lub przynajmniej uniqid ()
Ivan Castellanos
10

Spróbuj użyć set_post_thumbnail().

Edytuj przez Otto: Wyjaśniłeś swoje pytanie, więc wyjaśnię odpowiedź, którą Chip udzielił.

Zasadniczo musisz również utworzyć „załącznik” do posta. Kiedy obraz jest przesyłany do biblioteki multimediów WordPress, tworzony jest dla niego specjalny wpis z załącznikiem typu posta. Ten załącznik jest powiązany z określonym postem za pomocą identyfikatora post_parent.

Więc jeśli znasz identyfikator załącznika, to wywołanie set_post_thumbnail za pomocą obiektu post lub identyfikatora i ID załącznika po prostu ustawi flagę miniatury postu.

Jeśli jeszcze nie utworzyłeś załącznika, musisz to zrobić najpierw. Najłatwiej to zrobić za pomocą wp_insert_attachment(). Ta funkcja pobiera tablicę kilku parametrów, nazwę pliku (plik musi już znajdować się w odpowiednim katalogu do przesyłania) oraz identyfikator posta postu nadrzędnego, do którego chcesz dołączyć załącznik.

Sam plik przesłany i dołączony do postu nie robi nic automatycznie. Jest to po prostu rodzaj mechanizmu kategoryzacji. Na przykład mechanizm galerii wykorzystuje załączone obrazy postu do zbudowania [galerii] dla tego postu. Miniatura posta to tylko jeden z załączonych obrazów, który ma być miniaturą.

Więcej informacji na temat korzystania z wp_insert_attachment można znaleźć w kodeksie (link powyżej).

Chip Bennett
źródło
Dziękuję za odpowiedź! Jak mam odzyskać identyfikator miniatury? Zaczynam od adresu URL obrazu, więc myślę, że powinienem w jakiś sposób dodać obraz do biblioteki wordpress za pomocą innej funkcji?
Chris
Ponieważ już wstawiasz post, założyłem, że już dołączasz obrazy do wstawianego wpisu. Czy to nie jest prawidłowe założenie?
Chip Bennett
Przykro mi, ale jeszcze nie dowiedziałem się, jak faktycznie dołączyć obrazy do postu za pomocą adresu URL. Ponadto nie chciałbym, aby obraz był faktycznie wyświetlany w samym poście. Obecnie szukam funkcji, która zwróci $ thumbnail_id, i pomyślałem, że może wp_insert_attachment () zadziała, dopóki nie zauważyłem, że załącznik musi już znajdować się w katalogu upload. Nie wiem, jak uzyskać tam plik obrazu za pomocą jego adresu URL i nie jestem pewien, czy jest to funkcja, której szukam. Dziękuję za pomoc!
Chris
Czy możesz przepisać pytanie tymi informacjami, aby lepiej opisać to, co próbujesz osiągnąć? (Lub pozostawić to tak, jak jest i zacznij nowe pytanie, aby zapytać, jak uzyskać identyfikator załącznika podczas wstawiania posta?)
Chip Bennett
Oryginalne pytanie zostało zredagowane i częściowo przeredagowane, sprawdź ponownie :).
Chris
9

Chciałbym poprawić odpowiedź Robsa, wykorzystując podstawowe funkcje WP download_urlimedia_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 );

}
Jan Beck
źródło
1
Korzystanie z natywnych funkcji WordPress to najlepsza praktyka, dziękuję.
Mostafa Soufi
Z jakiegoś powodu w tej wersji wystąpiły błędy z informacją „Nie podano prawidłowego adresu URL”. , podczas gdy odpowiedź Roba Vermeera zadziałała.
Flimm
3

set_post_thumbnail() jest najlepszą funkcją dla tego wymagania.

Myślę, że możesz znaleźć identyfikator załącznika za pomocą get_children()lub get_posts(). Wynik ma tablicę, a wewnątrz tej tablicy znajduje się identyfikator. Poniższy przykład do testowania; mam nadzieję, że to zadziała; pisz bez testów, tylko od zera.

Dla twoich wymagań ważne jest, abyś zmienił się get_the_ID()wraz ze swoim post-ID; zwróć identyfikator załącznika, a będziesz mógł użyć 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);
}
bueltge
źródło
3

Właśnie to znalazłem i uczyniłem to o wiele prostszym, działa, ale nie jestem płuczką bezpieczeństwa

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

proste czy co? po uzyskaniu odpowiednich plików wordpress obsłuży media i prześle je, a następnie ustawi jako miniaturę.

Jesse Baker
źródło