web-dev-qa-db-ja.com

Mshots画像のローカルキャッシュを作る方法

私はサイトのURLからウェブサイトの自動サムネイルを生成するのにWordpressのmshots apiを使っています。カスタムフィールドを使用してWebサイトのURLをキャプチャし、スクリーンショットを返すためにmshotsのURLに値を渡します。

<?php
    $shot = get_post_meta($post->ID, 'website_url', true);
    $url = str_replace('http://', '', $shot);
    $imgurl = "http://s.wordpress.com/mshots/v1/".$url;
?>
<img src="<?php echo $imurl ?>" width="300" height="200" alt="<?php the_title(); ?>" /> 

それはうまくいっています。しかし、生成されたスクリーンショットのローカルキャッシュをテーマフォルダに作成して、画像が要求されるたびにリモートサーバーを呼び出す代わりに表示できるようにするにはどうすればよいでしょうか。

1
Jinson Abraham

これでうまくいくと思います。

function upload_image_from_url($url) {

    /** Require dependencies */
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );     

    // Save as a temporary file
    $tmp = download_url( $url );

    // Check for download errors
    if ( is_wp_error( $tmp ) ) 
    {
        @unlink( $file_array[ 'tmp_name' ] );
        return $tmp;
    }

    // Image name (just random-number)
    $name = Rand(0,100000).".jpg";

    // Take care of image files without extension:
    $path = pathinfo( $tmp );
    if( ! isset( $path['extension'] ) ):
        $tmpnew = $tmp . '.tmp';
        if( ! rename( $tmp, $tmpnew ) ):
            return '';
        else:
            $name = Rand(0,100000).".jpg";
            $tmp = $tmpnew;
        endif;
    endif;

    // Upload the image into the WordPress Media Library:
    $file_array = array(
        'name'     => $name,
        'tmp_name' => $tmp
    );
    $id = media_handle_sideload( $file_array, 0 );

    // Check for handle sideload errors:
    if ( is_wp_error( $id ) )
    {
        @unlink( $file_array['tmp_name'] );
        return $id;
    }

    return $id;
}

このスクリプトが機能していることはわかっていますが、いくつか変更を加えます。画像の命名方法と同じです。こちら を見てみることもできます

1
Lasse M. Tvedt