Ответы пользователя по тегу WordPress
  • Как используя ajax получить только конкретные данные на wordpress?

    Вам правильно сказали, почитайте про Ajax в WordPress . Например здесь

    А всю страницу вы получаете, т.к. запрос делаете на получение целой страницы.
    Ответ написан
    Комментировать
  • Почему шаблон в WordPress игнорирует новые стили?

    Кэш браузера почистите или смотрите в режиме инкогнито
    Ответ написан
    Комментировать
  • Как в WordPress присвоить категорию для 20 000 записей?

    если ссылки верные, то последний элемент ссылки это слаг записи, а по нему можно выудить id записи, далее через wp_set_object_terms можно подключить запись к категории.
    Ответ написан
    Комментировать
  • Как вставить шорткод для wordpress через javascript?

    Если Вы хотите позволить пользователям запускать пользовательские шорткоды, то это дыра в безопасности.
    Если у Вас есть список готовых и Вы выбираете нужный на фронте, то отправляйте по ajax id шорткода, а на сервере условной логикой выполняйте нужный.
    А вообще сложно представить необходимость данной задачи.
    Ответ написан
    Комментировать
  • Как импортировать контент из БД самописной CMS в WordPress?

    Я думаю Вам надежнее будет воспользоваться каким нибудь плагином импорта.

    Свои данные выгрузите в excel, разберите их по шаблону файла импорта для выбранного плагина, и загрузите на wordpress. Плагин сам расставит все по нужным местам.
    Ответ написан
  • Можно ли мои вариации товара задать сразу всем товарам wooccomerce?

    Если у всех одинаковые вариации, зачем товары вариативными делали?

    Плагин не знаю, кодом можно пробежать по каждому товару и добавить по вариации.
    Ответ написан
  • Имеется ли плагин для вордпресса, который автоматом выбирает картинки по тайтлу при добавлении в запись?

    Такое не встречал,
    Но писал код подгрузки картинок из определенной папки, добавление их в медиа-библиотеку, и подключение к постам (к товарам 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'); в нужное админки.
    Ответ написан
    Комментировать
  • Как добавить доп. поля в форму добавления постов в WordPress?

    Если я правильно понял задачу, то Advanced Custom Fields - это то что Вам поможет
    Ответ написан
    Комментировать
  • Как вывести баннер в цикле продуктов woocommerce?

    Так а что мешает кинуть обработчик 'woocommerce_shop_loop' и считать обращения и на пятом или десятом вставлять свой код?
    Ответ написан
  • Как в Woocommerce изменить сумму заказа?

    Ну как решение, можно из калькулятора js передавать сумму без учёта стоимости товара, т.е. только надбавку или скидку. Потом на сервере добавлять её в заказ как отдельный пункт расхода. Тогда все последующие этапы оплаты будут учитывать её.
    Используйте для этого хук woocommerce_cart_calculate_fees
    Ответ написан
    Комментировать
  • Как закэшировать отдельный шаблон wordpress?

    По поводу плагина wp fastest cache не знаю, но в плагине WpSuperCashe есть такая опция, которая позволяет кэшировать разные страницы для мобильной и десктопной версии
    Ответ написан
    Комментировать
  • Как выводить полный контент продуктов в категории woocommerce?

    Править шаблон или заменять хуками вывод конкретного значения
    Какой использовать хук - надо смотреть в шаблоне вывода товара на странице архива.
    Это файл \plugins\woocommerce\templates\content-product.php
    Или здесь
    Ответ написан
    Комментировать
  • Как отправить содержимое корзины на почту с помощью cf7?

    Ну если без cf7, то кодом сформировать текст письма и через функцию wp_mail отправить.
    Если загляните внутрь функции, там есть интересные хуки для корректировки данных отправителя.
    Ответ написан
  • Как карточку товара Woocommerce поделить на три колонки?

    Загляните в шаблон "wp-content/plugins/woocommerce/templates/content-single-product.php" или если он у Вас переопределен в Вашей теме, тогда "wp-content/themes/Ваша-тема/woocommerce/content-single-product.php"
    Там прописаны основные теги разметки карточки товара
    Если он переопределен, то там и можно править, иначе можете подключиться к какому-то из хуков и добавить свой с содержимым.
    Правда придется переписать все основные стили.
    Ответ написан
  • Как выводить рекомендуемые товары WooCommerce в карточке товара?

    Создайте новый сайдбар, добавьте в него виджет с отображением рекомендуемых товаров, ввыведите сайдбар в шаблоне карточки товара.
    Нужный виджет посмотреть можно здесь
    Ответ написан
  • Как в Wordpress получить обратно данные после передачи из ajax в php?

    Вот урок по ajax в wordpress.
    Сделайте все, что пишет автор и я думаю вопрос отпадет.
    Внимание - это все для WordPress.
    Ответ написан
    Комментировать
  • Woocommerce Custom Sale Tag работает?

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

    Файл шаблона который отвечает за вывод надписи скидки называется sale-flash.php.
    Загляните в него. он очень простой. И меняйте все что хотите с любыми условиями и минимальной нагрузкой.

    Плагин к сожалению не знаю, но точно должен быть.
    Ответ написан
    Комментировать
  • При подключении ajax-ом файла php выдается 500 ошибка?

    В начало файла добавьте строку и должно заработать
    require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');

    Если есть желание разобраться то почитать можно здесь, и заглянуть внутрь файла "/wp-admin/admin-ajax.php"
    Ответ написан
    1 комментарий
  • Как привести прайсы поставщиков к единому виду?

    Думаю любой алгоритм будет давать ошибку
    Как вариант: Удалить все пробелы и не цифро-буквенные символы, привести к одному регистру и сложить коды символов. Получится слабое подобие хэша. таким образом можно найти все совпадения вне зависимости от перестановки слов. Если в позициях будет "шоколад" и "шоколадка", то этот метод покажет несовпадение. Для учета и этого различия, можно запустить предварительную авто-замену однокоренных слов на какое-то определенное значение.

    Ну и дальше можно разные авто-замены придумывать, для приближения к идеалу.
    Но вероятность ошибки все равно остается.
    Ответ написан
    Комментировать