Отримайте $ image_id після завантаження з media_sideload_image ()


10

Я хочу завантажити зображення і встановити його як розміщене зображення у публікації. Я спробував це:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

Але media_sideload_image()це не повернення зображення image_id, а відображення html-зображення. Як я можу отримати image_id?

Відповіді:


28

Ось приклад того, як обійти це обмеження за допомогою дій / гаків:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

Ідея полягає в тому, що коли він media_sideload_imageпрацює, це:

  • завантажує зображення
  • додає його як додаток (посада типу attachment)
  • потім додає це вкладення до публікації, чий ідентифікатор ви вказали ($ post_id)

Ваша проблема полягає в тому, що він не містить новоствореного ідентифікатора повідомлень про вкладення.

Але коли створюється вкладення, виконується дія, що містить його ідентифікатор. Ми можемо підключитися до цього, перш ніж створити додаток, і збережемо представлений мініатюру разом із ідентифікатором поста, який він нам надав, а потім зніміть його.


1
Блискуче! Це дуже допомогло.
m-torin

2
Якщо це відповідає на ваше запитання, чи можете ви визначити його правильним?
Том Дж. Ноуелл

я не можу прочитати вашу англійську .може хтось редагує цю публікацію?
HiDd3N

2
@ HiDd3N Я спростив деякі з англійських, які використовуються, у ньому повинні бути більше загальних слів із меншим віком читання
Том Дж. Ноуелл

6

Я будую функцію для отримання ідентифікатора з БД, пошуку за URL-адресою.

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

Ви можете отримати URL (з коду html) за допомогою четвертого параметра, встановленого на 'src' Codex: media_sideload_image ()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);


4

@Tom Дж. Ноуелл відповідь на місці. Я знайшов іншу альтернативу (з використанням різних функцій), пояснену тут, але мені ця ще подобається.

У моєму випадку у мене є масив $ публікацій з усіма публікаціями, які я хочу вставити, і окремий $ media (ті ж ключі $ nid, що і $ posts) з медіа. Мій код - це те саме рішення, що і Том, але відновлено використання анонімної функції:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

У моєму випадку я припускаю, що 1-й елемент у кожному $ media [$ nid] повинен бути зображеним зображенням його допису.

WordPress повинен безумовно змінити media_sideload_image (), щоб він повертав $ id. Насправді функція має її під рукою, дивіться джерело тут . Насправді є путівка на це, і вони навіть мають виправлення, щоб застосувати це до вашої основи в середній час, якщо хочете.


Схоже, це заплановано зафіксувати в 4.8
Том Ожер

3

Я шукав рішення і вирішив подивитися на код, media_sideload_image()який був дуже прямим. Він використовує, media_handle_sideload()що дає нам вкладення id.

Я змінив його, щоб повернути вкладення idзамість html-джерела зображення, і навіть додав спосіб надіслати йому нове ім’я файлу.

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $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 null;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.