<?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();
<script type="text/javascript" >
var gIMGCONNApp = {
nTimerID : 0, // Идентификатор таймера
nTimerInt : 2000, // Интервал таймера
bIsFree : true, // Сервер закончил! можно делать след. шаг
nStep : 10, // Количество обработки записей за один шаг
nTimeStart : 0 // время cтарта генерации xml
};
jQuery(document).ready(function($) {
//получаем идентификатор элемента состояния
var objProc = document.getElementById("files-left");
// Если не определен то выход
if(objProc == null){ return false; }
$("#btn-start-parsing").click(function(){
// начать повторы с интервалом 2 сек
gIMGCONNApp.nTimerID = setInterval(timer_tick, gIMGCONNApp.nTimerInt);
// Сохраняем временную точку старта
gIMGCONNApp.nTimeStart = getSecondsToday();
timeStatusBarInvalidate(0);
//var date = new Date();
//console.log(date);
});
});
// получаем кол-во сегунд от начала суток
function getSecondsToday() {
var d = new Date();
return d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds();
};
// Обработчик прерываний таймера
function timer_tick(){
if (gIMGCONNApp.bIsFree){ sendAjaxStep(); }
//console.log('timer_tick');
};
function sendAjaxStep(){
gIMGCONNApp.bIsFree = false;
var data = {
action: 'img_connector_dostep',
step: gIMGCONNApp.nStep
};
// с версии 2.8 'ajaxurl' всегда определен в админке
jQuery.post( ajaxurl, data, function(response, status) {
if (status == 'success'){
//console.log('Получено с сервера: ' + response + ': Статус: ' + status +'\n');
var rsp = JSON.parse(response);
//console.log(rsp);
//document.getElementById("ew-processed-value").innerText = rsp['completed'];
// обновление прогерсс бара
// processInvalidate(rsp['completed']);
timeStatusBarInvalidate(rsp['left']);
jQuery("#files-left").text(rsp['left']);
printMessages(rsp['msgs']);
gIMGCONNApp.bIsFree = true;
if (rsp['left'] == 0) {
clearInterval(gIMGCONNApp.nTimerID);
//jQuery("#btn-download-xml").css({display: "inline-block"});
}
}
})
};
function printMessages(arrMsgs){
var s = '';
for (var i = 0; i < arrMsgs.length; i++) {
s += arrMsgs[i] + '<br/>';
}
jQuery("#status-msg").prepend(s);
}
function timeStatusBarInvalidate(completed){
var nTimeNow = getSecondsToday();
if (nTimeNow < gIMGCONNApp.nTimeStart){
nTimeNow += 86400; } // =24*60*60
var nTimeElapsed = nTimeNow - gIMGCONNApp.nTimeStart;
// var nTimeLeft = 0;
// if(completed > 0){
// nTimeLeft = nTimeElapsed*(100-completed)/completed; }
// var sBarText = "Затраченное время: " + formatTime(nTimeElapsed) +
// "; Осталось времени: " + formatTime(nTimeLeft);
jQuery("#time-elapsed").text(formatTime(nTimeElapsed));
// jQuery("#time-left").text(formatTime(nTimeLeft));
};
function formatTime(secnum){
secnum = Math.floor(secnum);
var hours = Math.floor(secnum / 3600);
var minutes = Math.floor((secnum - (hours * 3600)) / 60);
var seconds = secnum - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return hours+' : '+minutes+' : '+seconds;
};
function processInvalidate(percent){
document.getElementById('progress-text').innerHTML = percent + ' %';
document.getElementById('progress-bar').style.width = percent * 7 + 'px';
};
</script>
do_action('tesp_show_widget');
в нужное админки. 'woocommerce_shop_loop'
и считать обращения и на пятом или десятом вставлять свой код? woocommerce_cart_calculate_fees
Или же, если есть другой способ создания уникальных надписей для товаров,