Автор: admin

Маркер на карте гугл с произвольной ссылкой

Для одного из проектов у нас потребовалось сделать на нашей карте клик по маркеру, чтобы открывалась необходимая ссылка. В нашем случае ссылка вела на открытие самих Google Maps и прокладывание маршрута от текущего места до офиса клиента.

var myLatlng = new google.maps.LatLng(50.5342832,30.2296718);
	var myOptions = {
		zoom:15,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		center: myLatlng,
		panControl: false,
		zoomControl: true,
		mapTypeControl: false,
		scaleControl: true,
		streetViewControl: false,
		overviewMapControl: false,
		disableDoubleClickZoom:true,
		suppressInfoWindows:true,
		scrollwheel: true
	};
	map = new google.maps.Map(document.getElementById("map"), myOptions);
	map.setOptions({styles: styles});
	
	var markerLatlng = new google.maps.LatLng(50.53248143295204, 30.229685611563006);
	const image = "/assets/images/pin.png";
	var marker = new google.maps.Marker({
		url: 'https://www.google.com/maps/dir//адрес клиента',
		position: markerLatlng,
		icon: image
	});

	marker.setMap(map);
	google.maps.event.addListener(marker, 'click', function() {
		window.open(marker.url, '_blank');
	});

В этом коде мы формируем карту с заданным центром и на ней размещаем необходимый нам маркер, который выглядит как пин (наше изображение, которое мы хотим разместить на карте). После этого мы для маркера указываем необходимую нам ссылку в параметре url.

var markerLatlng = new google.maps.LatLng(50.53248143295204, 30.229685611563006);
	const image = "/assets/images/pin.png";
	var marker = new google.maps.Marker({
		url: 'https://www.google.com/maps/dir//адрес клиента',
		position: markerLatlng,
		icon: image
	});

Далее вешаем обработчик клика по маркеру и открываем нашу ссылку. Мы захотели ее открыть в новом окне, используя параметр _blank.

google.maps.event.addListener(marker, 'click', function() {
		window.open(marker.url, '_blank');
	});

Какие CMS популярны? Как выбрать CMS при разработке сайта?

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

  1. Тип сайта: Важно определить, для чего будет использоваться сайт. Это может быть блог, интернет-магазин, корпоративный сайт, портфолио и т. д.
  2. Удобство использования: CMS должна быть интуитивно понятной для администраторов, чтобы они могли легко добавлять, редактировать и удалять контент.
  3. Безопасность: CMS должна обеспечивать надежную защиту от хакерских атак и иметь регулярные обновления безопасности.
  4. Экосистема плагинов и тем: Важно, чтобы CMS имела богатую экосистему дополнений, которые могут добавить необходимый функционал без необходимости в разработке с нуля.
  5. Сообщество и поддержка: Чем больше сообщество вокруг CMS, тем больше вероятность получения помощи и решения проблем.
  6. Скорость и производительность: CMS должна обеспечивать хорошую производительность сайта даже при высоких нагрузках.
  7. Расширяемость и масштабируемость: CMS должна позволять легко масштабировать сайт с ростом бизнеса.
  8. Стоимость: Некоторые CMS бесплатны, в то время как другие могут требовать лицензионные платежи или плату за дополнительный функционал.

Популярные CMS в мире:

  1. WordPress: Одна из самых популярных и распространённых CMS. Имеет большое сообщество пользователей и разработчиков, богатую библиотеку плагинов и тем.
  2. Joomla: Еще одна из популярных CMS, более подходящая для создания корпоративных сайтов и онлайн-журналов.
  3. Drupal: Мощная CMS, которая обладает расширенными возможностями по управлению контентом и поддерживает создание сложных сайтов.
  4. Magento: Специализированная CMS для интернет-магазинов, обладает широкими возможностями по управлению товарами, заказами и платежами.
  5. Shopify: Еще одна CMS, специализированная на интернет-магазинах, но отличается от Magento тем, что предлагает готовые решения в облаке, что облегчает настройку и управление.

В СНГ популярность могут иметь те же системы, но также стоит обратить внимание на локальные CMS, которые могут быть более адаптированы к специфике регионального рынка.

Как отправить email в формате html с помощью WordPress правильно

Вы можете отправлять электронные письма с помощью WordPress и PHP-скриптов. Вот пример простого PHP-скрипта, который можно использовать для отправки электронной почты через WordPress:

// Устанавлием возможность отправки письма в виде html
add_filter('wp_mail_content_type', function( $content_type ) {
            return 'text/html';
});
// Отправляем письмо
$mail_sent = wp_mail($to, $subject, $body, $headers);

// Проверяем результат отправки письма
if ($mail_sent) {
    echo 'Письмо успешно отправлено!';
} else {
    echo 'Ошибка при отправке письма.';
}

Можно отправить и просто php функцией mail(). Однако, для этого в WordPress ест своя функция — wp_mail();

Вот ее параметры:

wp_mail( string|string[] $to, string $subject, string $message, string|string[] $headers = ”, string|string[] $attachments = array() ): bool

Sends an email, similar to PHP’s mail function. — перевод Отправляет электронное письмо, аналогично функции почты PHP.

Возвращаемое значение true не означает автоматически, что пользователь получил электронное письмо успешно. Это всего лишь означает, что используемый метод смог обработать запрос без каких-либо ошибок.

Тип контента по умолчанию — text/plain, что не позволяет использовать HTML.
Однако вы можете установить тип контента электронного письма, используя фильтр «wp_mail_content_type».

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

Передаваемые параметры

$to string|string[] required
Массив или список адресов электронной почты, разделенных запятыми, для отправки сообщения.
$subject string required
Тема письма.
$message string required
Содержание сообщения.
$headers string|string[] optional
Дополнительные заголовки. По умолчанию: »
$attachments string|string[] optional
Пути к файлам для прикрепления. По умолчанию: array[]

Возвращаться
bool Указывает, было ли письмо отправлено успешно.

Обратите внимание, что вам также потребуется обработка данных формы, чтобы избежать уязвимостей, таких как атаки по инъекции.

База индексов почтовых отделений Укрпочты

Для одного из сайтов клиентов была поставлена задача создать базу с индексами почтовых отделений Укрпочты для каждого региона Украины и всей страны в целом.

Так как сроки были сжатые — решили сделать решение «на коленке» и вот что получилось:

<?
ini_set("max_execution_time", "6000");
global $wpdb;
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

