193 lines
4.3 KiB
PHP
193 lines
4.3 KiB
PHP
|
<?php
|
||
|
defined( 'WPINC' ) or die;
|
||
|
|
||
|
/**
|
||
|
* Downloads and updates images.
|
||
|
*
|
||
|
* @since 1.6
|
||
|
*/
|
||
|
class GeneratePress_Sites_Image_Importer {
|
||
|
|
||
|
/**
|
||
|
* Images IDs
|
||
|
*
|
||
|
* @var array The Array of already image IDs.
|
||
|
* @since 1.6
|
||
|
*/
|
||
|
private $already_imported_ids = array();
|
||
|
|
||
|
/**
|
||
|
* Constructor
|
||
|
*
|
||
|
* @since 1.6
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
|
||
|
if ( ! function_exists( 'WP_Filesystem' ) ) {
|
||
|
require_once ABSPATH . 'wp-admin/includes/file.php';
|
||
|
}
|
||
|
|
||
|
WP_Filesystem();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Process Image Download
|
||
|
*
|
||
|
* @since 1.6
|
||
|
* @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.6
|
||
|
* @param string $attachment_url Attachment URL.
|
||
|
* @return string Hash string.
|
||
|
*/
|
||
|
private function get_hash_image( $attachment_url ) {
|
||
|
return sha1( $attachment_url );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Saved Image.
|
||
|
*
|
||
|
* @since 1.6
|
||
|
* @param string $attachment Attachment Data.
|
||
|
* @return string Hash string.
|
||
|
*/
|
||
|
private function get_saved_image( $attachment ) {
|
||
|
|
||
|
global $wpdb;
|
||
|
|
||
|
// Already imported? Then return!
|
||
|
if ( isset( $this->already_imported_ids[ $attachment['id'] ] ) ) {
|
||
|
GeneratePress_Sites_Helper::log( 'Successfully replaced: ' . $attachment['url'] );
|
||
|
|
||
|
return $this->already_imported_ids[ $attachment['id'] ];
|
||
|
}
|
||
|
|
||
|
// 1. Is already imported in Batch Import Process?
|
||
|
$post_id = $wpdb->get_var(
|
||
|
$wpdb->prepare(
|
||
|
'SELECT `post_id` FROM `' . $wpdb->postmeta . '`
|
||
|
WHERE `meta_key` = \'_generatepress_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 = preg_replace( '/\\.[^.\\s]{3,4}$/', '', basename( $attachment['url'] ) );
|
||
|
|
||
|
$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 . '%'
|
||
|
)
|
||
|
);
|
||
|
|
||
|
GeneratePress_Sites_Helper::log( 'Successfully replaced: ' . $attachment['url'] );
|
||
|
}
|
||
|
|
||
|
if ( $post_id ) {
|
||
|
$new_attachment = array(
|
||
|
'id' => $post_id,
|
||
|
'url' => wp_get_attachment_url( $post_id ),
|
||
|
);
|
||
|
|
||
|
$this->already_imported_ids[ $attachment['id'] ] = $new_attachment;
|
||
|
|
||
|
return $new_attachment;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Import Image
|
||
|
*
|
||
|
* @since 1.6
|
||
|
* @param array $attachment Attachment array.
|
||
|
* @return array Attachment array.
|
||
|
*/
|
||
|
public function import( $attachment ) {
|
||
|
|
||
|
$saved_image = $this->get_saved_image( $attachment );
|
||
|
|
||
|
if ( $saved_image ) {
|
||
|
return $saved_image;
|
||
|
}
|
||
|
|
||
|
$file_content = wp_remote_retrieve_body( wp_safe_remote_get( $attachment['url'] ) );
|
||
|
|
||
|
// Empty file content?
|
||
|
if ( empty( $file_content ) ) {
|
||
|
GeneratePress_Sites_Helper::log( 'Failed to replace: ' . $attachment['url'] );
|
||
|
GeneratePress_Sites_Helper::log( 'Error: Failed wp_remote_retrieve_body().' );
|
||
|
|
||
|
return $attachment;
|
||
|
}
|
||
|
|
||
|
// Extract the file name and extension from the URL.
|
||
|
$filename = basename( $attachment['url'] );
|
||
|
|
||
|
$upload = wp_upload_bits(
|
||
|
$filename,
|
||
|
null,
|
||
|
$file_content
|
||
|
);
|
||
|
|
||
|
$post = array(
|
||
|
'post_title' => $filename,
|
||
|
'guid' => $upload['url'],
|
||
|
);
|
||
|
|
||
|
$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, '_generatepress_sites_image_hash', $this->get_hash_image( $attachment['url'] ) );
|
||
|
|
||
|
$new_attachment = array(
|
||
|
'id' => $post_id,
|
||
|
'url' => $upload['url'],
|
||
|
);
|
||
|
|
||
|
GeneratePress_Sites_Helper::log( 'Successfully replaced: ' . $attachment['url'] );
|
||
|
|
||
|
$this->already_imported_ids[ $attachment['id'] ] = $new_attachment;
|
||
|
|
||
|
return $new_attachment;
|
||
|
}
|
||
|
}
|