Автор: admin

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

Forum.maistrafego.pt. Как и на любом другом форуме, сначала нужно пройти регистрацию и подтвердить свои данные. На этот сайт ссылается более 3 000 уникальных доменов по данным Ahrefs, что делает его достаточно авторитетным для использования в целях продвижения.

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

Пример размещения: http://forum.maistrafego.pt/index.php?action=classifieds;sa=view;id=10069

Еще один пример размещения ссылки: http://forum.maistrafego.pt/index.php?action=classifieds;sa=view;id=10070

Еще ссылки для размещения для ваших сайтов — https://jamper.online/besplatnye-ssylki-na-svoj-sajt-free-seo-backlinks-chast-2

caswellplating.com

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

На этом ресурсер регистрируемся на форуме, подтверждаем регистрацию и после можно создавать гостевой пост/тему. Однако, нужно будет пройти модерацию!

javacardos.com

❇️ Тип: профильная
❇️ Nofollow ссылка
❇️ DR 36

Нужно зарегистрироваться на форуме и после активировать пользователя. После можно ссылку вставить в свой профиль. Темы же создавать можно будет только после аппрува от администрации.

Пример размещения: https://www.javacardos.com/javacardforum/ucp.php?i=178

Второй пример — https://www.javacardos.com/javacardforum/ucp.php?i=178

olderworkers.com.au

❇️ Тип: профильная
❇️ Nofollow ссылка
❇️ DR 60

В профиле можно разместить ссылку на свой ресурс и сделать также описание профиля.

Пример размещения: https://olderworkers.com.au/author/tuazor670gmail-com/

cannabis.net

❇️ Тип: профильная
❇️ Nofollow ссылка
❇️ DR 69

Пример размещения: https://cannabis.net/user/156049

villatheme.com

❇️ Тип: профильная
❇️ Nofollow ссылка
❇️ DR 62

Пример размещения: https://villatheme.com/supports/users/platon/ или https://villatheme.com/supports/users/progam/

remotecentral.com

❇️ Тип: профильная
❇️ Dofollow ссылка
❇️ DR 59

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

Пример размещения: https://www.remotecentral.com/cgi-bin/forums/members/viewprofile.cgi?zzz=platon-spacemovers

PHP: Включение и отключение предупреждений и ошибок

Включение ошибок и предупреждений в файле php.ini

Для включения вывода всех ошибок и предупреждений, добавьте в файл php.ini следующие строки:

error_reporting = E_ALL
display_errors = On
display_startup_errors = On

Включение ошибок и предупреждений в PHP-скриптах

Чтобы включить вывод ошибок и предупреждений в PHP-скриптах, добавьте в начало нужного .php файла следующие строки:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

Отключение ошибок

Для отключения вывода ошибок, используйте:

ini_set('display_errors', 'Off');

Включение ошибок и предупреждений в файле .htaccess

Для включения вывода ошибок и предупреждений через .htaccess, добавьте следующие строки:

php_value display_errors 1
php_value display_startup_errors 1
php_value error_reporting E_ALL

Виды ошибок

  • E_ALL: все ошибки
  • E_ERROR: критические ошибки
  • E_WARNING: предупреждения
  • E_PARSE: ошибки синтаксиса
  • E_NOTICE: уведомления (ненормальный код)
  • E_CORE_ERROR: ошибки ядра
  • E_CORE_WARNING: предупреждения ядра
  • E_COMPILE_ERROR: ошибки компиляции
  • E_COMPILE_WARNING: предупреждения компиляции
  • E_USER_ERROR: пользовательские ошибки
  • E_USER_WARNING: пользовательские предупреждения
  • E_USER_NOTICE: пользовательские уведомления

Порядок обработки ошибок

Сначала учитываются параметры из php.ini, затем из .htaccess, и, наконец, из кода PHP-скрипта.

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

Для одного из проектов у нас потребовалось сделать на нашей карте клик по маркеру, чтобы открывалась необходимая ссылка. В нашем случае ссылка вела на открытие самих 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).