set_regions();
function set_regions()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_regions";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_ID` int(11) NOT NULL,
	  `REGION_UA` text
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	// get regions data
	// get_regions_by_region_ua
	// receive data:
	// ["REGION_ID"]=>
	//   string(3) "262"
	//   ["REGION_UA"]=>
	//   string(18) "Вінницька"
	//   ["REGION_EN"]=>
	//   string(9) "Vinnytska"
	//   ["REGION_KATOTTG"]=>
	//   string(17) "05000000000010236"
	//   ["REGION_KOATUU"]=>
	//   string(9) "500000000"
	//   ["REGION_RU"]=>
	//   NULL
	
	// $region->REGION_UA - region name
	// $region->REGION_ID - region ID
	$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_regions_by_region_ua',
	[
		'headers' => [ 
			'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
			'Accept'=> 'application/json'
		]
	]);
	if(wp_remote_retrieve_response_code($data)==200)
	{
		$entries = json_decode($data['body']);
		$delete = $wpdb->query("TRUNCATE TABLE $table_name");
		foreach($entries->Entries->Entry as $entry)
		{
			$wpdb->insert( 
				$table_name, 
				[
					'REGION_UA' => $entry->REGION_UA, 
					'REGION_ID' => $entry->REGION_ID
				]
			);
		}
		echo 'regions scrapper - finish<br />';
		set_districts();
	}
	else
	{
		$data = json_decode($data['body']);
		var_dump($data->fault->code);
		var_dump($data->fault->message);
		die('error');
	}
}
// set_districts();
function set_districts()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_districts";
	$table_regions_name = $wpdb->prefix . "ukrposhta_regions";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_ID` int(11) NOT NULL,
	  `DISTRICT_ID` int(11) NOT NULL,
	  `DISTRICT_UA` text
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	
	$result = $wpdb->get_results ( "SELECT * FROM $table_regions_name ORDER BY `REGION_ID`;");
	$delete = $wpdb->query("TRUNCATE TABLE $table_name");
	foreach($result as $region)
	{
		// get districts data
		// $district->DISTRICT_UA name of district
		// $district->DISTRICT_ID - district ID
		// sleep(1);
		$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_districts_by_region_id_and_district_ua?region_id='.
		$region->REGION_ID,
		[
			'headers' => [ 
				'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
				'Accept'=> 'application/json'
			]
		]);
		if(wp_remote_retrieve_response_code($data)==200)
		{
			$data = json_decode($data['body']);
			foreach($data->Entries->Entry as $entry)
			{
				$wpdb->insert( 
					$table_name, 
					[
						'REGION_ID' => $region->REGION_ID,
						'DISTRICT_UA' => $entry->DISTRICT_UA, 
						'DISTRICT_ID' => $entry->DISTRICT_ID
					]
				);
			}
			echo 'districts scrapper for region '.$region->REGION_UA.' - finish<br />';
		}
		else
		{
			$data = json_decode($data['body']);
			var_dump($data->fault->code);
			var_dump($data->fault->message);
			die('error '.$region->REGION_UA);
		}
	}
	set_cities();
}
// set_cities();
function set_cities()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_cities";
	$table_districts_name = $wpdb->prefix . "ukrposhta_districts";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_ID` int(11) NOT NULL,
	  `DISTRICT_ID` int(11) NOT NULL,
	  `CITY_UA` text,
	  `CITY_ID` int(11) NOT NULL
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	
	$result = $wpdb->get_results ( "SELECT * FROM $table_districts_name ORDER BY `DISTRICT_ID`;");
	$delete = $wpdb->query("TRUNCATE TABLE $table_name");
	foreach($result as $district)
	{
		// get cities data
		// $city->CITY_UA - city name
		// $city->CITY_ID - city ID
		$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_city_by_region_id_and_district_id_and_city_ua?district_id='.$district->DISTRICT_ID.'&region_id='.$district->REGION_ID,
		[
			'headers' => [ 
				'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
				'Accept'=> 'application/json'
			]
		]);
		if(wp_remote_retrieve_response_code($data)==200)
		{
			$data = json_decode($data['body']);
			foreach($data->Entries->Entry as $entry)
			{
				$wpdb->insert( 
					$table_name, 
					[
						'REGION_ID' => $district->REGION_ID,
						'DISTRICT_ID' => $district->DISTRICT_ID,
						'CITY_UA' => $entry->CITY_UA,
						'CITY_ID' => $entry->CITY_ID
					]
				);
			}
			echo 'cities scrapper for district '.$district->DISTRICT_UA.' - finish<br />';
		}
		else
		{
			$data = json_decode($data['body']);
			var_dump($data->fault->code);
			var_dump($data->fault->message);
			die('error '.$district->DISTRICT_UA);
		}
	}
	set_postoffices()
}
function set_postoffices()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_post_offices";
	$table_districts_name = $wpdb->prefix . "ukrposhta_cities";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_UA` text,
	  `DISTRICT_UA` text,
	  `CITY_UA` text,
	  `POSTINDEX` text
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	
	$value = 500*54;
	$result = $wpdb->get_results ( "SELECT * FROM $table_districts_name ORDER BY `CITY_ID` LIMIT $value, 500;");
	$delete = $wpdb->query("TRUNCATE TABLE $table_name");
	foreach($result as $city)
	{
		// get cities data
		// $city->CITY_UA - city name
		// $city->CITY_ID - city ID
		$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_postoffices_by_city_id?city_id='.$city->CITY_ID.'&district_id='.$city->DISTRICT_ID.'&region_id='.$city->REGION_ID,
		[
			'headers' => [ 
				'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
				'Accept'=> 'application/json'
			]
		]);
		if(wp_remote_retrieve_response_code($data)==200)
		{
			$data = json_decode($data['body']);
			if(isset($data->Entries->Entry))
			{
				$temp_index = '';	
				foreach($data->Entries->Entry as $entry)
				{
					if($temp_index!=$entry->POSTINDEX)
					{
						$wpdb->insert( 
							$table_name, 
							[
								'REGION_UA' => $entry->REGION_UA,
								'DISTRICT_UA' => $entry->DISTRICT_UA,
								'CITY_UA' => $entry->CITY_UA,
								'POSTINDEX' => $entry->POSTINDEX
							]
						);
					}
					$temp_index = $entry->POSTINDEX;
				}
				echo 'postoffices scrapper for city '.$entry->CITY_UA.' - finish<br />';
			}
			else
			{
				echo $city->CITY_UA.'- no post offices<br />';
			}
		}
		else
		{
			$data = json_decode($data['body']);
			var_dump($data->fault->code);
			var_dump($data->fault->message);
			die('error '.$district->DISTRICT_UA);
		}
	}
}
die();
?>

Реализация текущая для CMS WordPress. Однако, ее можно легко использовать где угодно, заменив <?
ini_set("max_execution_time", "6000");
global $wpdb;
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

set_regions();
function set_regions()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_regions";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_ID` int(11) NOT NULL,
	  `REGION_UA` text
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	// get regions data
	// get_regions_by_region_ua
	// receive data:
	// ["REGION_ID"]=>
	//   string(3) "262"
	//   ["REGION_UA"]=>
	//   string(18) "Вінницька"
	//   ["REGION_EN"]=>
	//   string(9) "Vinnytska"
	//   ["REGION_KATOTTG"]=>
	//   string(17) "05000000000010236"
	//   ["REGION_KOATUU"]=>
	//   string(9) "500000000"
	//   ["REGION_RU"]=>
	//   NULL
	
	// $region->REGION_UA - region name
	// $region->REGION_ID - region ID
	$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_regions_by_region_ua',
	[
		'headers' => [ 
			'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
			'Accept'=> 'application/json'
		]
	]);
	if(wp_remote_retrieve_response_code($data)==200)
	{
		$entries = json_decode($data['body']);
		$delete = $wpdb->query("TRUNCATE TABLE $table_name");
		foreach($entries->Entries->Entry as $entry)
		{
			$wpdb->insert( 
				$table_name, 
				[
					'REGION_UA' => $entry->REGION_UA, 
					'REGION_ID' => $entry->REGION_ID
				]
			);
		}
		echo 'regions scrapper - finish<br />';
		set_districts();
	}
	else
	{
		$data = json_decode($data['body']);
		var_dump($data->fault->code);
		var_dump($data->fault->message);
		die('error');
	}
}
// set_districts();
function set_districts()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_districts";
	$table_regions_name = $wpdb->prefix . "ukrposhta_regions";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_ID` int(11) NOT NULL,
	  `DISTRICT_ID` int(11) NOT NULL,
	  `DISTRICT_UA` text
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	
	$result = $wpdb->get_results ( "SELECT * FROM $table_regions_name ORDER BY `REGION_ID`;");
	$delete = $wpdb->query("TRUNCATE TABLE $table_name");
	foreach($result as $region)
	{
		// get districts data
		// $district->DISTRICT_UA name of district
		// $district->DISTRICT_ID - district ID
		// sleep(1);
		$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_districts_by_region_id_and_district_ua?region_id='.
		$region->REGION_ID,
		[
			'headers' => [ 
				'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
				'Accept'=> 'application/json'
			]
		]);
		if(wp_remote_retrieve_response_code($data)==200)
		{
			$data = json_decode($data['body']);
			foreach($data->Entries->Entry as $entry)
			{
				$wpdb->insert( 
					$table_name, 
					[
						'REGION_ID' => $region->REGION_ID,
						'DISTRICT_UA' => $entry->DISTRICT_UA, 
						'DISTRICT_ID' => $entry->DISTRICT_ID
					]
				);
			}
			echo 'districts scrapper for region '.$region->REGION_UA.' - finish<br />';
		}
		else
		{
			$data = json_decode($data['body']);
			var_dump($data->fault->code);
			var_dump($data->fault->message);
			die('error '.$region->REGION_UA);
		}
	}
	set_cities();
}
// set_cities();
function set_cities()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_cities";
	$table_districts_name = $wpdb->prefix . "ukrposhta_districts";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_ID` int(11) NOT NULL,
	  `DISTRICT_ID` int(11) NOT NULL,
	  `CITY_UA` text,
	  `CITY_ID` int(11) NOT NULL
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	
	$result = $wpdb->get_results ( "SELECT * FROM $table_districts_name ORDER BY `DISTRICT_ID`;");
	$delete = $wpdb->query("TRUNCATE TABLE $table_name");
	foreach($result as $district)
	{
		// get cities data
		// $city->CITY_UA - city name
		// $city->CITY_ID - city ID
		$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_city_by_region_id_and_district_id_and_city_ua?district_id='.$district->DISTRICT_ID.'&region_id='.$district->REGION_ID,
		[
			'headers' => [ 
				'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
				'Accept'=> 'application/json'
			]
		]);
		if(wp_remote_retrieve_response_code($data)==200)
		{
			$data = json_decode($data['body']);
			foreach($data->Entries->Entry as $entry)
			{
				$wpdb->insert( 
					$table_name, 
					[
						'REGION_ID' => $district->REGION_ID,
						'DISTRICT_ID' => $district->DISTRICT_ID,
						'CITY_UA' => $entry->CITY_UA,
						'CITY_ID' => $entry->CITY_ID
					]
				);
			}
			echo 'cities scrapper for district '.$district->DISTRICT_UA.' - finish<br />';
		}
		else
		{
			$data = json_decode($data['body']);
			var_dump($data->fault->code);
			var_dump($data->fault->message);
			die('error '.$district->DISTRICT_UA);
		}
	}
	set_postoffices()
}
function set_postoffices()
{
	global $wpdb;
	$table_name = $wpdb->prefix . "ukrposhta_post_offices";
	$table_districts_name = $wpdb->prefix . "ukrposhta_cities";
	$sql = "CREATE TABLE `$table_name` (
	  `REGION_UA` text,
	  `DISTRICT_UA` text,
	  `CITY_UA` text,
	  `POSTINDEX` text
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	COMMIT;";
	dbDelta( $sql );
	
	$value = 500*54;
	$result = $wpdb->get_results ( "SELECT * FROM $table_districts_name ORDER BY `CITY_ID` LIMIT $value, 500;");
	$delete = $wpdb->query("TRUNCATE TABLE $table_name");
	foreach($result as $city)
	{
		// get cities data
		// $city->CITY_UA - city name
		// $city->CITY_ID - city ID
		$data = wp_remote_get('https://www.ukrposhta.ua/address-classifier-ws/get_postoffices_by_city_id?city_id='.$city->CITY_ID.'&district_id='.$city->DISTRICT_ID.'&region_id='.$city->REGION_ID,
		[
			'headers' => [ 
				'Authorization' => 'Bearer КОД_АПИ_ДЛЯ_ПОДКЛЮЧЕНИЯ',
				'Accept'=> 'application/json'
			]
		]);
		if(wp_remote_retrieve_response_code($data)==200)
		{
			$data = json_decode($data['body']);
			if(isset($data->Entries->Entry))
			{
				$temp_index = '';	
				foreach($data->Entries->Entry as $entry)
				{
					if($temp_index!=$entry->POSTINDEX)
					{
						$wpdb->insert( 
							$table_name, 
							[
								'REGION_UA' => $entry->REGION_UA,
								'DISTRICT_UA' => $entry->DISTRICT_UA,
								'CITY_UA' => $entry->CITY_UA,
								'POSTINDEX' => $entry->POSTINDEX
							]
						);
					}
					$temp_index = $entry->POSTINDEX;
				}
				echo 'postoffices scrapper for city '.$entry->CITY_UA.' - finish<br />';
			}
			else
			{
				echo $city->CITY_UA.'- no post offices<br />';
			}
		}
		else
		{
			$data = json_decode($data['body']);
			var_dump($data->fault->code);
			var_dump($data->fault->message);
			die('error '.$district->DISTRICT_UA);
		}
	}
}
die();
?>

