<?php
/**
* Класс для подключения изображения к товару
*/
class Hml_Img_Connector {
/**
*
*/
public static function init(){
add_action('tesp_show_widget', array('Hml_Img_Connector', 'get_html_widget') );
// подключаем ajax хуки
if( defined('DOING_AJAX') && DOING_AJAX ){
add_action('wp_ajax_img_connector_dostep', array('Hml_Img_Connector', 'dostep_ajax_handler') );
}
}
public static function dostep_ajax_handler(){
$imgs = self::get_array_images(TEST__PLUGIN_DIR . 'imgs/');
// сортировка по убыванию
usort($imgs, function($a, $b){
if ($a['name'] == $b['name']) {
return 0;
}
return ($a['name'] > $b['name']) ? -1 : 1;
});
$msgs = self::process_images($imgs, 2);
$aAns = array('left'=>count($imgs), 'msgs'=>$msgs);
echo json_encode($aAns);
wp_die();
}
/**
* Запускает процесс подключения картинок
*
*/
private static function process_images(&$imgs, $step){
$msgs = array();
if ( $step < 1 ) { $step = 1; }
for ($i = count($imgs) - 1; $i >= 0 ; $i--) {
$sku = '9999';
// отделяем все, что после символа "_"
$fn = explode( '_', $imgs[$i]['name'])[0];
$sku_parts = explode('-', $fn);
if (count($sku_parts) >= 4 && '111' == $sku_parts[3] ) {
$sku = implode( '-', array_slice($sku_parts, 0,4) );
} else {
$sku = implode( '-', array_slice($sku_parts, 0,3) );
}
// $sku = substr($imgs[$i]['name'], 0, 12);
$id = wc_get_product_id_by_sku($sku);
if ( !$id ){
$msgs[] = $imgs[$i]['name']. ' - ошибка, артикул "' . $sku . '" не найден.';
$edir = dirname(dirname($imgs[$i]['path'])) . '/notfound/';
$newpath = $edir . $imgs[$i]['name'];
if ( is_dir($edir) ) {
rename($imgs[$i]['path'], $newpath);
} else {
if ( mkdir($edir) ) {
rename($imgs[$i]['path'], $newpath);
} else {
@unlink( $imgs[$i]['path'] );
}
}
} else {
$media_id = self::atach_image($imgs[$i], $id);
if( is_wp_error($media_id) ) {
$msgs[] = $imgs[$i]['name']. ' - ошибка загрузки.';
} else {
$msgs[] = $imgs[$i]['name']. ' - успешно.';
}
array_pop($imgs);
$step --;
if ( 0 == $step ) break;
}
}
return $msgs;
}
/**
* собираем все файлы картинок в директории
*/
private static function get_array_images($dir){
$ret = array();
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
$fullpath = $dir . $file;
if ( !is_dir( $fullpath ) ) {
$ext = pathinfo($fullpath)['extension'];
if ( 'jpg' == strtolower($ext) ) {
$ret[] = array('name' => $file, 'path' => $fullpath);
}
}
}
clearstatcache(); // очистка кэша
closedir($handle);
}
return $ret;
}
/**
* By Pytex
* Добавляет картинку в медиабиблиотеку и
* прикрепляет ее к посту как миниатюру, если не задано
* или в галерею поста
*
* @param string $img
* @param number $post_id
*/
private static function atach_image( $img, $post_id ) {
// Установим данные файла
$file_array = array();
// Получаем имя файла
$file_array['name'] = $img['name'] ;
$file_array['tmp_name'] = $img['path'];
// загружаем файл
$media_id = media_handle_sideload( $file_array, $post_id);
// Проверяем на наличие ошибок
if( !is_wp_error($media_id) ) {
// Файл сохранён и добавлен в медиатеку WP.
$thumbnail_id = get_post_thumbnail_id( $post_id );
// Если нет прикрепленной миниатюры
if ( !$thumbnail_id ){
// назначаем в качестве обложки
set_post_thumbnail($post_id, $media_id);
} else {
$media = get_attached_media('image', $post_id);
$imgs = array_diff(array_keys($media), array($thumbnail_id));
update_post_meta($post_id, '_product_image_gallery', implode(',', $imgs));
}
}
return $media_id;
}
/**
* Выводит на экран форму запуска процесса добавления картинок
*/
public static function get_html_widget(){
?>
<form action="" method="POST">
<h4>Подключение картинок</h4>
<table>
<tr>
<td>Затраченное время:</td>
<td><span id="time-elapsed" class="tsb-value"></span></td></tr>
<tr>
<td>Осталось времени:</td>
<td><span id="time-left" class="tsb-value"></span></td></tr>
<tr>
<td>Осталось обработать файлов:</td>
<td><span id="files-left" class="tsb-value"></span></td></tr>
</table>
<br/>
<?php
echo '<input type="button" id="btn-start-parsing" value="Запустить разбор картинок" class="button button-primary" ' ;?>
</form>
<div id="status-msg"></div>
<?php
require_once( 'img-connector-js.php' );
}
}
Hml_Img_Connector::init();