Files
wp-multisite-waas/inc/helpers/class-screenshot.php
David Stone a815fdf179 Prep Plugin for release on WordPress.org
Escape everything that should be escaped.
Add nonce checks where needed.
Sanitize all inputs.
Apply Code style changes across the codebase.
Correct many deprecation notices.
Optimize load order of many filters.
2025-04-07 09:15:21 -06:00

130 lines
3.0 KiB
PHP

<?php
/**
* Takes screenshots from websites.
*
* @package WP_Ultimo
* @subpackage Helper
* @since 2.0.0
*/
namespace WP_Ultimo\Helpers;
use Psr\Log\LogLevel;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* Takes screenshots from websites.
*
* @since 2.0.0
*/
class Screenshot {
/**
* Returns the api link for the screenshot.
*
* @since 2.0.0
*
* @param string $domain Original site domain.
*/
public static function api_url($domain): string {
return 'https://image.thum.io/get/' . $domain;
}
/**
* Takes in a URL and creates it as an attachment.
*
* @since 2.0.0
*
* @param string $url Image URL to download.
* @return string|false
*/
public static function take_screenshot($url) {
$url = self::api_url($url);
return self::save_image_from_url($url);
}
/**
* Downloads the image from the URL.
*
* @since 2.0.0
*
* @param string $url Image URL to download.
* @return int|false
*/
public static function save_image_from_url($url) {
// translators: %s is the API URL.
$log_prefix = sprintf(__('Downloading image from "%s":'), $url) . ' ';
$response = wp_remote_get(
$url,
[
'timeout' => 50,
]
);
if (wp_remote_retrieve_response_code($response) !== 200) {
wu_log_add('screenshot-generator', $log_prefix . wp_remote_retrieve_response_message($response), LogLevel::ERROR);
return false;
}
if (is_wp_error($response)) {
wu_log_add('screenshot-generator', $log_prefix . $response->get_error_message(), LogLevel::ERROR);
return false;
}
/*
* Check if the results contain a PNG header.
*/
if (! str_starts_with($response['body'], "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a")) {
wu_log_add('screenshot-generator', $log_prefix . __('Result is not a PNG file.', 'wp-multisite-waas'), LogLevel::ERROR);
return false;
}
$upload = wp_upload_bits('screenshot-' . gmdate('Y-m-d-H-i-s') . '.png', null, $response['body']);
if ( ! empty($upload['error'])) {
wu_log_add('screenshot-generator', $log_prefix . wp_json_encode($upload['error']), LogLevel::ERROR);
return false;
}
$file_path = $upload['file'];
$file_name = basename($file_path);
$file_type = wp_check_filetype($file_name, null);
$attachment_title = sanitize_file_name(pathinfo($file_name, PATHINFO_FILENAME));
$wp_upload_dir = wp_upload_dir();
$post_info = [
'guid' => $wp_upload_dir['url'] . '/' . $file_name,
'post_mime_type' => $file_type['type'],
'post_title' => $attachment_title,
'post_content' => '',
'post_status' => 'inherit',
];
// Create the attachment
$attach_id = wp_insert_attachment($post_info, $file_path);
// Include image.php
require_once ABSPATH . 'wp-admin/includes/image.php';
// Define attachment metadata
$attach_data = wp_generate_attachment_metadata($attach_id, $file_path);
// Assign metadata to attachment
wp_update_attachment_metadata($attach_id, $attach_data);
wu_log_add('screenshot-generator', $log_prefix . __('Success!', 'wp-multisite-waas'));
return $attach_id;
}
}