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ę!

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


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


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

}

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

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ę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.