<?php /** * Astra Site Helper * * @since 1.0.0 * @package Astra Sites */ if ( ! class_exists( 'Astra_Sites_Helper' ) ) : /** * Astra_Sites_Helper * * @since 1.0.0 */ class Astra_Sites_Helper { /** * Instance * * @access private * @var object Instance * @since 1.0.0 */ private static $instance; /** * Initiator * * @since 1.0.0 * @return object initialized object of class. */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Constructor * * @since 1.0.0 */ public function __construct() { add_filter( 'wie_import_data', array( $this, 'custom_menu_widget' ) ); add_filter( 'wp_prepare_attachment_for_js', array( $this, 'add_svg_image_support' ), 10, 3 ); } /** * Add svg image support * * @since 1.1.5 * * @param array $response Attachment response. * @param object $attachment Attachment object. * @param array $meta Attachment meta data. */ public function add_svg_image_support( $response, $attachment, $meta ) { if ( ! function_exists( 'simplexml_load_file' ) ) { return $response; } if ( ! empty( $response['sizes'] ) ) { return $response; } if ( 'image/svg+xml' !== $response['mime'] ) { return $response; } $svg_path = get_attached_file( $attachment->ID ); $dimensions = self::get_svg_dimensions( $svg_path ); $response['sizes'] = array( 'full' => array( 'url' => $response['url'], 'width' => $dimensions->width, 'height' => $dimensions->height, 'orientation' => $dimensions->width > $dimensions->height ? 'landscape' : 'portrait', ), ); return $response; } /** * Get SVG Dimensions * * @since 1.1.5 * * @param string $svg SVG file path. * @return array Return SVG file height & width for valid SVG file. */ public static function get_svg_dimensions( $svg ) { $svg = simplexml_load_file( $svg ); if ( false === $svg ) { $width = '0'; $height = '0'; } else { $attributes = $svg->attributes(); $width = (string) $attributes->width; $height = (string) $attributes->height; } return (object) array( 'width' => $width, 'height' => $height, ); } /** * Custom Menu Widget * * In widget export we set the nav menu slug instead of ID. * So, In import process we check get menu id by slug and set * it in import widget process. * * @since 1.0.7 * * @param object $all_sidebars Widget data. * @return object Set custom menu id by slug. */ public function custom_menu_widget( $all_sidebars ) { // Get current menu ID & Slugs. $menu_locations = array(); $nav_menus = (object) wp_get_nav_menus(); if ( isset( $nav_menus ) ) { foreach ( $nav_menus as $menu_key => $menu ) { if ( is_object( $menu ) ) { $menu_locations[ $menu->term_id ] = $menu->slug; } } } // Import widget data. $all_sidebars = (object) $all_sidebars; foreach ( $all_sidebars as $widgets_key => $widgets ) { foreach ( $widgets as $widget_key => $widget ) { // Found slug in current menu list. if ( isset( $widget->nav_menu ) ) { $menu_id = array_search( $widget->nav_menu, $menu_locations, true ); if ( ! empty( $menu_id ) ) { $all_sidebars->$widgets_key->$widget_key->nav_menu = $menu_id; } } } } return $all_sidebars; } /** * Download File Into Uploads Directory * * @since 2.1.0 Added $overrides argument to override the uploaded file actions. * * @param string $file Download File URL. * @param array $overrides Upload file arguments. * @param int $timeout_seconds Timeout in downloading the XML file in seconds. * @return array Downloaded file data. */ public static function download_file( $file = '', $overrides = array(), $timeout_seconds = 300 ) { // Gives us access to the download_url() and wp_handle_sideload() functions. require_once ABSPATH . 'wp-admin/includes/file.php'; // Download file to temp dir. $temp_file = download_url( $file, $timeout_seconds ); // WP Error. if ( is_wp_error( $temp_file ) ) { return array( 'success' => false, 'data' => $temp_file->get_error_message(), ); } // Array based on $_FILE as seen in PHP file uploads. $file_args = array( 'name' => basename( $file ), 'tmp_name' => $temp_file, 'error' => 0, 'size' => filesize( $temp_file ), ); $defaults = array( // Tells WordPress to not look for the POST form // fields that would normally be present as // we downloaded the file from a remote server, so there // will be no form fields // Default is true. 'test_form' => false, // Setting this to false lets WordPress allow empty files, not recommended. // Default is true. 'test_size' => true, // A properly uploaded file will pass this test. There should be no reason to override this one. 'test_upload' => true, 'mimes' => array( 'xml' => 'text/xml', 'json' => 'text/plain', ), ); $overrides = wp_parse_args( $overrides, $defaults ); // Move the temporary file into the uploads directory. $results = wp_handle_sideload( $file_args, $overrides ); astra_sites_error_log( wp_json_encode( $results ) ); if ( isset( $results['error'] ) ) { return array( 'success' => false, 'data' => $results, ); } // Success. return array( 'success' => true, 'data' => $results, ); } /** * Downloads an image from the specified URL. * * Taken from the core media_sideload_image() function and * modified to return an array of data instead of html. * * @since 1.0.10 * * @param string $file The image file path. * @return array An array of image data. */ public static function sideload_image( $file ) { $data = new stdClass(); if ( ! function_exists( 'media_handle_sideload' ) ) { require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; } if ( ! empty( $file ) ) { // Set variables for storage, fix file filename for query strings. preg_match( '/[^\?]+\.(jpe?g|jpe|svg|gif|png)\b/i', $file, $matches ); $file_array = array(); $file_array['name'] = basename( $matches[0] ); // Download file to temp location. $file_array['tmp_name'] = download_url( $file ); // If error storing temporarily, return the error. if ( is_wp_error( $file_array['tmp_name'] ) ) { return $file_array['tmp_name']; } // Do the validation and storage stuff. $id = media_handle_sideload( $file_array, 0 ); // If error storing permanently, unlink. if ( is_wp_error( $id ) ) { unlink( $file_array['tmp_name'] ); return $id; } // Build the object to return. $meta = wp_get_attachment_metadata( $id ); $data->attachment_id = $id; $data->url = wp_get_attachment_url( $id ); $data->thumbnail_url = wp_get_attachment_thumb_url( $id ); $data->height = isset( $meta['height'] ) ? $meta['height'] : ''; $data->width = isset( $meta['width'] ) ? $meta['width'] : ''; } return $data; } /** * Extract image URLs and other URLs from a given HTML content. * * @since 2.6.10 * * @param string $content HTML content string. * @return array Array of URLS. */ public static function extract_segregated_urls( $content ) { // Extract all links. preg_match_all( '#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $content, $match ); $extracts = array( 'image' => array(), 'other' => array(), ); $all_links = array_unique( $match[0] ); // Not have any link. if ( empty( $all_links ) ) { return array(); } $image_links = array(); $other_links = array(); // Extract normal and image links. foreach ( $all_links as $key => $link ) { if ( preg_match( '/^((https?:\/\/)|(www\.))([a-z0-9-].?)+(:[0-9]+)?\/[\w\-]+\.(jpg|png|gif|jpeg)\/?$/i', $link ) ) { // Get all image links. // Avoid *-150x, *-300x and *-1024x images. if ( false === strpos( $link, '-150x' ) && false === strpos( $link, '-300x' ) && false === strpos( $link, '-1024x' ) ) { $image_links[] = $link; } } else { // Collect other links. $other_links[] = $link; } } $extracts['image'] = $image_links; $extracts['other'] = $other_links; return $extracts; } /** * Get the client IP address. * * @since 2.6.4 */ public static function get_client_ip() { $ipaddress = ''; if ( getenv( 'HTTP_CLIENT_IP' ) ) { $ipaddress = getenv( 'HTTP_CLIENT_IP' ); } elseif ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) { $ipaddress = getenv( 'HTTP_X_FORWARDED_FOR' ); } elseif ( getenv( 'HTTP_X_FORWARDED' ) ) { $ipaddress = getenv( 'HTTP_X_FORWARDED' ); } elseif ( getenv( 'HTTP_FORWARDED_FOR' ) ) { $ipaddress = getenv( 'HTTP_FORWARDED_FOR' ); } elseif ( getenv( 'HTTP_FORWARDED' ) ) { $ipaddress = getenv( 'HTTP_FORWARDED' ); } elseif ( getenv( 'REMOTE_ADDR' ) ) { $ipaddress = getenv( 'REMOTE_ADDR' ); } else { $ipaddress = 'UNKNOWN'; } return $ipaddress; } } /** * Kicking this off by calling 'get_instance()' method */ Astra_Sites_Helper::get_instance(); endif;