Привіт, друзі. Нарешті прийшов час для третьої частини мого мега-керівництва по оптимізації DLE.

Тільки зараз з жахом усвідомив, що попередня друга частина керівництва вийшла більше півроку тому!

За традицією ми будемо говорити про внутрішній оптимізації сайту, а конкретно в цій частині я розповім про деякі особливості движка і дрібні, але дуже корисні фішки і хакі, які не підійшли за форматом в попередніх частинах.

Ця частина так само пов’язана з адресами сторінок, але на відміну від другої частини, де ми боролися з дублями і виключали їх поява, в цій частині ми розглянемо, як позбавитися від неіснуючих сторінок, що з’явилися в результаті видалення або помилки в адресі.

Пост оновлено 6 травня 2014 року:
Оновлені вносяться зміни в движок, додана підтримка нових версій движка.
Актуально для таких версій DLE: 7.x, 8.x, 9.x, 10.x!

Інші частини SEO-керівництва:
Частина 1, Оптимізація заголовків Title — http://alaev.info/blog/post/2373
Частина 2, Боротьба з дублюванням контенту — http://alaev.info/blog/post/2400
Частина 4, Виправлення версії DLE 9.3, 9.4, 9.5, 9.6 — http://alaev.info/blog/post/3513

Редірект з неіснуючих сторінок пагинации на правильні та існуючі

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Фішка була придумана буквально сьогодні, коли я знайшов безліч помилок 404 на одному з сайтів в панелі вебмастера.

Візьмемо цілком реальну ситуацію – з якоїсь причини ви вирішили змінити кількість новин, що виводяться на головній сторінці або сторінках категорій. Як сталося у мене: редизайн сайту; структура сторінок повністю змінилася; було вирішено виводити більше коротких анонсів новин на кожній сторінці (було 7, стало 10). Результат був наступним — в панелі вебмастера з’явилося багато сторінок з 404 помилки. Проста арифметика, було на сайті 1000 новин, на кожній сторінці виводилося за 7 анонсів, отже, тільки на головній у нас виходить 1000/7=142 сторінки пагинации. Після змін сторінок стало рівно 100. У результаті 42 сторінки просто пропали. А якщо візьмемо ще категорії, то неіснуючих сторінок вже сотня-дві. Це погано, негарно і взагалі не тру.

Розкрити список правок

Відкриваємо файл /engine/modules/show.short.php і в самому низу знаходимо:

}
?>

}
?>

ВИЩЕ додаємо:

//редирект на останню сторінку, якщо в url вказане сторінка більше ніж максимально існуюча
$all_pages_count = @ceil( $count_all / $config[‘news_number’] );
if ($cstart > $all_pages_count) {
if ($all_pages_count > 1) {
header(‘HTTP/1.1 301 Moved Permanently’);
header (‘Location: ‘ . $url_page . ‘/page/’ . $all_pages_count . ‘/’);
die();
} else {
header(‘HTTP/1.1 301 Moved Permanently’);
header (‘Location: ‘ . $url_page . ‘/’);
die();
}
}
//редирект на останню сторінку, якщо в url вказане сторінка більше ніж максимально існуюча

//редирект на останню сторінку, якщо в url вказане сторінка більше ніж максимально існуюча
$all_pages_count = @ceil( $count_all / $config[‘news_number’] );
if ($cstart > $all_pages_count) {
if ($all_pages_count > 1) {
header(‘HTTP/1.1 301 Moved Permanently’);
header (‘Location:’ . $url_page . ‘/page/’ . $all_pages_count . ‘/’);
die();
} else {
header(‘HTTP/1.1 301 Moved Permanently’);
header (‘Location:’ . $url_page . ‘/’);
die();
}
}
//редирект на останню сторінку, якщо в url вказане сторінка більше ніж максимально існуюча

Сховати список правок

Трохи поясню код: йде перевірка на умову — якщо номер поточної сторінки більше ніж максимальна кількість сторінок на сайті (або категорії), то відбувається редірект на останню сторінку. Якщо запитується сторінка номер 2, а сторінок всього одна, то відбувається редірект на гравную сторінку (або головну сторінку категорії).

