@Oslar

Имеется ли плагин для вордпресса, который автоматом выбирает картинки по тайтлу при добавлении в запись?

То есть, я за ранее загрузил стопку картинок для разных ключей.
И мне нужно чтобы при добавлении картинок в запись
5cd5190d77258058569220.jpeg

Они автоматом находились и выбирались в галереи по тайтлу в записи или может есть какой-то другой плагин, подобный.
5cd51966eac30392505620.jpeg

К примеру залил я для 100 ключей 3000 картинок (они все пронумерованы названием самого ключа, к примеру вот так Картинки для ватсапа женские - подборка (1).jpg), и чтобы потом для каждой записи не искать вручную нужные картинки под ключ, хотелось бы чтобы они сами автоматов нашлись, и я просто начал кнопку вставить в запись.
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 1
Такое не встречал,
Но писал код подгрузки картинок из определенной папки, добавление их в медиа-библиотеку, и подключение к постам (к товарам Woocommerce) по соответствию артикула и в названии картинки.

Если будете править, то вот
php
<?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();


т.к. процедура долгая, код написан как обработчик периодических ajax запросов
просто стучитесь с админки в этот код

js
<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'); в нужное админки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы