post_mime_type) && strpos($post_upload->post_mime_type, 'image') === false) { return $metadata; } if (!empty($attachment_id)) { if (is_plugin_active('wp-media-folder-gallery-addon/wp-media-folder-gallery-addon.php')) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- No action, nonce is not required $galleryid = isset($_POST['up_gallery_id']) ? (int)$_POST['up_gallery_id'] : 0; $watermark_exclude_public_gallery = wpmfGetOption('watermark_exclude_public_gallery'); $watermark_exclude_photograph_gallery = wpmfGetOption('watermark_exclude_photograph_gallery'); $check = false; if (!empty($watermark_exclude_public_gallery)) { if (!empty($galleryid)) { $gallery_type = get_term_meta((int)$galleryid, 'gallery_type', true); if (!empty($gallery_type) && $gallery_type === 'photographer') { $check = true; } } if (!$check) { return $metadata; } } if (!empty($watermark_exclude_photograph_gallery)) { if (!empty($galleryid)) { $gallery_type = get_term_meta((int)$galleryid, 'gallery_type', true); if (!empty($gallery_type) && $gallery_type === 'photographer') { $check = true; } } if ($check) { return $metadata; } } } $current_attachment = get_post($attachment_id); if (empty($current_attachment)) { return $metadata; } $watermark_apply = get_option('wpmf_image_watermark_apply'); $exclude_folders = wpmfGetOption('watermark_exclude_folders'); $excludes = array(); foreach (array_unique($exclude_folders) as $folder) { if ($folder === 'root') { $excludes[] = 0; } else { if ((int) $folder !== 0) { $excludes[] = (int) $folder; } } } $folderIDs = array(); $terms = get_the_terms($attachment_id, WPMF_TAXO); if (empty($terms)) { $folderIDs[] = 0; } else { foreach ($terms as $term) { $folderIDs[] = $term->term_id; } } $same_value = array_intersect($excludes, $folderIDs); if (!empty($same_value)) { return $metadata; } $uploads = wp_upload_dir(); $imageInfo = 0; if (isset($watermark_apply['all_size']) && (int) $watermark_apply['all_size'] === 1) { $sizes = array('full'); foreach ($metadata['sizes'] as $si => $size_info) { $sizes[] = $si; } foreach ($sizes as $imageSize) { $image_url = ''; if ($imageSize === 'full') { $image_url = $uploads['baseurl'] . '/' . $metadata['file']; } else { if (isset($metadata['sizes'][$imageSize])) { $image_url = $uploads['url'] . '/' . $metadata['sizes'][$imageSize]['file']; } } // Using the wp_upload_dir replace the baseurl with the basedir $path = str_replace($uploads['baseurl'], $uploads['basedir'], $image_url); if (!empty($path)) { $pathinfo = pathinfo($path); $imageInfo = getimagesize($path); } try { if (!empty($pathinfo)) { $this->generatePicture($pathinfo['basename'], $imageInfo, $pathinfo['dirname'], $imageSize); } else { wp_send_json(array('status' => false)); } } catch (Exception $e) { wp_send_json(array('status' => false)); } } } else { foreach ($watermark_apply as $imageSize => $value) { // Using the wp_upload_dir replace the baseurl with the basedir $infos = pathinfo($current_attachment->guid); // Using the wp_upload_dir replace the baseurl with the basedir if (empty($value)) { continue; } $image_url = ''; if ($imageSize === 'full') { $image_url = $uploads['baseurl'] . '/' . $metadata['file']; } else { if (isset($metadata['sizes'][$imageSize])) { $image_url = $uploads['url'] . '/' . $metadata['sizes'][$imageSize]['file']; } } // Using the wp_upload_dir replace the baseurl with the basedir $path = str_replace($uploads['baseurl'], $uploads['basedir'], $image_url); if (!empty($path)) { $pathinfo = pathinfo($path); $imageInfo = getimagesize($path); } try { if (!empty($pathinfo)) { $this->generatePicture($pathinfo['basename'], $imageInfo, $pathinfo['dirname'], $imageSize); } else { wp_send_json(array('status' => false)); } } catch (Exception $e) { wp_send_json(array('status' => false)); } } } } return $metadata; } /** * Ajax create watermark image * * @return void */ public function regeneratePictures() { if (empty($_POST['wpmf_nonce']) || !wp_verify_nonce($_POST['wpmf_nonce'], 'wpmf_nonce')) { die(); } set_time_limit(0); /** * Filter check capability of current user to create watermark image * * @param boolean The current user has the given capability * @param string Action name * * @return boolean * * @ignore Hook already documented */ $wpmf_capability = apply_filters('wpmf_user_can', current_user_can('upload_files'), 'render_watermark'); if (!$wpmf_capability) { wp_send_json(false); } global $wpdb; $limit = 1; $offset = ((int) $_POST['paged'] - 1) * $limit; $logo_image_id = get_option('wpmf_watermark_image_id', 0); $count_images = $wpdb->get_var($wpdb->prepare( 'SELECT COUNT(ID) FROM ' . $wpdb->posts . " WHERE post_type = 'attachment' AND ID != %d AND post_mime_type LIKE %s AND guid NOT LIKE %s", array($logo_image_id, 'image%', '%.svg') )); $present = (100 / $count_images) * $limit; $k = 0; $args = array( 'posts_per_page' => $limit, 'offset' => $offset, 'post_type' => 'attachment', 'post_mime_type' => array('image/jpg', 'image/jpeg', 'image/png', 'image/webp'), 'post_status' => 'any', 'orderby' => 'ID', 'order' => 'DESC', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'wpmf_drive_id', 'compare' => 'NOT EXISTS' ), array( 'key' => 'wpmf_awsS3_info', 'compare' => 'NOT EXISTS' ) ) ); $uploads = wp_upload_dir(); $tax_query = array(); $excludes = array(); $exclude_folders = wpmfGetOption('watermark_exclude_folders'); $watermark_apply = get_option('wpmf_image_watermark_apply'); foreach (array_unique($exclude_folders) as $folder) { if ($folder === 'root') { $excludes[] = 0; $root_id = get_option('wpmf_folder_root_id'); $tax_query[] = array( 'taxonomy' => WPMF_TAXO, 'field' => 'term_id', 'terms' => (int)$root_id, 'operator' => 'NOT IN' ); } else { if ((int) $folder !== 0) { $excludes[] = (int)$folder; } $tax_query[] = array( 'taxonomy' => WPMF_TAXO, 'field' => 'term_id', 'terms' => (int)$folder, 'operator' => 'NOT IN' ); } } if (!empty($tax_query)) { $tax_query['relation'] = 'AND'; $args['tax_query'] = $tax_query; } $query = new WP_Query($args); $attachments = $query->get_posts(); if (empty($attachments)) { wp_send_json(array('status' => 'ok', 'paged' => 0)); } if (empty($watermark_apply)) { wp_send_json(array('status' => false)); } if (!empty($attachments)) { foreach ($attachments as $attachment) { // exclude watermark on gallery if (is_plugin_active('wp-media-folder-gallery-addon/wp-media-folder-gallery-addon.php')) { $watermark_exclude_public_gallery = wpmfGetOption('watermark_exclude_public_gallery'); $watermark_exclude_photograph_gallery = wpmfGetOption('watermark_exclude_photograph_gallery'); $check = false; if (!empty($watermark_exclude_public_gallery)) { $gallery_terms = get_the_terms($attachment->ID, WPMF_GALLERY_ADDON_TAXO); if (!empty($gallery_terms)) { foreach ($gallery_terms as $gallery_term) { $gallery_type = get_term_meta((int)$gallery_term->term_id, 'gallery_type', true); if (!empty($gallery_type) && $gallery_type === 'photographer') { $check = true; } } } if (!$check) { $k ++; continue; } } if (!empty($watermark_exclude_photograph_gallery)) { $gallery_terms = get_the_terms($attachment->ID, WPMF_GALLERY_ADDON_TAXO); if (!empty($gallery_terms)) { foreach ($gallery_terms as $gallery_term) { $gallery_type = get_term_meta((int)$gallery_term->term_id, 'gallery_type', true); if (!empty($gallery_type) && $gallery_type === 'photographer') { $check = true; break; } } } if ($check) { $k ++; continue; } } } $full_path = get_attached_file($attachment->ID); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Ignore warning php if file not exist or not have permission if ((int) $logo_image_id === (int) $attachment->ID || !@file_exists($full_path)) { $k ++; continue; } $terms = get_the_terms($attachment->ID, WPMF_TAXO); $folderIDs = array(); if (empty($terms)) { $folderIDs[] = 0; } else { foreach ($terms as $term) { $folderIDs[] = (int) $term->term_id; } } $same_value = array_intersect($excludes, $folderIDs); if (!empty($same_value)) { $k ++; continue; } $check_remote = get_post_meta($attachment->ID, 'wpmf_remote_video_link'); if (empty($check_remote)) { if (isset($watermark_apply['all_size']) && (int) $watermark_apply['all_size'] === 1) { $sizes = array_merge(array('full'), get_intermediate_image_sizes()); foreach ($sizes as $imageSize) { $image_object = wp_get_attachment_image_src($attachment->ID, $imageSize); // Isolate the url $image_url = $image_object[0]; // Using the wp_upload_dir replace the baseurl with the basedir $path = str_replace($uploads['baseurl'], $uploads['basedir'], $image_url); $pathinfo = pathinfo($path); $imageInfo = getimagesize($path); try { $this->generatePicture($pathinfo['basename'], $imageInfo, $pathinfo['dirname'], $imageSize); } catch (Exception $e) { wp_send_json(array('status' => 'limit', 'percent' => $present)); } } } else { foreach ($watermark_apply as $imageSize => $value) { // Isolate the url $metadata = get_post_meta($attachment->ID, '_wp_attachment_metadata', true); if (!isset($metadata['sizes'][$imageSize]) && $imageSize !== 'full') { continue; } $infos = pathinfo($attachment->guid); // Using the wp_upload_dir replace the baseurl with the basedir if ($imageSize === 'full') { $path = $full_path; } else { $path = str_replace( $infos['basename'], $metadata['sizes'][$imageSize]['file'], $full_path ); } if (!file_exists($path)) { wp_send_json(array('status' => 'limit', 'percent' => $present)); } $pathinfo = pathinfo($path); $imageInfo = getimagesize($path); if ((int) $value === 1) { try { $this->generatePicture($pathinfo['basename'], $imageInfo, $pathinfo['dirname'], $imageSize); } catch (Exception $e) { wp_send_json(array('status' => 'limit', 'percent' => $present)); } } else { $check_name_wtm = 'imageswatermark'; $name_change_file_wtm = pathinfo($pathinfo['basename'], PATHINFO_FILENAME) . $check_name_wtm; $name_change_file_wtm .= '.' . pathinfo($pathinfo['basename'], PATHINFO_EXTENSION); $file = $pathinfo['dirname'] . '/' . $pathinfo['basename']; $newfile = $pathinfo['dirname'] . '/' . $name_change_file_wtm; if (file_exists($newfile)) { unlink($file); copy($newfile, $file); unlink($newfile); } } } } $k ++; } } if ($k >= $limit) { wp_send_json(array('status' => 'limit', 'percent' => $present)); } else { wp_send_json(array('status' => 'ok', 'paged' => 0)); } } } /** * Generate Picture * * @param string $newname New name of image * @param array $imageInfo Image infomartion * @param string $full_dir Path of image * @param string $wtm_apply_on Image size * @param string $type Type * * @return void */ public function generatePicture($newname, $imageInfo, $full_dir, $wtm_apply_on, $type = '') { $wtm_images = get_option('wpmf_option_image_watermark'); //$wtm_apply_on = get_option('wpmf_image_watermark_apply'); if ((int) $wtm_images === 0) { $logo_image_id = 0; } else { $logo_image_id = get_option('wpmf_watermark_image_id'); } if ((int) $logo_image_id === 0) { $check_image_logo_exit = false; } else { $wtm_image_logo = get_attached_file($logo_image_id); $info_logo = pathinfo($wtm_image_logo); $check_image_logo_exit = true; if (!empty($info_logo['extension']) && !in_array(strtolower($info_logo['extension']), $this->allowed_ext)) { $check_image_logo_exit = false; } } $this->copyFileWithNewName($full_dir, $newname, 'initimage'); if ($imageInfo['mime'] === 'image/jpeg') { if (!empty($wtm_images) && $check_image_logo_exit) { $this->checkCopyFileWithNewName($full_dir, $newname, $wtm_apply_on, $type); } } elseif ($imageInfo['mime'] === 'image/png') { if (!empty($wtm_images) && $check_image_logo_exit) { $this->checkCopyFileWithNewName($full_dir, $newname, $wtm_apply_on, $type); } } elseif ($imageInfo['mime'] === 'image/gif') { if (!empty($wtm_images) && $check_image_logo_exit) { $this->checkCopyFileWithNewName($full_dir, $newname, $wtm_apply_on, $type); } } } /** * Generate Picture * * @param string $full_dir Path of image * @param string $newname New name of image * @param string $wtm_apply_on The sizes to apply watermark * @param string $type Type * * @return void */ public function checkCopyFileWithNewName($full_dir, $newname, $wtm_apply_on, $type = '') { $this->copyFileWithNewName($full_dir, $newname, $wtm_apply_on, $type); } /** * Generate Picture * * @param string $pathdir Path to file * @param string $fname New file name * @param string $wtmApplyOn The size to apply watermark * @param string $type Type * * @return void */ public function copyFileWithNewName($pathdir, $fname, $wtmApplyOn, $type = '') { $option_image_watermark = get_option('wpmf_option_image_watermark'); if ((int) $option_image_watermark === 0) { $add_water = false; } else { $logo_image_id = get_option('wpmf_watermark_image_id'); if ((int) $logo_image_id === 0) { $add_water = false; } else { $wtm_image_logo = get_attached_file($logo_image_id); if (file_exists($wtm_image_logo)) { $add_water = true; } else { $add_water = false; } } } $wtm_position = get_option('wpmf_watermark_position'); $wtm_apply_on = get_option('wpmf_image_watermark_apply'); if ($type === 'photographer') { $wtm_apply_on = wpmfGetOption('photograper_image_watermark_apply'); } $watermark_image_scaling = wpmfGetOption('watermark_image_scaling'); $watermark_margin = wpmfGetOption('watermark_margin'); $watermark_opacity = wpmfGetOption('watermark_opacity'); $watermark_margin_unit = wpmfGetOption('watermark_margin_unit'); if ((int) $watermark_opacity > 100) { $watermark_opacity = 100; } if ((int) $watermark_opacity < 0) { $watermark_opacity = 0; } $watermark_opacity = (int) $watermark_opacity / 100; $check_name_wtm = 'imageswatermark'; $name_change_file_wtm = pathinfo($fname, PATHINFO_FILENAME) . $check_name_wtm; $name_change_file_wtm .= '.' . pathinfo($fname, PATHINFO_EXTENSION); $file = $pathdir . '/' . $fname; $newfile = $pathdir . '/' . $name_change_file_wtm; if ($wtmApplyOn === 'initimage') { if (file_exists($newfile)) { if (unlink($file)) { if (copy($newfile, $file)) { unlink($newfile); } } } } if ($add_water) { if ((int) $wtm_apply_on['all_size'] === 1) { if (file_exists($newfile)) { $this->watermark( $file, $wtm_image_logo, $wtm_position, $watermark_margin, $watermark_image_scaling, $watermark_opacity, $watermark_margin_unit ); } else { if (copy($file, $newfile)) { $this->watermark( $file, $wtm_image_logo, $wtm_position, $watermark_margin, $watermark_image_scaling, $watermark_opacity, $watermark_margin_unit ); } } } else { if (empty($wtm_apply_on[$wtmApplyOn])) { if (file_exists($newfile)) { unlink($file); copy($newfile, $file); unlink($newfile); } } else { if (file_exists($newfile)) { if (unlink($file)) { if (copy($newfile, $file)) { $this->watermark( $file, $wtm_image_logo, $wtm_position, $watermark_margin, $watermark_image_scaling, $watermark_opacity, $watermark_margin_unit ); } } } else { if (file_exists($file)) { if (copy($file, $newfile)) { $this->watermark( $file, $wtm_image_logo, $wtm_position, $watermark_margin, $watermark_image_scaling, $watermark_opacity, $watermark_margin_unit ); }// } } } } } } /** * Create a new image from file or URL * * @param string $image Path to the JPEG image. * * @return resource */ public function imagecreatefrom($image) { $size = getimagesize($image); // Load image from file switch (strtolower($size['mime'])) { case 'image/jpeg': case 'image/pjpeg': return imagecreatefromjpeg($image); case 'image/png': return imagecreatefrompng($image); case 'image/gif': return imagecreatefromgif($image); } } /** * Opacity watermark * * @param resource $imageSrc Image resource. Not being modified. * @param float $opacity Opacity to set from 0 (fully transparent) to 1 (no change) * * @return resource Transparent image resource */ public function imagesetopacity($imageSrc, $opacity) { $width = imagesx($imageSrc); $height = imagesy($imageSrc); // Duplicate image and convert to TrueColor $imageDst = imagecreatetruecolor($width, $height); imagealphablending($imageDst, false); imagefill($imageDst, 0, 0, imagecolortransparent($imageDst)); imagecopy($imageDst, $imageSrc, 0, 0, 0, 0, $width, $height); // Set new opacity to each pixel for ($x = 0; $x < $width; ++$x) { for ($y = 0; $y < $height; ++$y) { $pixelColor = imagecolorat($imageDst, $x, $y); $pixelOpacity = 127 - (($pixelColor >> 24) & 0xFF); if ($pixelOpacity > 0) { $pixelOpacity = $pixelOpacity * $opacity; $pixelColor = ($pixelColor & 0xFFFFFF) | ((int)round(127 - $pixelOpacity) << 24); imagesetpixel($imageDst, $x, $y, $pixelColor); } } } return $imageDst; } /** * Create image with watermark logo * * @param string $image_path Path of image * @param string $logoImage_path Path of logo * @param string $position Possition of logo * @param array $watermark_margin Margin of logo * @param integer $percent Image scaling * @param integer $watermark_opacity Watermark opacity * @param integer $watermark_margin_unit Watermark margin unit * * @return void */ public function watermark($image_path, $logoImage_path, $position, $watermark_margin, $percent, $watermark_opacity, $watermark_margin_unit) { if (!file_exists($image_path)) { die('Image does not exist.'); } try { // Find base image size $image = $this->imagecreatefrom($image_path); $logoImage = $this->imagecreatefrom($logoImage_path); // opacity watermark if ((int) $watermark_opacity !== 1) { $logoImage = $this->imagesetopacity($logoImage, $watermark_opacity); } list($image_x, $image_y) = getimagesize($image_path); list($logo_x, $logo_y) = getimagesize($logoImage_path); $watermark_pos_x = 0; $watermark_pos_y = 0; // get image margin if ($watermark_margin_unit === '%') { $percent_watermark_margin = array(); $percent_watermark_margin['left'] = ($image_x / 100) * $watermark_margin['left']; $percent_watermark_margin['right'] = ($image_x / 100) * $watermark_margin['right']; $percent_watermark_margin['top'] = ($image_y / 100) * $watermark_margin['top']; $percent_watermark_margin['bottom'] = ($image_y / 100) * $watermark_margin['bottom']; $watermark_margin = $percent_watermark_margin; } // set image scaling $r = $logo_x / $logo_y; $new_width = $image_x * (int) $percent / 100; if ($new_width > $logo_x) { $new_width = $logo_x; } $new_height = $new_width / $r; if ($new_height > $logo_y) { $new_height = $logo_y; } if ($position === 'center' || (int) $position === 0) { $watermark_pos_x = ($image_x - $new_width) / 2; //watermark left $watermark_pos_y = ($image_y - $new_height) / 2; //watermark bottom } if ($position === 'top_left') { $watermark_pos_x = (int) $watermark_margin['left']; $watermark_pos_y = (int) $watermark_margin['top']; } if ($position === 'top_right') { $watermark_pos_x = $image_x - $new_width - (int) $watermark_margin['right']; $watermark_pos_y = (int) $watermark_margin['top']; } if ($position === 'bottom_right') { $watermark_pos_x = $image_x - $new_width - (int) $watermark_margin['right']; $watermark_pos_y = $image_y - $new_height - (int) $watermark_margin['bottom']; } if ($position === 'bottom_left') { $watermark_pos_x = (int) $watermark_margin['left']; $watermark_pos_y = $image_y - $new_height - (int) $watermark_margin['bottom']; } imagecopyresampled( $image, $logoImage, $watermark_pos_x, $watermark_pos_y, 0, 0, $new_width, $new_height, $logo_x, $logo_y ); // Output to the browser $imageInfo = getimagesize($image_path); switch (strtolower($imageInfo['mime'])) { case 'image/jpeg': case 'image/pjpeg': header('Content-Type: image/jpeg'); imagejpeg($image, $image_path); break; case 'image/png': header('Content-Type: image/png'); $background = imagecolorallocate($image, 0, 0, 0); // removing the black from the placeholder imagecolortransparent($image, $background); // turning off alpha blending (to ensure alpha channel information // is preserved, rather than removed (blending with the rest of the // image in the form of black)) imagealphablending($image, false); // turning on alpha channel information saving (to ensure the full range // of transparency is preserved) imagesavealpha($image, true); imagepng($image, $image_path, 9); break; case 'image/gif': header('Content-Type: image/gif'); imagegif($image, $image_path); break; case 'image/webp': header('Content-Type: image/gif'); imagewebp($image, $image_path); break; default: die('Image is of unsupported type.'); } // Destroy the images imagedestroy($image); imagedestroy($logoImage); } catch (Exception $e) { return; } } }