Приклад на пальцях, хто запитує сторінку сайту site.ru/page/435/, а на цьому сайті всього 268 сторінок, отже, станеться редирект на адресу site.ru/page/268/.

Редірект з неіснуючих сторінок пагинации коментарів на правильні

Актуальність: Тільки версії DLE 8.x, 9.x. Для DLE 10.x не актуально, тому що вже реалізовано в самому движку.

Аналогічна ситуація з пагінація в коментарях. Може виникнути така ситуація, що, наприклад, вам наспамили в коментарях, пошуковики проіндексували всі сторінки коментарів, а потім ви це помітили і видалили всі коменти. Але сторінки, які проіндексував пошуковик, все одно залишаться, просто на них не будуть відображатися ніякі коментарі, а буде повний дубль основної сторінки новини. І це сумно, треба виправляти!

Розкрити список правок

Відкриваємо файл /engine/classes/comments.class.php і в самому низу знаходимо:

}
}
?>

}
}
?>

ВИЩЕ додаємо:

//редирект на останню сторінку коментарів, якщо в url вказане сторінка більше ніж максимально існуюча
if ( $this->cstart > $enpages_count ) {
header(‘HTTP/1.1 301 Moved Permanently’);
header(‘Location: ‘ . $url);
die();
}
//редирект на останню сторінку коментарів, якщо в url вказане сторінка більше ніж максимально існуюча

//редирект на останню сторінку коментарів, якщо в url вказане сторінка більше ніж максимально існуюча
if ( $this->cstart > $enpages_count ) {
header(‘HTTP/1.1 301 Moved Permanently’);
header(‘Location:’ . $url);
die();
}
//редирект на останню сторінку коментарів, якщо в url вказане сторінка більше ніж максимально існуюча

Сховати список правок

Ну ось, тепер все в порядку, можете перевірити.

Редирект з посилань із зайвими символами або неправильним закінченням на вірні адреси

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Типова ситуація – добродушний відвідувач вашого сайту вирішив поділитися ссилочку на потрібний матеріал у своєму затишному бложіке на ЖЖ або на МоемМире. Спасибі йому за це, молодець! Тільки от біда – користувач не знайомий з html як таким, він нічого крім візуального редактора в очі не бачив. У мене таких «простаків» на emofans.ru греблю гати, діляться посиланнями направо і наліво. Так от, вставив ссилочку людина в свій блог, так ненавмисно закінчення в посиланні потер (вийшло не site.ru/123-page_name.html, а site.ru/123-page_name.htm), а перевірити забув, так і залишилася «биті» посилання на віки вічні, а в панелі вебмастера помилка зачаїлася і очі муляє! Чи ще живий приклад, користувач не потер закінчення, а, навпаки, у візуальному редакторі злилася посилання з текстом (не вийшло site.ru/123-page_name.html, а щось в дусі site.ru/123-page_name.html де), і знову помилки звалилися на вебмастерскую голову. Таких прикладів у мене багато, спеціально не виправляв ці помилки до написання даного посту, щоб не забути.

Раніше тут було дуже складне рішення, яке залежало від версії движка. Але з моменту написання цього посту я досить прокачав свої вміння, щоб скласти універсальне рішення для всіх версій DLE і взагалі абсолютно для будь-якого движка або будь-якого сайту!

Розкрити список правок

Відкриваємо .htaccess, який лежить в корені і знаходимо:

# Перенаправлення
RewriteRule ^page/([09]+)(/?)$ index.php?cstart=$1 [L]

# Перенаправлення
RewriteRule ^page/([0-9]+)(/?)$ index.php?cstart=$1 [L]

