Пара тапок » Backend http://paratapok.ru Блог о веб-разработке Sun, 18 Dec 2022 12:14:48 +0000 ru-RU hourly 1 https://wordpress.org/?v=4.3.34 Как в WooCommerce убрать товары определенной категории с главной страницы магазина? http://paratapok.ru/backend/4642_kak-v-woocommerce-ubrat-tovary-opredelennoj-kategorii-s-glavnoj-stranicy-magazina/ http://paratapok.ru/backend/4642_kak-v-woocommerce-ubrat-tovary-opredelennoj-kategorii-s-glavnoj-stranicy-magazina/#comments Fri, 18 May 2018 18:46:50 +0000 http://paratapok.ru/?p=4642 Читать далее →]]> Представим себе ситуацию, когда на главной странице магазина нужно из списка товаров удалить товары какой-то конкретной категории, например, «Подарочные сертификаты» или ещё какой-то другой мало значимой группы товаров.

Для этого нужно на событие pre_get_posts повесить кастомное действие, в котором следует сначала убедиться, что выполняется получение списка товаров именно на главной странице, а затем отсеять товары ненужной категории, скорректировав параметры запроса $query. Для этого в свойстве terms следует передать массив отбрасываемых категорий, а в operator отрицание вхождения в указанный список.

Рассматриваемое событие тригерится при каждом запросе WP_Query, непосредственно перед самим запросом в БД. Используется для того, чтобы модифицировать запрос, что мы и делаем в рамках решения обозначенной в заголовке статьи задачи. Важно помнить, что исключить товары заданной категории мы хотим в публичной части магазина, поэтому не забываем проверять, что запрос относится именно к ней с помощью условия !is_admin().

Таким образом, для отсеивания товаров заданных категорий с главной страницы магазина WooCommerce нужно добавить в конец файла /wp-content/themes/название_вашей_темы/functions.php следующий кусок кода:

// Удаляет товары заданных категорий из списка на главной странице магазина
function remove_goods_category($query) {
    if ($query->is_main_query() || $query->is_post_type_archive()) {
        if (!is_admin() && is_shop()) {
            $query->set("tax_query", array(array(
                "taxonomy" => "product_cat",
                "field" => "slug",
                "terms" => array("gifts"),
                "operator" => "NOT IN"
            )));
        }
    }
}
add_action("pre_get_posts", "remove_goods_category");
]]>
http://paratapok.ru/backend/4642_kak-v-woocommerce-ubrat-tovary-opredelennoj-kategorii-s-glavnoj-stranicy-magazina/feed/ 2
Какой фильтр использовать в Pillow для уменьшения картинок? http://paratapok.ru/backend/4638_kakoj-filtr-ispolzovat-v-pillow-dlya-umensheniya-kartinok/ http://paratapok.ru/backend/4638_kakoj-filtr-ispolzovat-v-pillow-dlya-umensheniya-kartinok/#comments Thu, 17 May 2018 05:48:25 +0000 http://paratapok.ru/?p=4638 Читать далее →]]> Большинство python-разработчиков при работе с изображениями используют в своих проектах библиотеку Pillow, перекрывающую подавляющее большинство задач, решаемых при разработке сайтов. Она поддерживает работу с наиболее популярными форматами в вебе — JPG, PNG, GIF.

Наиболее частая операция — изменение размеров картинки. Например, на вход подаётся изображение большого размера, а на выходе требуется получить маленькую превьюшку. С этой задачей легко справляется метод resize. Вторым аргументом функция принимает фильтр, определяющий алгоритм даунскейлинга картинки. От его выбора зависит качество результирующего изображения. Многие разработчики используют фильтр Bicubic — new_image = new_image.resize((width_custom, height_custom), Image.BICUBIC). Однако по факту гораздо лучшее сглаживание контрастных частей картинки даёт фильтр Lanczos.

На примере выше показан результат обработки картинки фильтрами Bicubic (слева) и Lanczos (справа). Уменьшение картинки с помощью фильтра Bicubic приводит к тому, что белая диагональная контрастная линия становится прерывистой, почти пунктирной.

Однако есть минус в масштабировании картинки фильтром Lanczos — размер итоговой картинки получается процентов на 10-15 больше, чем при сжатии картинки фильтром Bicubic.

]]>
http://paratapok.ru/backend/4638_kakoj-filtr-ispolzovat-v-pillow-dlya-umensheniya-kartinok/feed/ 0
Ссылки на товары и категории Woocommerce в админке http://paratapok.ru/backend/4364_ssylki-na-tovary-i-kategorii-woocommerce-v-adminke/ http://paratapok.ru/backend/4364_ssylki-na-tovary-i-kategorii-woocommerce-v-adminke/#comments Sun, 01 Apr 2018 18:11:20 +0000 http://paratapok.ru/?p=4364 Читать далее →]]> В какой-то момент, возможно при очередном обновлении версии WordPress или установке каких-то плагинов, в админке в левом меню исчез раздел «Товары» под пунктом Woocommerce. В итоге в админке нельзя ни просмотреть весь список товаров, ни отредактировать список категорий.

Не являюсь гуру WordPress, поэтому пока выясняется, в чём проблема решил найти в интернете прямые ссылки на нужные страницы в админке. Текстовый поиск успехом не увенчался, получилось найти ссылки только поиском по картинкам, большинство скриншотов сделаны без адресной строки.

Возможно кому-то когда-то пригодятся, сохраню как минимум для себя.

  • Ссылка на список товаров в админке — /wp-admin/edit.php?post_type=product
  • Ссылка на список категорий товаров в админке — /wp-admin/edit-tags.php?taxonomy=product_cat&post_type=product
]]>
http://paratapok.ru/backend/4364_ssylki-na-tovary-i-kategorii-woocommerce-v-adminke/feed/ 0
Как написать php календарь на месяц и на год? http://paratapok.ru/backend/2529_kak-napisat-php-kalendar-na-mesyac-i-na-god/ http://paratapok.ru/backend/2529_kak-napisat-php-kalendar-na-mesyac-i-na-god/#comments Wed, 30 Dec 2015 16:14:22 +0000 http://paratapok.ru/?p=2529 Читать далее →]]> В преддверии нового года возникла весьма тривиальная задача — сделать сайт-календарь, где для каждого месяца необходимо было вывести свой календарь на месяц. Первым этапом решения задачи — стал поиск готовых решений. После перебора десятка приведенных в интернете решений выбор был сделан. Какие-то версии и вовсе оказались нерабочими, какие-то слишком громоздкими — их пришлось бы изрядно «попилить», чтобы получить требуемый результат. Итак, рассмотрим как написать простой календарь на php.

Основа скрипта была найдена на просторах интернета, ошибки были исправлены, кое-что было доделано, в частности добавлена функциональность выделения выходных дней отдельным css-классом.

PHP календарь на месяц

Реализация календаря на месяц на чистом PHP без использования mySQL, jQuery и т.д. приведена ниже:

<?

function draw_calendar($month, $year, $action = 'none') {
	$calendar = '<table cellpadding="0" cellspacing="0" class="b-calendar__tb">';
	
	// вывод дней недели
	$headings = array('Пн','Вт','Ср','Чт','Пт','Сб','Вс');
	$calendar.= '<tr class="b-calendar__row">';
	for($head_day = 0; $head_day <= 6; $head_day++) {
		$calendar.= '<th class="b-calendar__head';
		// выделяем выходные дни
		if ($head_day != 0) {
			if (($head_day % 5 == 0) || ($head_day % 6 == 0)) {
				$calendar .= ' b-calendar__weekend';
			}
		}
		$calendar .= '">';
		$calendar.= '<div class="b-calendar__number">'.$headings[$head_day].'</div>';
		$calendar.= '</th>';
	}
	$calendar.= '</tr>';

	// выставляем начало недели на понедельник
	$running_day = date('w',mktime(0,0,0,$month,1,$year));
	$running_day = $running_day - 1;
	if ($running_day == -1) {
		$running_day = 6;
	}
	
	$days_in_month = date('t',mktime(0,0,0,$month,1,$year));
	$day_counter = 0;
	$days_in_this_week = 1;
	$dates_array = array();
	
	// первая строка календаря
	$calendar.= '<tr class="b-calendar__row">';
	
	// вывод пустых ячеек
	for ($x = 0; $x < $running_day; $x++) {
		$calendar.= '<td class="b-calendar__np"></td>';
		$days_in_this_week++;
	}
	
	// дошли до чисел, будем их писать в первую строку
	for($list_day = 1; $list_day <= $days_in_month; $list_day++) {
		$calendar.= '<td class="b-calendar__day';

		// выделяем выходные дни
		if ($running_day != 0) {
			if (($running_day % 5 == 0) || ($running_day % 6 == 0)) {
				$calendar .= ' b-calendar__weekend';
			}
		}
		$calendar .= '">';

		// пишем номер в ячейку
		$calendar.= '<div class="b-calendar__number">'.$list_day.'</div>';
		$calendar.= '</td>';

		// дошли до последнего дня недели
		if ($running_day == 6) {
			// закрываем строку
			$calendar.= '</tr>';
			// если день не последний в месяце, начинаем следующую строку
			if (($day_counter + 1) != $days_in_month) {
				$calendar.= '<tr class="b-calendar__row">';
			}
			// сбрасываем счетчики 
			$running_day = -1;
			$days_in_this_week = 0;
		}

		$days_in_this_week++; 
		$running_day++; 
		$day_counter++;
	}

	// выводим пустые ячейки в конце последней недели
	if ($days_in_this_week < 8) {
		for($x = 1; $x <= (8 - $days_in_this_week); $x++) {
			$calendar.= '<td class="b-calendar__np"> </td>';
		}
	}
	$calendar.= '</tr>';
	$calendar.= '</table>';

	return $calendar;
}

?>

На вход функция draw_calendar получает порядковый номер месяца и год. Результатом исполнения функции является html-код календаря на заданный месяц. Использовать вышеприведенную функцию несложно, и сможет даже новичок в веб-разработке. Пример ниже выведет календарь на январь 2016 год.

<div class="b-calendar b-calendar--along">
	<div class="b-calendar__title"><span class="b-calendar__month">Январь</span> <span class="b-calendar__year">'16</span></div>
	<?
		echo draw_calendar(1,2016);
	?>
</div>

Вывод подписи к календарю, включающей в себя название месяца и год, намеренно не был включен в функцию, чтобы ее можно было свободно изменять, а возможно и вовсе убрать.

Php-календарь на год

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

PHP календарь на год

Однако при этом потребуется завести массив со списком названий месяцев на русском языке, поскольку получить названия месяцев из php можно лишь на английском.

Код в таком случае будет следующим:

<?
	$months = Array(
		0 => 'Январь',
		1 => 'Февраль',
		2 => 'Март',
		3 => 'Апрель',
		4 => 'Май',
		5 => 'Июнь',
		6 => 'Июль',
		7 => 'Август',
		8 => 'Сентябрь',
		9 => 'Октябрь',
		10 => 'Ноябрь',
		11 => 'Декабрь'
	);

	for ($month = 1; $month <= 12; $month++) { ?>
		<div class="b-calendar b-calendar--many">
			<div class="b-calendar__title"><span class="b-calendar__month"><?= $months[$month-1] ?></span> <span class="b-calendar__year">'16</span></div>
			<?
				echo draw_calendar($month,2016);
			?>
		</div>
	<? }
?>

Примеры приведенные в данном посте вы можете скачать с гитхаба.

]]>
http://paratapok.ru/backend/2529_kak-napisat-php-kalendar-na-mesyac-i-na-god/feed/ 5
Как добавить ссылку в Elastic Slider Avada? http://paratapok.ru/backend/2503_kak-dobavit-ssylku-v-elastic-slider-avada/ http://paratapok.ru/backend/2503_kak-dobavit-ssylku-v-elastic-slider-avada/#comments Mon, 28 Dec 2015 17:24:59 +0000 http://paratapok.ru/?p=2503 Читать далее →]]> В одном из проектов произошла тесная встреча с темой для WordPress Avada. По умолчанию в Аваде (Avada) на главной странице есть слайдер. В качестве слайдера использован плагин Elastic Slider с нужным эффектом, но у этого слайдера отсутствует ссылка (<a href="#"></a>) в слайде. Поэтому возникла необходимость сделать у каждого добавляемого и редактируемого слайда ссылку.

Добавленные слайды в Avada Elastic Slider

Добавленные слайды в Avada Elastic Slider

Форма добавления слайда без ссылки

Форма добавления слайда без ссылки

Чтобы появилось поле для ввода ссылки и введенные данные через админку сохранялись, необходимо в файле /wp-content/themes/Avada/framework/metaboxes/options/options_es.php добавить вот такую строку:

$this->text( 'link', __( 'Link', 'Avada' ), '' );

Форма со ссылкой у слайда

Форма со ссылкой у слайда

Чтобы вывести ссылку в html-коде слайдера на главной странице, необходимо в файле wp-content/themes/Avada/framework/custom_functions.php в функции avada_elasticslider($term) прописать следующий код:

<?php
$link = get_post_meta( get_the_ID(), 'pyre_link', true );

if ($link)
{
?><a href="<?=htmlspecialchars($link)?>"><?
}?>
<?php the_post_thumbnail( 'full', array( 'title' => '', 'alt' => get_post_meta( get_post_thumbnail_id(), '_wp_attachment_image_alt', true ) ) ); ?>

<?php								
if ($link)
{
?></a><?
}?>

И html код слайда будет выглядеть так:

<li style="<?php echo ( $count > 0 ) ? 'opacity: 0;' : ''; ?>">
	<?php
	$link = get_post_meta( get_the_ID(), 'pyre_link', true );
	
	if ($link)
	{
	?><a href="<?=htmlspecialchars($link)?>"><?
	}?>
	<?php the_post_thumbnail( 'full', array( 'title' => '', 'alt' => get_post_meta( get_post_thumbnail_id(), '_wp_attachment_image_alt', true ) ) ); ?>
	
	<?php								
	if ($link)
	{
	?></a><?
	}?>
	
	<div class="ei-title">
		<?php if ( get_post_meta( get_the_ID(), 'pyre_caption_1', true ) ): ?>
			<h2><?php echo get_post_meta( get_the_ID(), 'pyre_caption_1', true ); ?></h2>
		<?php endif; ?>
		<?php if ( get_post_meta( get_the_ID(), 'pyre_caption_2', true ) ): ?>
			<h3><?php echo get_post_meta( get_the_ID(), 'pyre_caption_2', true ); ?></h3>
		<?php endif; ?>
		

	</div>
</li>

По аналогии можно у слайда добавить другие поля.

]]>
http://paratapok.ru/backend/2503_kak-dobavit-ssylku-v-elastic-slider-avada/feed/ 0