Đây là bài trong loạt bài chúng ta dùng các đoạn code function để làm những công việc thay cho các plugin không thực sự cần thiết và quá lắm chức năng mà chúng ta đôi khi là không dùng tới, trong bài này mình hướng dẫn các bạn đóng watermark cho hình ảnh trên website mà không cần plugin.
Để làm được việc này thì bạn cần gọi 1 hook có tên add_attachment của wordpress. add_attachment là một hook được sử dụng trong WordPress để thực thi các hành động sau khi một tệp đính kèm mới được tải lên thành công trên trang web. Khi hook này được kích hoạt, nó cho phép chúng ta thực hiện một số hành động sau khi một tệp đính kèm mới được tải lên, bao gồm thêm các thông tin liên quan đến tệp đính kèm, tạo bản ghi trong cơ sở dữ liệu và xử lý tệp đính kèm.
Các hành động được thực thi bởi hook add_attachment được xác định bởi các function mà được đăng ký với hook này bằng cách sử dụng hàm add_action() hoặc add_filter(). Ví dụ, chúng ta có thể sử dụng hook này để thực hiện các hành động như thêm một watermark vào hình ảnh đính kèm, thêm thông tin tùy chỉnh về tệp đính kèm hoặc thực hiện các xử lý dữ liệu khác liên quan đến tệp đính kèm.
Với hook add_attachment, chúng ta có thể truy cập đối tượng metadata của tệp đính kèm bằng cách sử dụng hàm wp_generate_attachment_metadata() để tạo metadata và trả về một mảng dữ liệu chứa các thông tin về tệp đính kèm. Chúng ta có thể thay đổi hoặc thêm thông tin vào mảng này trước khi nó được lưu vào cơ sở dữ liệu.
Với các hành động cụ thể, chúng ta có thể sử dụng các hook khác như wp_handle_upload, wp_handle_upload_prefilter, wp_handle_sideload và wp_upload_bits để xử lý các tệp đính kèm theo cách khác nhau.
Trong trường hợp cần watermark tôi sẽ dùng hook này đơn giản như sau
// Hàm thêm watermark
function add_watermark($attachment_id) {
$watermark_path = '/blog.manhtuong.net/wp-content/uploads/2020/05/JA1DbUr.png'; // Đường dẫn đến file watermark
$attachment = get_post($attachment_id);
$file = get_attached_file($attachment_id);
$mime_type = get_post_mime_type($attachment);
if (strpos($mime_type, 'image') !== false) { // Nếu là hình ảnh
if ($mime_type == 'image/jpeg') {
$image = imagecreatefromjpeg($file);
} elseif ($mime_type == 'image/png') {
$image = imagecreatefrompng($file);
}
$watermark = imagecreatefrompng($watermark_path);
// Lấy kích thước hình ảnh và watermark
$image_width = imagesx($image);
$image_height = imagesy($image);
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
// Tính toán vị trí cho watermark
$watermark_pos_x = $image_width - $watermark_width - 10;
$watermark_pos_y = $image_height - $watermark_height - 10;
// Thêm watermark vào hình ảnh
imagecopy($image, $watermark, $watermark_pos_x, $watermark_pos_y, 0, 0, $watermark_width, $watermark_height);
// Lưu hình ảnh mới đã thêm watermark
if ($mime_type == 'image/jpeg') {
imagejpeg($image, $file);
} elseif ($mime_type == 'image/png') {
imagepng($image, $file);
}
}
}
// Thêm hook để chạy function add_watermark khi upload hình ảnh
add_action('add_attachment', 'add_watermark');Lưu ý:
Thay các thông số sau thành của bạn
| Thông số | Lưu ý |
| watermark_path | đường dẫn full của file làm watermark trên máy chủ |
| Định dạng hỗ trợ | JPEG JPG PNG |
Kết quả chúng ta được như ảnh demo này

Các bạn có thể thấy hình ảnh logo của mình đã được chèn vào ảnh bên phải phía dưới rồi, vậy là code đã chạy thành công.