Wordpressでファイルをs3にアップロードするためにコアをフックする

従来のサーバーではなくAmazonS3にファイルを保存すると、多くの優れた利点が得られます。S3は無制限のスケーラビリティを提供し、トラフィックが急増した場合でも一貫したパフォーマンスとページの読み込み速度を保証します。特に、S3は高い信頼性とセキュリティを保証し、データを安全に保ち、管理を容易にします。さらに、他のAWSサービスと簡単に統合できるため、システムを柔軟かつ効率的に最適化できます。

これをサポートするプラグインは数多くありますが、料金は高く、プラグインには多くの不要な機能が含まれていることがよくあります。自分でコーディングすると、より効率的で管理が容易になり、コストの削減に役立ちます。

これを行う手順は次のとおりです

ステップ1: 環境を準備する

S3にバケットを作成し、以下の画像に従って次の情報をwp-config.phpに貼り付けます。

以下のコマンドを使用してS3SDKライブラリをインストールします

composer require aws/aws-sdk-php

ステップ2: コードを書く

s3にアップロードする関数を書く

function upload_to_s3($file_path) {
    try {
        // chuẩn bị config s3
        $bucket = S3_UPLOADS_BUCKET;
        $s3 = new Aws\S3\S3Client([
            'version' => 'latest',
            'region' => S3_UPLOADS_REGION,
            'credentials' => [
                'key' => S3_UPLOADS_KEY,
                'secret' => S3_UPLOADS_SECRET,
            ]
        ]);

        // sửa lại đường dẫn
        $file_url = str_replace(UPLOAD_DIR, UPLOAD_URI, $file_path);
        $file_name = str_replace(home_url('/'), '', $file_url);

        // Thực hiện upload file lên S3
        $result = $s3->putObject([
            'Bucket' => $bucket,
            'Key' => $file_name,
            'Body' => fopen($file_path, 'r'),
            'ACL' => 'public-read'
        ]);
        return true;
    } catch (Aws\Exception\S3Exception $e) {
        // Xử lý ngoại lệ S3Exception
        error_log("Error uploading file to S3: " . $e->getMessage());
        return false;
    } catch (Exception $e) {
        // Xử lý ngoại lệ khác
        error_log("An unexpected error occurred: " . $e->getMessage());
        return false;
    }
}

wordpressフックを使用してS3にアップロードする

add_filter('wp_generate_attachment_metadata', 'upload_image_to_s3', 10, 2);
function upload_image_to_s3($metadata, $attachment_id) {
    try {
        $file = get_attached_file($attachment_id);
        upload_to_s3($file);

        $path_parts = pathinfo($file);
        $path = $path_parts['dirname'];

        $mime_type = get_post_mime_type($attachment_id);
        if (strpos($mime_type, 'image') !== false) {
            if (isset($metadata['sizes']) && is_array($metadata['sizes'])) {
                foreach ($metadata['sizes'] as $size => $data) {
                    $file_size_path = $path.'/'.$data['file'];
                    upload_to_s3($file_size_path);
                }
            }
        }
    } catch (Exception $e) {
        // Xử lý ngoại lệ ở đây nếu cần
        error_log('Error: ' . $e->getMessage());
    }
    
    return $metadata;
}

WordPressメディアにアップロードする場合、正しいアップロードパスに従って、画像のすべてのバージョンがs3に自動的にアップロードされるようになりました。

S3上の画像を削除する関数を書く

function delete_from_s3($file_path) {
    try {
        // Chuẩn bị config S3
        $bucket = S3_UPLOADS_BUCKET;
        $s3 = new Aws\S3\S3Client([
            'version' => 'latest',
            'region' => S3_UPLOADS_REGION,
            'credentials' => [
                'key' => S3_UPLOADS_KEY,
                'secret' => S3_UPLOADS_SECRET,
            ]
        ]);

        $file_path = str_replace(UPLOAD_DIR, 'wp-content/uploads', $file_path);
        
        // Thực hiện xoá file trên S3
        $result = $s3->deleteObject([
            'Bucket' => $bucket,
            'Key' => $file_path,
        ]);

        // Kiểm tra kết quả
        if ($result['@metadata']['statusCode'] === 204) {
            // Xoá thành công
            return true;
        } else {
            // Xoá không thành công
            return false;
        }
    } catch (Aws\S3\Exception\S3Exception $e) {
        // Xử lý ngoại lệ
        // Log lỗi hoặc thông báo cho người dùng
        error_log('Error deleting file from S3: ' . $e->getMessage());
        return false;
    }
}

wordpressフックを使用して画像を削除する

このフックは、メディア上の画像を削除すると、S3でも削除されることをWordpressに指示します。

add_action('delete_attachment', 'delete_image_to_s3');
function delete_image_to_s3($attachment_id) {
    try {
        $file = get_attached_file($attachment_id);
        delete_from_s3($file);

        $path_parts = pathinfo($file);
        $path = $path_parts['dirname'];

        $metadata = wp_get_attachment_metadata($attachment_id);

        $mime_type = get_post_mime_type($attachment_id);
        if (strpos($mime_type, 'image') !== false) {
            if (isset($metadata['sizes']) && is_array($metadata['sizes'])) {
                foreach ($metadata['sizes'] as $size => $data) {
                    $file_size_path = $path.'/'.$data['file'];
                    delete_from_s3($file_size_path);
                }
            }
        }
    } catch (Exception $e) {
        // Xử lý ngoại lệ ở đây
        error_log('Error deleting attachment: ' . $e->getMessage());
    }
}

フックを使用してWordpressのデフォルトの画像パスを置き換えます

現時点では、Wordpressはまだ古いパスを使用しているため、cloudfrontを使用している場合は、S3パス経由で置き換える必要があります。クラウドフロントのパスがドメインと同じになるためです。

add_filter('upload_dir', 'custom_upload_dir');
function custom_upload_dir($upload) {
    try {
        $upload['baseurl'] = 'https://' . S3_UPLOADS_BUCKET . '.s3.'. S3_UPLOADS_REGION .'.amazonaws.com/wp-content/uploads';
    } catch (Exception $e) {
        // Xử lý ngoại lệ ở đây
        error_log('Error setting custom upload directory: ' . $e->getMessage());
    }
    return $upload;
}

この時点ですべてが完了しました。関数を適切に実行するには、画像を取得するときに標準のWordpress関数を使用してフックする必要があることに注意してください。.

無料相談・お問い合わせ
ご相談やお見積もりは全て 無料 で対応いたします。

    「個人情報保護方針」をお読みいただき同意いただける場合は「送信」ボタンを押して下さい。
    入力していただいたメールアドレス宛に自動返信メールを送信していますので、お手数ですがそちらをご確認ください。
    無料相談・お問い合わせ
    ご相談やお見積もりは全て 無料 で対応いたします。

      「個人情報保護方針」をお読みいただき同意いただける場合は「送信」ボタンを押して下さい。
      入力していただいたメールアドレス宛に自動返信メールを送信していますので、お手数ですがそちらをご確認ください。
      無料相談
      お問い合わせ