Автор: admin

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

1) famenest.com

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

Пример размещения — https://famenest.com/read-blog/36817

2) finnishsportsagency.com

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

Пример размещения — https://www.finnishsportsagency.com/read-blog/2967

Единственное — разлогиниться у меня не получилось с сайта)

3) facetoshi.live

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

Пример размещения — https://facetoshi.live/blogs/2807/Objevte-mikroskopickou-stomatologii-v-Praze-Precizn%C3%AD-p%C3%A9%C4%8De-o-va%C5%A1e-zuby

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

4) coralrestoration.org

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

Пример размещения — https://www.coralrestoration.org/profile/tuazor670/profile

Рекомендую переходить по ссылке в профиль и там уже подписываться и регистрироваться. Иначе я не нашел кнопку «Регистрация»


Рекомендую также ознакомиться с предыдущей статьей из данного цикла — также с ссылками:

Как убрать слеш ‘/’ в конце строки

Очень часто возникает задача, в которой необхлодимо убрать слеш в конце строки. Это может быть как адрес сайта, домена, ссылка или еще вообще что угодно.

Чтобы решить эту задачу очень простая функция есть rtrim. В которую нужно передать текущую строку, которую нужно обработать и очистить и параметры.

Выглядит это так:

$str = rtrim($str, '/\\');

Функция возвращает уже очищенную строку.

Вот например, у себя в проекте мы используем так ее:

<link rel="amphtml" href="<?=str_replace(site_url(), $static_amp_domain_name, home_url($wp->request)); ?>">

Кстати home_url($wp->request) — используется в WordPress для того, чтобы получить URL текущей страницы.

Бесплатные ссылки на свой сайт (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

horseracingnation.com

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

Пример размещения: https://www.horseracingnation.com/user/platon, https://www.horseracingnation.com/user/promag

vevioz.com

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

Пример размещения: https://www.vevioz.com/ec624fbc2, https://www.vevioz.com/57b9a134a

webyourself.eu

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

Пример размещения: https://webyourself.eu/jamper, https://webyourself.eu/promag

gettogether.community

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

Пример размещения: https://gettogether.community/profile/147989

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:

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

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