ВИЩЕ додаємо:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*)\.html(.+) [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.htm$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.ht$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.h$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.$
RewriteRule ^(.*)\.(.*) $1.HTML [R=301,L]

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*)\.html(.+) [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.htm$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.ht$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.h$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\.$
RewriteRule ^(.*)\.(.*) $1.HTML [R=301,L]

Сховати список правок

Незалежно від обраного типу ЧПУ при переході з будь-якої «кривий» ссылке відвідувач потрапить туди, куди повинен був потрапити.

Редірект з розділів або категорій, яких більше не існує, на головну сторінку

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Приклад з життя: ви вирішили змінити структуру сайту або просто видалили якісь категорії за непотрібністю, отже, ці сторінки перестануть існувати, а посилання на них можуть десь залишитися. Наприклад, на emofans’е у мене колись були блоги для користувачів, доступні за адресою site.ru/blog/, а в них йшло поділ на користувачів, ось так site.ru/blog/user1/, site.ru/blog/user2/ і т. д. Вже багато років як я зніс ці блоги за непотрібністю, а посилання на них і помилки в панелі вебмастера живуть.

Ще ця правка дозволить уникнути появи адрес сторінок повною новини без розширення на кінці або взагалі адрес повній новині коли відсутній цілий шматок url в кінці. Таким чином, в поєднанні з попереднім пунктом, ці зміни допоможуть на 99% уникнути появи невірних і небажаний адрес.

Розкрити список правок

Відкриваємо файл /engine/engine.php і знаходимо:

if (!$category_id) $category_id = ‘not detected’;

if (!$category_id) $category_id = ‘not detected’;

ЗАМІНЮЄМО на:

//рішення проблеми з категоріями, яких не існує
if (!$category_id AND $view_template != “rss”) {
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]});
die(“Redirect”);
}
//рішення проблеми з категоріями, яких не існує

//рішення проблеми з категоріями, яких не існує
if (!$category_id AND $view_template != “rss”) {
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]}”);
die(“Redirect”);
}
//рішення проблеми з категоріями, яких не існує

Сховати список правок

Тепер всі категорії або каталоги, які не існують і не мають свого id (перевірка на існування йде саме по id) будуть редиректиться на головну сторінку.

Редирект для публікацій, у яких відсутня ID головну сторінку

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Ще одна реальна історія, взята з моїх сайтів. В панелі вебмастера висить багато сторінок з помилкою 404 такого виду site.ru/category/subcat/page-name.html, а за правилами має бути так site.ru/category/subcat/123-page_name.html. От чесно, до цих пір не розумію, яким чином і чому пропав ID новини і хто посилався на публікації таким чином. Жодних модулів і хаків, які прибирають з url ідентифікатор я ніколи не використовував, так що я грішу на користувачів, які «криво» ставлять посилання в своїх бложеках на мій сайт. Ну да ладно, це вже не важливо, а важливо розібратися з цією проблемою!

Тільки для версій DLE 10.x (а так само для 9.5, 9.6, 9.7 та 9.8)

Нова версія коду крім того, що редиректит «проблемні» адреси сторінок повною новини, але так само редиректит на головну ще й неіснуючі або видалені статичні сторінки. Пов’язано це зі зміною логікою в движку. З одного боку, напевно, це добре, адже одним махом дві проблеми вирішуємо. З іншого боку, спочатку движок видає звичайну 404 помилку — якщо вас влаштовує такий стан справ, тоді не вносите правки, описані в цьому пункті.

Розкрити список правок

Відкриваємо файл /engine/modules/static.php і знаходимо в самому кінці:

@header( “HTTP/1.0 404 Not Found” );
$lang[‘static_page_err’] = str_replace (“{page}”, $name.“.html”, $lang[‘static_page_err’]);
msgbox( $lang[‘all_err_1’], $lang[‘static_page_err’] );

@header( “HTTP/1.0 404 Not Found” );
$lang[‘static_page_err’] = str_replace (“{page}”, $name.”.html”, $lang[‘static_page_err’]);
msgbox( $lang[‘all_err_1’], $lang[‘static_page_err’] );

ЗАМІНЮЄМО на:

// 301 редирект на головну з адрес сторінок новин, де пропав id, а так само неіснуючих статичних сторінок
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]});
die(“Redirect”);
// 301 редирект на головну з адрес сторінок новин, де пропав id, а так само неіснуючих статичних сторінок

// 301 редирект на головну з адрес сторінок новин, де пропав id, а так само неіснуючих статичних сторінок
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]}”);
die(“Redirect”);
// 301 редирект на головну з адрес сторінок новин, де пропав id, а так само неіснуючих статичних сторінок

Сховати список правок

Старе рішення. Тільки для версій DLE 7.x, 8.x, 9.0, 9.2 та 9.3

Всі адреси, що містять на кінці .html та не містять у собі ID будуть редиректиться на головну сторінку. Існуючі і коректні статичні сторінки, хоч і вони так само не мають ID в url-адресі, редиректиться не будуть, а будуть працювати як і раніше.

Розкрити список правок

Відкриваємо все файл /engine/engine.php і знаходимо:

if ($subaction == ) $subaction = “showfull”;
}

if ($subaction == “) $subaction = “showfull”;
}

НИЖЧЕ додаємо:

// 301 редирект на головну з адрес сторінок новин, де пропав id
if ( ( $config[‘allow_alt_url’] == “yes” ) && (strpos($_SERVER[‘REQUEST_URI’], ‘.html’) !== false) && ($dle_module == “main”) ) {
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]});
die(“Redirect”);
}
// 301 редирект на головну з адрес сторінок новин, де пропав id

// 301 редирект на головну з адрес сторінок новин, де пропав id
if ( ( $config[‘allow_alt_url’] == “yes” ) && (strpos($_SERVER[‘REQUEST_URI’], ‘.html’) !== false) && ($dle_module == “main”) ) {
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]}”);
die(“Redirect”);
}
// 301 редирект на головну з адрес сторінок новин, де пропав id

Сховати список правок

Редирект для віддалених або неіснуючих новин на головну

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Ну, тут стандартна ситуація і може зустрітися на будь-якому сайті. Ви видалили якусь новину і, ясна річ, буде видаватися 404 помилка. Якщо вас це не влаштовує, а саме те, що видається 404 помилка, то можна зробити, наприклад, 301-редирект на головну сторінку сайту, яка вже точно існує 😉

Розкрити список правок

Відкриваємо файл /engine/modules/show.full.php і знаходимо:

elseif( ! $news_found ) {
@header( “HTTP/1.0 404 Not Found” );
msgbox( $lang[‘all_err_1’], $lang[‘news_err_12’] );
}

elseif( ! $news_found ) {
@header( “HTTP/1.0 404 Not Found” );
msgbox( $lang[‘all_err_1’], $lang[‘news_err_12’] );
}

ЗАМІНЮЄМО на:

// 301 редирект на головну, якщо новина не знайдено/не існує
elseif( ! $news_found ) {
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]});
die(“Redirect”);
}
// 301 редирект на головну, якщо новина не знайдено/не існує

// 301 редирект на головну, якщо новина не знайдено/не існує
elseif( ! $news_found ) {
header(“HTTP/1.0 301 Moved Permanently”);
header(“Location: {$config[‘http_home_url’]}”);
die(“Redirect”);
}
// 301 редирект на головну, якщо новина не знайдено/не існує

Сховати список правок

Тепер при переході на неіснуючу або віддалену публікацію буде здійснюватися редирект на головну сторінку сайту.

Забороняємо індексацію розділів сайту за допомогою мета-тега robots

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Отже, пам’ятайте нещодавно я публікував пост про особливості індексації сайтів, robots.txt і мета-тег robots, де говорив, що закривати сторінки від індексації за допомогою robots.txt не тру, а ось закривати за допомогою правильний варіант. Настійно рекомендую вивчити даний пост.

А зараз я розповім, як можна реалізувати висновок цього самого метатега у движку DLE у певних розділах сайту.
Розширену версію цього трюку дивіться у пості про правильний robots.txt для DLE.