Реализация текущая для CMS WordPress. Однако, ее можно легко использовать где угодно, заменив wp_remote_get на команды cURL и заменив запросы к БД и ее таблицам на соответствующие команды, которые будут работать в конкретном вашем случае.

Таблицы у нас 4:

  • данные с областями
  • данные с районами
  • данные с городами
  • данные с индексами почтовых отделений.

Также, если кому нужна уже собранная база — напишите — вышлем базу со всеми данными.

Что такое CSS-препроцессоры: Sass, Less, Stylus

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

Некоторые из наиболее популярных препроцессоров CSS включают:

  1. Sass (Syntactically Awesome Stylesheets): Sass предоставляет мощные инструменты, такие как переменные, вложенные правила, миксины, наследование и многое другое. Он имеет два синтаксиса: SCSS (Sassy CSS), который похож на обычный CSS с дополнительными возможностями препроцессора, и более компактный синтаксис, называемый Sass.
  2. Less: Less также расширяет стандартный CSS с похожими функциональными возможностями, такими как переменные, миксины, вложенные правила и другие. Синтаксис Less более похож на обычный CSS, чем синтаксис Sass.
  3. Stylus: Stylus — это еще один препроцессор CSS, который предлагает удобный и гибкий синтаксис. Он поддерживает множество функций, включая переменные, вложенные правила и многое другое.

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

