admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('image_hub_nonce'),
'adminUrl' => admin_url(),
'assetBaseUrl' => IMAGE_HUB_ROOT_URL . '/assets',
'imageUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/logo-color.svg',
'openverseLogoUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/openverse.png',
'giphyLogoUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/giphy.png',
'giphyAttrUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/giphy-attr.png',
'unsplashLogoUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/unsplash.png',
'pixabayLogoUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/pixabay.png',
'transparentBG' => IMAGE_HUB_ROOT_URL . '/assets/images/transparent-bg.jpg',
'pexelsLogoUrl' => IMAGE_HUB_ROOT_URL . '/assets/images/pexels.png',
'server_url' => Utils::get_service_url(),
'version' => Utils::get_version(),
));
}
static function get_asset_prop($name, $prop)
{
$filepath = IMAGE_HUB_ROOT_DIR . 'build/' . $name . '.asset.php';
$filepath = str_replace('\\', '/', $filepath);
if (!file_exists($filepath)) {
return null;
}
$assets = include $filepath;
$assets['script'] = IMAGE_HUB_ROOT_URL . '//build/' . $name . '.js';
if (!is_array($assets) || !array_key_exists($prop, $assets)) {
return null;
}
return $assets[$prop];
}
static function enque_image_hub_script($name, $args = false)
{
$dependencies = Utils::get_asset_prop($name, 'dependencies');
// Check if the asset name is 'media-modal'
if ($name == 'media-modal') {
// Add 'media-views' to the dependencies array if it's not already there
if (!in_array('media-views', $dependencies)) {
$dependencies[] = 'media-views';
}
}
wp_enqueue_script(
'image-hub-' . $name,
Utils::get_asset_prop($name, 'script'),
$dependencies,
Utils::get_asset_prop($name, 'version'),
$args
);
}
/**
* Returns the service URL using development or production values.
*/
static function get_service_url()
{
$svc_temp_url = defined("IMAGE_HUB_DEV_SERVICE_URL") ? IMAGE_HUB_DEV_SERVICE_URL : IMAGE_HUB_SERVICE_URL;
return $svc_temp_url;
}
/**
* Returns the version for the plugin.
*/
static function get_version()
{
$temp_version = defined("IMAGE_HUB_DEV_VERSION") ? IMAGE_HUB_DEV_VERSION : IMAGE_HUB_VERSION;
return $temp_version == "@@buildnumber@@" ? time() : $temp_version;
}
/**
* Creates an attribution string.
*/
static function create_attribution($provider, $link, $username)
{
if (empty($provider) || empty($link) || empty($username)) {
return '';
}
$providerFormatted = ucfirst(strtolower($provider));
return sprintf(
'Photo by %s on %s',
esc_url($link),
esc_html($username),
esc_attr($provider),
esc_html($providerFormatted)
);
}
/**
* Downloads an image, performs sanity checks, and sideloads it into the media library.
*/
static function download_image($image_url, $description)
{
add_filter('http_headers_useragent', static function () {
return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.2 Safari/537.36';
});
$tmp = download_url($image_url);
if (is_wp_error($tmp)) {
return $tmp;
}
$path_info = pathinfo(wp_parse_url($image_url, PHP_URL_PATH));
$filename = isset($path_info['filename']) ? sanitize_file_name($path_info['filename']) : 'image';
$mime_type = mime_content_type($tmp);
$mime_extension_map = [
'image/jpeg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/webp' => 'webp',
'image/svg+xml' => 'svg',
];
$extension = isset($path_info['extension']) ? strtolower($path_info['extension']) : '';
if (!$extension || !isset($mime_extension_map[$mime_type])) {
$extension = $mime_extension_map[$mime_type] ?? 'jpg';
}
if (empty($extension)) {
@wp_delete_file($tmp);
return new \WP_Error('invalid_file_type', "Could not determine file type.");
}
$desired_filename = "{$filename}.{$extension}";
$file = [
'name' => $desired_filename,
'type' => $mime_type,
'tmp_name' => $tmp,
'error' => 0,
'size' => filesize($tmp),
];
$image_id = media_handle_sideload($file, 0, $description);
if (is_wp_error($image_id)) {
@wp_delete_file($tmp);
return $image_id;
}
return $image_id;
}
/**
* Renames a downloaded image file.
*/
static function rename_image($file_path, $new_name, $image_id)
{
$file_info = pathinfo($file_path);
$new_filename = sanitize_file_name($new_name . '.' . $file_info['extension']);
$new_file_path = $file_info['dirname'] . '/' . $new_filename;
global $wp_filesystem;
if (! function_exists('WP_Filesystem')) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
WP_Filesystem();
if ($wp_filesystem->move($file_path, $new_file_path)) {
update_attached_file($image_id, $new_file_path);
wp_update_post([
'ID' => $image_id,
'post_title' => $new_filename,
'post_name' => sanitize_title($new_filename),
]);
}
return $new_file_path;
}
/**
* Resizes an image if maximum dimensions are set.
*/
static function resize_image($file_path)
{
if (
!isset($_POST['nonce']) ||
!wp_verify_nonce(sanitize_key(wp_unslash($_POST['nonce'])), 'image_hub_nonce')
) {
wp_send_json_error('Nonce verification failed.');
}
if (isset($_POST['provider']) && $_POST['provider'] === 'unsplash') {
// error_log( 'Unsplash image detected, skipping resize.' );
return;
}
$editor = wp_get_image_editor($file_path);
if (is_wp_error($editor)) {
return;
}
$max_width = get_option('image_hub_max_image_width');
$max_height = get_option('image_hub_max_image_height');
if ($max_width || $max_height) {
$editor->resize($max_width, $max_height, false);
$editor->save($file_path);
}
}
/**
* Updates attachment metadata.
*/
static function update_attachment_data($image_id, $data, $file_path)
{
$attachment_data = [
'ID' => $image_id,
'post_title' => $data['title'],
'post_content' => $data['description'],
];
if (get_option('image_hub_enable_image_attribution', false)) {
$attachment_data['post_excerpt'] = $data['caption'];
}
wp_update_post($attachment_data);
if (!empty($data['alt'])) {
update_post_meta($image_id, '_wp_attachment_image_alt', $data['alt']);
}
$attach_data = wp_generate_attachment_metadata($image_id, $file_path);
wp_update_attachment_metadata($image_id, $attach_data);
}
}