Якщо не відчуваєте в собі впевненості, настійно рекомендую використовувати мій модуль DonBot! З модулем ви з будь-якого не помилитеся ніде, а так само вам не доведеться після кожного оновлення движка вносити дані правки.

Розкрити список правок

Відкриваємо вже полюбився файл /engine/engine.php, знаходимо потрібну рядок і видаляємо:

<meta name=“robots” content=“all” />

Якщо такого рядка немає, нічого страшного, просто йдемо далі.

Знаходимо далі:

if ($config[‘allow_rss’]) $metatags .= <<;

if ($config[‘allow_rss’]) $metatags .= <<

ВИЩЕ додаємо:

if ($subaction == ‘userinfo’ OR
$subaction == ‘allnews’ OR
$subaction == ‘newposts’ OR
$do == ‘stats’ OR
$do == ‘addnews’ OR
$do == ‘register’ OR
$do == ‘favorites’ OR
$do == ‘rules’ OR
$do == ‘pm’ OR
$do == ‘feedback’ OR
$do == ‘lastcomments’ OR
$do == ‘lostpassword’ OR
$do == ‘search’ OR
$do == ‘lastnews’ OR
$do == ‘alltags’ OR
$do == ‘tags’ OR
$dle_module == ‘date’) $metatags .= <<;

if ($subaction == ‘userinfo’ OR
$subaction == ‘allnews’ OR
$subaction == ‘newposts’ OR
$do == ‘stats’ OR
$do == ‘addnews’ OR
$do == ‘register’ OR
$do == ‘favorites’ OR
$do == ‘rules’ OR
$do == ‘pm’ OR
$do == ‘feedback’ OR
$do == ‘lastcomments’ OR
$do == ‘lostpassword’ OR
$do == ‘search’ OR
$do == ‘lastnews’ OR
$do == ‘alltags’ OR
$do == ‘tags’ OR
$dle_module == ‘date’) $metatags .= <<

Якщо ви хочете закрити від індексації сторінки пагинации, типу site.ru/page/X/ або site.ru/category/page/X/, тоді необхідно додати один рядок:

(intval($_GET[‘cstart’]) > 1 )

(intval($_GET[‘cstart’]) > 1 )

У підсумку код, наведений вище перетвориться так:

if ($subaction == ‘userinfo’ OR
$subaction == ‘allnews’ OR

$dle_module == ‘date’ OR
(intval($_GET[‘cstart’]) > 1 )) $metatags .= <<;

if ($subaction == ‘userinfo’ OR
$subaction == ‘allnews’ OR

$dle_module == ‘date’ OR
(intval($_GET[‘cstart’]) > 1 )) $metatags .= <<

Сховати список правок

Тепер я поясню, що означає кожен з пунктів умови if, і я для вас підготував чудову табличку з описом.

Модуль
Опис
Приклад URL
userinfoПерегляд профілю користувача.site.ru/user/user_name/
allnewsПерегляд новин конкретного користувача.site.ru/user/user_name/news/
newpostsПерегляд новинок, індивідуально для кожного користувача, доступно тільки зареєстрованим, гостям показується помилка.site.ru/newposts/
statsСторінка статистики сайту і ТОП10 користувачів.site.ru/statistics.html
addnewsСторінка додавання новини на сайт.site.ru/addnews.html
registerСторінка форми реєстрації нового користувача.site.ru/index.php?do=register
favoritesПерегляд вибраного, індивідуально для кожного користувача, доступно тільки зареєстрованим, гостям показується помилка.site.ru/favorites/
rulesСторінка правил сайту, які показуються перед реєстрацією, які існують так само окремою сторінкою.site.ru/rules.html
pmПерегляд особистих повідомлень користувачем або форма надсилання особистого повідомлення будь-якому користувачеві сайту.site.ru/index.php?do=pm
feedbackСторінка зворотнього зв’язку.site.ru/feedback.html
lastcommentsПерегляд всіх коментарів до публікація на сайті в зворотному хронологічному порядку.site.ru/index.php?do=lastcomments
lostpasswordСторінка відновлення пароля.site.ru/index.php?do=lostpassword
searchРозділ пошуку по сайту.site.ru/index.php?do=search
lastnewsПерегляд всіх останніх новин сайту. Точна копія головної сторінки сайту і всіх сторінок пагинации.site.ru/lastnews/
alltagsПереглянути сторінки всіх тегів сайту.site.ru/tags/
tagsПерегляд публікацій з конкретним тегом.site.ru/tags/Tag+Name/
dateАрхів сайту. Список публікацій за певний рік або місяць або день.site.ru/2007/ або site.ru/2007/06/ або site.ru/2007/06/22/