Что такое CSS и где его используют

CSS (Cascading Style Sheets) — это язык разметки, который используется для стилизации веб-страниц. Он определяет внешний вид и форматирование элементов HTML документа, таких как цвета, шрифты, размеры, отступы и расположение.

Зачем нужен CSS:

  1. Улучшение внешнего вида: CSS позволяет задавать стили для элементов веб-страницы, делая ее более привлекательной и профессиональной.
  2. Разделение содержимого и представления: CSS позволяет отделить структуру и содержание HTML от его визуального представления, что упрощает обслуживание и обновление веб-страниц.
  3. Повторное использование стилей: CSS позволяет определить стили один раз и применять их к разным элементам или даже к разным страницам, что сокращает объем кода и упрощает его поддержку.
  4. Управление масштабируемостью: CSS позволяет легко изменять внешний вид веб-страницы для различных устройств и экранов, что делает сайт более масштабируемым и удобным для просмотра на различных устройствах (например, на компьютере, планшете или мобильном телефоне).
  5. Повышение доступности: Правильное использование CSS может улучшить доступность веб-страниц для пользователей с ограниченными возможностями, так как различные стили могут быть адаптированы для различных потребностей пользователей.

Таким образом, CSS играет важную роль в создании красивых, удобных и функциональных веб-страниц.

