First Commit

This commit is contained in:
2025-08-28 19:35:28 -07:00
commit 264e65006a
488 changed files with 155661 additions and 0 deletions

View File

@@ -0,0 +1,249 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
class WPDD_Watermark {
public static function apply_watermark($file_path, $order) {
$file_extension = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
if (filter_var($file_path, FILTER_VALIDATE_URL)) {
$upload_dir = wp_upload_dir();
if (strpos($file_path, $upload_dir['baseurl']) === 0) {
$file_path = str_replace($upload_dir['baseurl'], $upload_dir['basedir'], $file_path);
} else {
return false;
}
}
if (!file_exists($file_path)) {
return false;
}
$product_id = $order->product_id;
$watermark_text = get_post_meta($product_id, '_wpdd_watermark_text', true);
if (empty($watermark_text)) {
$watermark_text = '{customer_email}';
}
$watermark_text = self::parse_watermark_placeholders($watermark_text, $order);
switch ($file_extension) {
case 'jpg':
case 'jpeg':
case 'png':
case 'gif':
return self::watermark_image($file_path, $watermark_text);
case 'pdf':
return self::watermark_pdf($file_path, $watermark_text);
default:
return false;
}
}
private static function parse_watermark_placeholders($text, $order) {
$customer = get_userdata($order->customer_id);
$replacements = array(
'{customer_name}' => $order->customer_name,
'{customer_email}' => $order->customer_email,
'{order_id}' => $order->order_number,
'{date}' => date_i18n(get_option('date_format')),
'{site_name}' => get_bloginfo('name')
);
return str_replace(array_keys($replacements), array_values($replacements), $text);
}
private static function watermark_image($file_path, $watermark_text) {
if (!function_exists('imagecreatefrompng')) {
return false;
}
$file_info = pathinfo($file_path);
$extension = strtolower($file_info['extension']);
switch ($extension) {
case 'jpg':
case 'jpeg':
$image = imagecreatefromjpeg($file_path);
break;
case 'png':
$image = imagecreatefrompng($file_path);
break;
case 'gif':
$image = imagecreatefromgif($file_path);
break;
default:
return false;
}
if (!$image) {
return false;
}
$width = imagesx($image);
$height = imagesy($image);
$font_size = max(10, min(30, $width / 40));
$font_file = WPDD_PLUGIN_PATH . 'assets/fonts/arial.ttf';
if (!file_exists($font_file)) {
$font = 5;
$text_width = imagefontwidth($font) * strlen($watermark_text);
$text_height = imagefontheight($font);
} else {
$bbox = imagettfbbox($font_size, 0, $font_file, $watermark_text);
$text_width = $bbox[2] - $bbox[0];
$text_height = $bbox[1] - $bbox[7];
}
$x = ($width - $text_width) / 2;
$y = $height - 50;
$text_color = imagecolorallocatealpha($image, 255, 255, 255, 30);
$shadow_color = imagecolorallocatealpha($image, 0, 0, 0, 50);
if (file_exists($font_file)) {
imagettftext($image, $font_size, 0, $x + 2, $y + 2, $shadow_color, $font_file, $watermark_text);
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_file, $watermark_text);
} else {
imagestring($image, $font, $x + 2, $y + 2, $watermark_text, $shadow_color);
imagestring($image, $font, $x, $y, $watermark_text, $text_color);
}
$temp_dir = get_temp_dir();
$temp_file = $temp_dir . 'wpdd_watermark_' . uniqid() . '.' . $extension;
switch ($extension) {
case 'jpg':
case 'jpeg':
imagejpeg($image, $temp_file, 90);
break;
case 'png':
imagepng($image, $temp_file, 9);
break;
case 'gif':
imagegif($image, $temp_file);
break;
}
imagedestroy($image);
return $temp_file;
}
private static function watermark_pdf($file_path, $watermark_text) {
if (!class_exists('TCPDF') && !class_exists('FPDF')) {
return self::watermark_pdf_basic($file_path, $watermark_text);
}
if (class_exists('TCPDF')) {
return self::watermark_pdf_tcpdf($file_path, $watermark_text);
}
return false;
}
private static function watermark_pdf_basic($file_path, $watermark_text) {
$temp_dir = get_temp_dir();
$temp_file = $temp_dir . 'wpdd_watermark_' . uniqid() . '.pdf';
if (copy($file_path, $temp_file)) {
return $temp_file;
}
return false;
}
private static function watermark_pdf_tcpdf($file_path, $watermark_text) {
require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
$pdf = new TCPDF();
$pdf->SetProtection(array('print'), '', null, 0, null);
$pagecount = $pdf->setSourceFile($file_path);
for ($i = 1; $i <= $pagecount; $i++) {
$tplidx = $pdf->importPage($i);
$pdf->AddPage();
$pdf->useTemplate($tplidx);
$pdf->SetFont('helvetica', '', 12);
$pdf->SetTextColor(200, 200, 200);
$pdf->SetAlpha(0.5);
$pdf->StartTransform();
$pdf->Rotate(45, $pdf->getPageWidth() / 2, $pdf->getPageHeight() / 2);
$pdf->Text(
$pdf->getPageWidth() / 2 - 50,
$pdf->getPageHeight() / 2,
$watermark_text
);
$pdf->StopTransform();
$pdf->SetAlpha(1);
}
$temp_dir = get_temp_dir();
$temp_file = $temp_dir . 'wpdd_watermark_' . uniqid() . '.pdf';
$pdf->Output($temp_file, 'F');
return $temp_file;
}
public static function add_text_watermark($content, $watermark_text) {
$watermark_html = sprintf(
'<div style="position: fixed; top: 50%%; left: 50%%; transform: translate(-50%%, -50%%) rotate(-45deg);
opacity: 0.1; font-size: 48px; color: #000; z-index: -1; user-select: none;">%s</div>',
esc_html($watermark_text)
);
return $watermark_html . $content;
}
public static function get_watermark_settings() {
return array(
'enabled' => get_option('wpdd_watermark_enabled', false),
'text' => get_option('wpdd_watermark_text', '{customer_email}'),
'position' => get_option('wpdd_watermark_position', 'center'),
'opacity' => get_option('wpdd_watermark_opacity', 30),
'font_size' => get_option('wpdd_watermark_font_size', 'auto'),
'color' => get_option('wpdd_watermark_color', '#ffffff')
);
}
public static function preview_watermark($file_type = 'image') {
$settings = self::get_watermark_settings();
$preview_text = str_replace(
array('{customer_name}', '{customer_email}', '{order_id}', '{date}', '{site_name}'),
array('John Doe', 'john@example.com', 'WPDD-123456', date_i18n(get_option('date_format')), get_bloginfo('name')),
$settings['text']
);
if ($file_type === 'image') {
$width = 600;
$height = 400;
$image = imagecreatetruecolor($width, $height);
$bg_color = imagecolorallocate($image, 240, 240, 240);
imagefill($image, 0, 0, $bg_color);
$text_color = imagecolorallocatealpha($image, 100, 100, 100, 50);
$font_size = 20;
$x = ($width - (strlen($preview_text) * 10)) / 2;
$y = $height / 2;
imagestring($image, 5, $x, $y, $preview_text, $text_color);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
}
}
}