* Найважливіший момент — при закритті від індексації сторінок описаним методом, необхідно прибрати забороняють правила robots.txt для сторінок та розділів, які ми закрили за допомогою мета-тага. Інакше ніякого сенсу не буде.

На свій розсуд ви можете з наведеного мною коду прибрати якісь частини, розділи, які конкретно для вашого сайту закривати від індексації не потрібно. Так що, будь ласка, будьте уважнішими.

Додаємо тег rel=”canonical” для сторінок перегляду повної новини

Актуальність: Всі версії DLE. Перевірено на 7.x, 8.x, 9.x, 10.x.

Пам’ятається, хтось у коментарях до однієї з попередніх частин просив розповісти, як виводити тег rel=”canonical” в публікаціях на сайті, так от, хто не бачив мого коментаря з описом даного методу, читайте далі.

Розкрити список правок

Відкриваємо файл /engine/modules/show.full.php і…

для версії DLE 7.x, 8.x, 9.0, 9.2 та 9.3 знаходимо:

} else {
$full_link = $config[‘http_home_url’] . “index.php?newsid=” . $row[‘id’];
$print_link = $config[‘http_home_url’] . “engine/print.php?newsid=” . $row[‘id’];
$short_link = “”;
}

} else {
$full_link = $config[‘http_home_url’] . “index.php?newsid=” . $row[‘id’];
$print_link = $config[‘http_home_url’] . “engine/print.php?newsid=” . $row[‘id’];
$short_link = “”;
}

для версії DLE 10.x (а так само для 9.5, 9.6, 9.7 та 9.8) знаходимо:

} else {
$full_link = $config[‘http_home_url’] . “index.php?newsid=” . $row[‘id’];
$print_link = $config[‘http_home_url’] . “engine/print.php?newsid=” . $row[‘id’];
$short_link = “”;
$link_page = “”;
$news_name = “”;
}

} else {
$full_link = $config[‘http_home_url’] . “index.php?newsid=” . $row[‘id’];
$print_link = $config[‘http_home_url’] . “engine/print.php?newsid=” . $row[‘id’];
$short_link = “”;
$link_page = “”;
$news_name = “”;
}

НИЖЧЕ додаємо:

$full_canonical = $full_link;

$full_canonical = $full_link;

Відкриваємо файл /engine/engine.php і знаходимо:

if ($config[‘allow_rss’]) $metatags .= <<<HTML

if ($config[‘allow_rss’]) $metatags .= <<

ВИЩЕ додаємо:

if ($full_canonical) {
$metatags .= <<;
}

if ($full_canonical) {
$metatags .= <<

Сховати список правок

Як би і все 😉 Кому треба, користуйтеся на здоров’я.

Що-то я, напевно, забув описати в даному пості, так як інформацію, описану тут, збирав протягом тривалого часу в голові, а не записував у блокнот. Але якщо ви що-то згадайте чи знайдете незвичайні помилки на своєму сайті – обов’язково пишіть в коментарях, я приймаю рішення вашої проблеми і додам його в посаду.

Спасибі за увагу, друзі, залишайтеся на зв’язку і підписуйтесь на новини блогу.

PS Я не впевнений, чи буде наступна частина керівництва, так як на даний момент писати в ній нічого, все, що могло б бути корисним, вже описано в існуючих трьох частинах. Але мало що… Все залежить від вас і ваших питань і пропозицій!

З повагою, Олександр Алаєв