Микроразметка schema.org для FAQ страницы

Использование микроразметки Schema.org для страницы с часто задаваемыми вопросами (FAQ) позволяет поисковым системам лучше понять контент страницы и отобразить более информативные результаты в результатах поиска. Вот пример того, как можно использовать микроразметку Schema.org для FAQ страницы:

<script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Как использовать микроразметку Schema.org для FAQ страницы?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Вы можете использовать микроразметку Schema.org для FAQ страницы, включив ее в HTML вашей страницы. Ниже пример кода для этого."
        }
      },
      {
        "@type": "Question",
        "name": "Какой формат используется для микроразметки?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Формат микроразметки для FAQ страницы основан на JSON-LD. Это специальный формат данных, который помогает поисковым системам понимать контент страницы."
        }
      }
      // Добавьте еще вопросы и ответы при необходимости
    ]
  }
  </script>

Этот код можно вставить как в <head> страницы, так и в <body>.

Обратите внимание на следующие ключевые моменты:

  1. Вся микроразметка оформлена в виде JSON-LD и помещается в <script> теге внутри <head> (или <body>) секции вашего HTML документа.
  2. Тип FAQPage указывает, что это страница с часто задаваемыми вопросами.
  3. Каждый вопрос-ответ пара представлена объектом с типами Question и Answer.
  4. Можно добавить столько вопросов и ответов, сколько необходимо, повторяя шаблон вопроса и ответа в блоке mainEntity.

После добавления микроразметки в вашу HTML страницу, рекомендуется проверить ее на соответствие структуре с помощью инструментов проверки структурированных данных, таких как инструмент Google для разработчиков (Google’s Structured Data Testing Tool).

Баг с пагинацией главной страницы в WordPress

Нашли в системе WordPress такой баг, что если у вас главная страница указана шаблоном страницы или кастомная (хотя на многих других сайтах проверяли — и во всех случаях эта ошибка встречалась), то введя в строку поиска /page/2 (вместо 2 — можете ввести любое число) — то вы увидите, что откроется главная страница. Хотя должна открываться 404-я страница.

Мы решили для своего проекта эту проблему таким образом:

add_action('template_redirect', 'is_home_page', 10);
function is_home_page(){
    if(get_page_template_slug()==='page-home.php' && !empty(get_query_var('paged')))
    {
        global $wp_query;
        $wp_query->set_404();
        status_header( 404 );
        get_template_part( 404 );
        exit();
    }
}

Мы использовали конструкцию get_page_template_slug()===’page-home.php’, потому как у нас очень кастомная верстка.

В обычном случае же, думаю, достаточно будет проверки is_home() / is_front_page().

Соответственно, что происходит?

Мы добавили экшн, который проверяет есть ли у вас переменная paged и какое у нас название шаблона страницы. Если мы понимаем, что это главная страница, то показываем страницу 404 и пишем, что такой страницы не существует.

Все просто)

Надеюсь, что кому-то пригодится это решение так же, как оно пригодилось и нам!

Бесплатные ссылки на свой сайт (free SEO backlinks). Часть 2

Ссылка на первую часть статьи.

Это вторая часть статьи и тут представлены новые ссылки, которые вы можете получить абсолютно бесплатно!

Представляю вашему вниманию список сайтов, с которых можно получиться бесплатную(ые) ссылку(и) на свой сайт.

Конечно же, подразумевается, что вы понимаете принципы поисковой оптимизации (search engine optimization). А также понимаете, что ссылки желательно чтобы совпадали по контенту и языку с сайтом/страницей, на которую они ссылаются.

Итак, собственно, сам список.

community.telegramfxcopier.io

❇️ Тип: статейная
❇️ Nofollow ссылка
❇️ DR 51

Пример размещения — https://community.telegramfxcopier.io/user/redriveworld

susanne-kaufmann.webador.com

❇️ Тип: статейная
❇️ Dofollow ссылка
❇️ DR 85

Пример размещения — https://free-4047449.webador.com/

heber-ut.granicusideas.com

❇️ Тип: статейная
❇️ Dofollow ссылка
❇️ DR 65

Пример размещения — https://heber-ut.granicusideas.com/ideas/redrive-dot-world-this-is-a-site-for-carloved-people-here-you-can-find-articles-parts-faq-about-your-car-https-slash-slash-redrive-dot-world-slash-category-slash-articles-slash

oxwall.com

❇️ Тип: форумная
❇️ Nofollow ссылка
❇️ DR 77

Пример размещения — https://developers.oxwall.com/forum/topic/75609?page=1#post-379080

dislivelli.eu

❇️ Тип: форумная
❇️ Dofollow ссылка
❇️ DR 54

Пример размещения — http://www.dislivelli.eu/forum/viewtopic.php?f=6&t=142037

easyinsurancehub.co.uk

❇️ Тип: форумная
❇️ Dofollow ссылка
❇️ DR 28

Пример размещения — https://www.easyinsurancehub.co.uk/forum/thread-3763.html

wantedly.com

❇️ Тип: Профильный сабмит
❇️ Dofollow ссылка
❇️ DR — 85

Пример размещения — https://www.wantedly.com/id/tuazor_platon

emilyswift.hashnode.dev

❇️ Тип: Профильный сабмит
❇️ Dofollow ссылка
❇️ DR — 81

Пример размещения — https://redrive.hashnode.dev/introducing-redriveworld-your-gateway-to-premium-auto-parts-from-allegropl

dzone.com

❇️ Тип: Профильный сабмит
❇️ Nofollow ссылка
❇️ DR — 85

Пример размещения — https://dzone.com/users/5005082/redrive.html

thehealthcareblog.com

❇️ Тип: Профильный сабмит
❇️ Dofollow ссылка
❇️ DR — 72

Пример размещения — https://thehealthcareblog.com/blog/author/redrive.world/

pubhtml5.com

❇️ Тип: Профильный сабмит
❇️ Nofollow ссылка
❇️ DR — 83

Пример размещения — https://pubhtml5.com/homepage/kwpra/

beacons.ai

❇️ Тип: Профильный сабмит
❇️ Dofollow ссылка
❇️ DR — 84

Пример размещения — https://beacons.ai/redrive.world