@ligisayan

Как удалить скачанное изображение из временной папки на сервере после генерации из неё миниатюры?

Всем привет!

Есть сайт на wordpress и я планирую создавать посты с миниатюрами получаемыми с внешнего url посредством загрузки через RestAPI. Непосредственно сам процесс создания постов я настроил:

$post_data = array(
  'post_title'    => sanitize_text_field( $name ),
  'post_content'  => $content,
  'post_category' => array(1),
  'post_status'   => 'publish',
  'post_type'      => 'post',
  'post_author' => 1
);
$post_id = wp_insert_post( $post_data );


а изображения получаю с помощью функции
$image_id = wp_insert_attachment_by_url( $url, $post_id );
которая описана в гисте по ссылке
Но, при этом, при генерации миниатюры в папке остаётся копия скачанного изображения, которое теперь занимает лишнее место на диске.

И теперь у меня остался вопрос: как удалять исходники изображений полученных во временной папке при помощи download_url, но при этом, чтобы сама сохранялась миниатюра (thumbnail)?

function wp_insert_attachment_by_url( $url, $post_ID ) {
    require_once( ABSPATH . 'wp-admin/includes/media.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );

    if ( '' == $post_ID )
        return new WP_Error( 'insert_attachment_failed', __( 'Invalid post ID' ) );

    if( !empty( $url ) ){
        $url = esc_url( $url );

        /**
         * Set variables for storage, fix file
         * filename for query strings.
         */
        preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $url, $matches );
        if ( ! $matches ) {
            return new WP_Error( 'insert_attachment_failed', __( 'Invalid image URL' ) );
        }

        $file_array = array();
        $file_array['name'] = basename( $matches[0] );

        /**
        * Download file to temp location.
        */
        $file_array['tmp_name'] = download_url( $url );

        /**
        * Check for download errors
        * if there are error unlink the temp file name
        */
        if ( is_wp_error( $file_array['tmp_name'] ) ) {
            return $file_array['tmp_name'];
        }

        $image_ID = media_handle_sideload( $file_array, $post_ID );

        /**
         * If error storing permanently, unlink.
         */
        if ( is_wp_error( $image_ID ) ) {
            @unlink( $file_array['tmp_name'] );
            return $image_ID;
        }

        /**
         * If error thumbnail
         */
        if ( false === set_post_thumbnail( $post_ID, $image_ID ) ) {
            return new WP_Error( 'insert_attachment_failed', __( 'Problem to set post thumbnail' ) );
        }

        return $image_ID;
    }else{
        return new WP_Error( 'insert_attachment_failed', __( 'Insert URL' ) );
    }
}
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
@ligisayan Автор вопроса
Решение было найдено на просторах интернета, которое я адаптировал под конкретно свою задачу.

По итогу, как мне и было необходимо, в папке остаётся только одно изображение в заданных размерах thumbnail (название сохраняет оригинальное без хвостовой части с размерами) и оно же прикрепляется в качестве миниатюры к посту.

Протестировано на актуально на сегодня версии Wordpress 6.1.1

add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 250, 250 );
function true_remove_default_sizes( $sizes ) {
    unset( $sizes[ 'medium' ] );
    unset( $sizes[ 'large' ] );
    unset( $sizes[ 'medium_large' ] );
    unset( $sizes[ '1536x1536' ] );
    unset( $sizes[ '2048x2048' ] );
    return $sizes;
}
add_filter( 'big_image_size_threshold', '__return_false' );

function replace_uploaded_image($image_data) {

  if (!isset($image_data['sizes']['thumbnail'])) return $image_data;

  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $thumbnail_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['thumbnail']['file'];

  unlink($uploaded_image_location);

  rename($thumbnail_image_location,$uploaded_image_location);

  $image_data['width'] = $image_data['sizes']['thumbnail']['width'];
  $image_data['height'] = $image_data['sizes']['thumbnail']['height'];
  unset($image_data['sizes']['thumbnail']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы