File "class-astra-sites-image-importer.php"
Full Path: /home/warrior1/public_html/plugins/astra-sites/inc/importers/batch-processing/helpers/class-astra-sites-image-importer.php
File size: 6.34 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Image Importer
*
* @see https://github.com/elementor/elementor/blob/master/includes/template-library/classes/class-import-images.php
*
* => How to use?
*
* $image = array(
* 'url' => '<image-url>',
* 'id' => '<image-id>',
* );
*
* $downloaded_image = Astra_Sites_Image_Importer::get_instance()->import( $image );
*
* @package Astra Sites
* @since 1.0.14
*/
if ( ! class_exists( 'Astra_Sites_Image_Importer' ) ) :
/**
* Astra Sites Image Importer
*
* @since 1.0.14
*/
class Astra_Sites_Image_Importer {
/**
* Instance
*
* @since 1.0.14
* @var object Class object.
* @access private
*/
private static $instance;
/**
* Images IDs
*
* @var array The Array of already image IDs.
* @since 1.0.14
*/
private $already_imported_ids = array();
/**
* Initiator
*
* @since 1.0.14
* @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.14
*/
public function __construct() {
if ( ! function_exists( 'WP_Filesystem' ) ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
WP_Filesystem();
}
/**
* Process Image Download
*
* @since 1.0.14
* @param array $attachments Attachment array.
* @return array Attachment array.
*/
public function process( $attachments ) {
$downloaded_images = array();
foreach ( $attachments as $key => $attachment ) {
$downloaded_images[] = $this->import( $attachment );
}
return $downloaded_images;
}
/**
* Get Hash Image.
*
* @since 1.0.14
* @param string $attachment_url Attachment URL.
* @return string Hash string.
*/
public function get_hash_image( $attachment_url ) {
return sha1( $attachment_url );
}
/**
* Get Saved Image.
*
* @since 1.0.14
* @param string $attachment Attachment Data.
* @return string Hash string.
*/
private function get_saved_image( $attachment ) {
if ( apply_filters( 'astra_sites_image_importer_skip_image', false, $attachment ) ) {
Astra_Sites_Importer_Log::add( 'BATCH - SKIP Image - {from filter} - ' . $attachment['url'] . ' - Filter name `astra_sites_image_importer_skip_image`.' );
return array(
'status' => true,
'attachment' => $attachment,
);
}
global $wpdb;
// 1. Is already imported in Batch Import Process?
$post_id = $wpdb->get_var(
$wpdb->prepare(
'SELECT `post_id` FROM `' . $wpdb->postmeta . '`
WHERE `meta_key` = \'_astra_sites_image_hash\'
AND `meta_value` = %s
;',
$this->get_hash_image( $attachment['url'] )
)
);
// 2. Is image already imported though XML?
if ( empty( $post_id ) ) {
// Get file name without extension.
// To check it exist in attachment.
$filename = basename( $attachment['url'] );
// Find the attachment by meta value.
// Code reused from Elementor plugin.
$post_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta}
WHERE meta_key = '_wp_attached_file'
AND meta_value LIKE %s",
'%/' . $filename . '%'
)
);
Astra_Sites_Importer_Log::add( 'BATCH - SKIP Image {already imported from xml} - ' . $attachment['url'] );
}
if ( $post_id ) {
$new_attachment = array(
'id' => $post_id,
'url' => wp_get_attachment_url( $post_id ),
);
$this->already_imported_ids[] = $post_id;
return array(
'status' => true,
'attachment' => $new_attachment,
);
}
return array(
'status' => false,
'attachment' => $attachment,
);
}
/**
* Import Image
*
* @since 1.0.14
* @param array $attachment Attachment array.
* @return array Attachment array.
*/
public function import( $attachment ) {
if ( isset( $attachment['url'] ) && ! astra_sites_is_valid_url( $attachment['url'] ) ) {
return $attachment;
}
Astra_Sites_Importer_Log::add( 'Source - ' . $attachment['url'] );
$saved_image = $this->get_saved_image( $attachment );
Astra_Sites_Importer_Log::add( 'Log - ' . wp_json_encode( $saved_image['attachment'] ) );
if ( $saved_image['status'] ) {
return $saved_image['attachment'];
}
$file_content = wp_remote_retrieve_body(
wp_safe_remote_get(
$attachment['url'],
array(
'timeout' => '60',
'sslverify' => false,
)
)
);
// Empty file content?
if ( empty( $file_content ) ) {
Astra_Sites_Importer_Log::add( 'BATCH - FAIL Image {Error: Failed wp_remote_retrieve_body} - ' . $attachment['url'] );
return $attachment;
}
// Extract the file name and extension from the URL.
$filename = basename( $attachment['url'] );
$upload = wp_upload_bits( $filename, null, $file_content );
astra_sites_error_log( $filename );
astra_sites_error_log( wp_json_encode( $upload ) );
$post = array(
'post_title' => $filename,
'guid' => $upload['url'],
);
astra_sites_error_log( wp_json_encode( $post ) );
$info = wp_check_filetype( $upload['file'] );
if ( $info ) {
$post['post_mime_type'] = $info['type'];
} else {
// For now just return the origin attachment.
return $attachment;
}
$post_id = wp_insert_attachment( $post, $upload['file'] );
wp_update_attachment_metadata(
$post_id,
wp_generate_attachment_metadata( $post_id, $upload['file'] )
);
update_post_meta( $post_id, '_astra_sites_image_hash', $this->get_hash_image( $attachment['url'] ) );
Astra_WXR_Importer::instance()->track_post( $post_id );
$new_attachment = array(
'id' => $post_id,
'url' => $upload['url'],
);
Astra_Sites_Importer_Log::add( 'BATCH - SUCCESS Image {Imported} - ' . $new_attachment['url'] );
$this->already_imported_ids[] = $post_id;
return $new_attachment;
}
/**
* Is Image URL
*
* @since 1.3.10
*
* @param string $url URL.
* @return boolean
*/
public function is_image_url( $url = '' ) {
if ( empty( $url ) ) {
return false;
}
if ( astra_sites_is_valid_image( $url ) ) {
return true;
}
return false;
}
}
/**
* Kicking this off by calling 'get_instance()' method
*/
Astra_Sites_Image_Importer::get_instance();
endif;