东风不来
三月的柳絮不飞

WordPress 图片上传自动加水印功能 纯代码实现

1. 启用 Options Framework

确保你使用的是支持 Options Framework 的 WordPress 主题,或者手动集成该框架。

如果你已经在使用 Options Framework(比如主题自带 admin/options.php),直接跳过。

2. 添加设置项到 Options Framework

在主题目录的 /admin/options.php 文件中,添加如下字段配置:

$settings[] = array(
    'name' => '图片水印设置',
    'type' => 'heading'
);

$settings[] = array(
    'name' => '启用图片水印',
    'id'   => 'enable_image_watermark',
    'type' => 'checkbox',
);

$settings[] = array(
    'name' => '水印图片',
    'id'   => 'custom_watermark_image',
    'type' => 'upload'
);

$settings[] = array(
    'name' => '水印位置',
    'id'   => 'watermark_position',
    'type' => 'select',
    'options' => array(
        'top-left' => '左上角',
        'top-center' => '上居中',
        'top-right' => '右上角',
        'middle-left' => '左中',
        'center' => '正中心',
        'middle-right' => '右中',
        'bottom-left' => '左下角',
        'bottom-center' => '下居中',
        'bottom-right' => '右下角'
    ),
    'std' => 'bottom-right'
);

后台将自动生成配置界面,允许用户控制水印功能。

3. 编写水印处理逻辑(放入 functions.php)

add_filter('wp_handle_upload', 'add_watermark_from_optionsframework');

function add_watermark_from_optionsframework($upload) {
    if (!of_get_option('enable_image_watermark')) return $upload;

    $image_path = $upload['file'];
    $image_type = mime_content_type($image_path);

    if (!in_array($image_type, ['image/jpeg', 'image/png'])) return $upload;

    $image = $image_type === 'image/jpeg'
        ? imagecreatefromjpeg($image_path)
        : imagecreatefrompng($image_path);

    if (!$image) return $upload;

    $watermark_url = of_get_option('custom_watermark_image');
    if (!$watermark_url) return $upload;

    $tmp = download_url($watermark_url);
    if (is_wp_error($tmp)) return $upload;

    $original_wm = imagecreatefrompng($tmp);
    imagealphablending($original_wm, true);
    imagesavealpha($original_wm, true);

    $img_w = imagesx($image);
    $img_h = imagesy($image);

    $target_wm_w = intval($img_w * 0.15);
    $scale = $target_wm_w / imagesx($original_wm);
    $target_wm_h = intval(imagesy($original_wm) * $scale);

    $watermark = imagecreatetruecolor($target_wm_w, $target_wm_h);
    imagealphablending($watermark, false);
    imagesavealpha($watermark, true);
    $transparent = imagecolorallocatealpha($watermark, 0, 0, 0, 127);
    imagefill($watermark, 0, 0, $transparent);

    imagecopyresampled(
        $watermark,
        $original_wm,
        0, 0, 0, 0,
        $target_wm_w,
        $target_wm_h,
        imagesx($original_wm),
        imagesy($original_wm)
    );

    $position = of_get_option('watermark_position', 'bottom-right');
    $margin = 10;

    $positions = [
        'top-left' => [$margin, $margin],
        'top-center' => [($img_w - $target_wm_w) / 2, $margin],
        'top-right' => [$img_w - $target_wm_w - $margin, $margin],
        'middle-left' => [$margin, ($img_h - $target_wm_h) / 2],
        'center' => [($img_w - $target_wm_w) / 2, ($img_h - $target_wm_h) / 2],
        'middle-right' => [$img_w - $target_wm_w - $margin, ($img_h - $target_wm_h) / 2],
        'bottom-left' => [$margin, $img_h - $target_wm_h - $margin],
        'bottom-center' => [($img_w - $target_wm_w) / 2, $img_h - $target_wm_h - $margin],
        'bottom-right' => [$img_w - $target_wm_w - $margin, $img_h - $target_wm_h - $margin],
    ];

    [$x, $y] = $positions[$position] ?? $positions['bottom-right'];

    imagecopy($image, $watermark, $x, $y, 0, 0, $target_wm_w, $target_wm_h);

    if ($image_type === 'image/jpeg') {
        imagejpeg($image, $image_path, 90);
    } else {
        imagepng($image, $image_path);
    }

    imagedestroy($image);
    imagedestroy($watermark);
    imagedestroy($original_wm);
    @unlink($tmp);

    return $upload;
}

4. 使用方法

进入 WordPress 后台 → 主题设置

上传你想要作为水印的 PNG 图(建议带透明背景)

启用水印功能

选择水印显示位置

上传任意图片,自动加水印!

5. 总结

这一功能完全基于代码实现,不依赖任何第三方插件,灵活、安全、高效。你可以轻松为所有上传图片添加品牌标识,也可以根据需求扩展更多逻辑(如只对某些尺寸图片加水印、仅管理员用户触发水印等)。

赞(0) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《WordPress 图片上传自动加水印功能》
文章链接:https://www.wenzika.com/2551.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