Блин, да я как оказалось даже данные этого расширения удалить не могу. Error 524.
[3.2]SEO Sitemap
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
romaamor
- phpBB 3.0.7-PL1
- Сообщения: 2517
- Стаж: 14 лет 5 месяцев
- Откуда: Одесса
- Благодарил (а): 829 раз
- Поблагодарили: 214 раз
Re: [3.2]SEO Sitemap
-
romaamor
- phpBB 3.0.7-PL1
- Сообщения: 2517
- Стаж: 14 лет 5 месяцев
- Откуда: Одесса
- Благодарил (а): 829 раз
- Поблагодарили: 214 раз
Re: [3.2]SEO Sitemap
Удалил данные, удалил с сервера, залил версию 1.1.2 и получил ошибку - Процесс обновления завершился с ошибкой.
Отправлено спустя 4 минуты 45 секунд:
Таки переустановил версию 1.1.2. Всё равно ошибка 404.
Отправлено спустя 4 минуты 45 секунд:
Таки переустановил версию 1.1.2. Всё равно ошибка 404.
-
romaamor
- phpBB 3.0.7-PL1
- Сообщения: 2517
- Стаж: 14 лет 5 месяцев
- Откуда: Одесса
- Благодарил (а): 829 раз
- Поблагодарили: 214 раз
Re: [3.2]SEO Sitemap
Кароче, удалил полностью плагин Шредера и установил плагин SEO Sitemap. Запустилось сразу и гугл схавал.
-
southklad
- phpBB 3.1.0 RC4
- Сообщения: 3471
- Стаж: 14 лет 8 месяцев
- Благодарил (а): 871 раз
- Поблагодарили: 200 раз
Re: [3.2]SEO Sitemap
КОторое заброшенное? Или просто скачанное с другого сайта но того же автора )))
-
Kuskow
- phpBB 2.0.6
- Сообщения: 524
- Стаж: 10 лет 4 месяца
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 42 раза
- Поблагодарили: 53 раза
Re: [3.2]SEO Sitemap
Прошло несколько лет, мне опять стало нечего делать, и я переработал свой скрипт, а заодно своё отношение к SiteMap.Kuskow писал(а): 18.06.2020 11:13 написал свой PHP, который выбирает данные напрямую из базы, работает 0.1 секунд, создаёт текстовые файлы .TXT со списком страниц разделов и тем.
Да, но есть нюанс. Файл txt, если по всем правилам, может быть только один (главный). А если как у меня несколько файлов, то вместе с оглавлением они все должны быть только xml. Конечно, Google и Яндекс, обрабатывают их , даже если они разные, но по правилам не положено, вроде как. Ну и поскольку я тут недавно наловчился всё делать с искусственным интеллектом, то мы вместе с Google-ai сделали совершенно новый скрипт.
В новой редакции не только создаются xml-файлы sitemap, но и отправляются изменения с момента последней генерации напрямую в Яндекс, Bing и другие системы, которые подключились к проекту SendNow. Google пока не принял для себя эту технологию, якобы рассматривает её, но и ему мы угодили, вписав таки дату изменения страницы в SiteMap, но не для всех страниц, а только для тех, в которых появились новые сообщения или какое-то сообщение было изменено пользователем/модератором.
Итак, для установки и запуска скрипта нужно:
config.php форума, создать файл sitemap.phpс таким кодом: Код: Выделить всё
<?php
// Защита: разрешаем запуск только через серверный Cron (CLI)
if (PHP_SAPI != 'cli') { exit; }
// Конфигурация
$forums_disallow = '0,0,0'; // ID закрытых форумов через запятую
$urls_per_xml = 50000; // Максимальное количество ссылок в одном .xml-файле
$urls_to_send = [];
include(__DIR__ . '/config.php');
$db = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);
// Получение настроек phpBB из базы
$res = mysqli_query($db, "SELECT config_name, config_value FROM {$table_prefix}config WHERE config_name IN ('topics_per_page', 'posts_per_page', 'server_protocol', 'server_name', 'script_path')");
while (list($k, $v) = mysqli_fetch_row($res)) $$k = $v;
$host = $server_protocol . $server_name . $script_path;
// === ШАГ 1. ВЫГРУЗКА ПОСЛЕДНИХ ИЗМЕНЕНИЙ В INDEXNOW ===
if ($time_threshold = @filemtime(__DIR__ . '/sitemap.xml')) { // Если время успешно получено, то IndexNow
// Подхватываем или генерируем ключ IndexNow
if ($files = glob(__DIR__ . '/indexnow_*.txt')) {
$filename = basename($files[0]); // Безопасное извлечение имени первого файла из массива
$key = str_replace(['indexnow_', '.txt'], '', $filename);
} else {
$key = substr(md5(uniqid(rand(), true)), 0, 16);
$new_file = __DIR__ . '/indexnow_' . $key . '.txt';
file_put_contents($new_file, $key) or die(date('[Y-m-d H:i:s]') . " Критическая ошибка: Не удалось создать файл ключа.\n");
}
// Ищем посты, созданные или отредактированные после времени старой карты сайта
$f_post_where = $forums_disallow ? "AND p.forum_id NOT IN ($forums_disallow)" : "";
$sql = "SELECT p.topic_id,
GREATEST(p.post_time, p.post_edit_time) as msg_actual_time,
(SELECT COUNT(post_id) FROM {$table_prefix}posts WHERE topic_id = p.topic_id AND post_id <= p.post_id AND post_visibility = 1) as post_number
FROM {$table_prefix}posts p
WHERE (p.post_time >= $time_threshold OR p.post_edit_time >= $time_threshold)
AND p.post_visibility = 1
$f_post_where";
$result = mysqli_query($db, $sql);
// Распаковываем нумерованный массив прямо "на лету"
while (list($tid, $msg_time, $post_number) = mysqli_fetch_row($result)) {
$start = floor(($post_number - 1) / $posts_per_page) * $posts_per_page;
$url = $host . 'viewtopic.php?t=' . $tid . ($start ? '&start=' . $start : '');
// Используем null-коалесцентный оператор ?? для чистоты без нотисов
$urls_to_send[$url] = max($urls_to_send[$url] ?? 0, (int)$msg_time);
}
mysqli_free_result($result);
// Отправляем собранные URL в IndexNow
$data = [
'host' => parse_url($host, PHP_URL_HOST),
'key' => $key,
'keyLocation' => $host . 'indexnow_' . $key . '.txt',
'urlList' => array_keys($urls_to_send) ];
$jsonData = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$ch = curl_init('https://api.indexnow.org/indexnow');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8', 'Content-Length: ' . strlen($jsonData) ]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
}
// === ШАГ 2. СОЗДАНИЕ КАРТЫ САЙТА (SITEMAP) ===
$xmap = $ymap = $total_sitemap_urls = 0; $maps = '';
// Накопление и выгрузка xml-записей
$add = function($url) use (&$maps, &$xmap, &$ymap, $host, $urls_per_xml, $urls_to_send) {
$full_url = $host . $url;
// Если страница обновлялась со времени последней выгрузеи, достаем её timestamp и формируем xml-тег
$lastmod = isset($urls_to_send[$full_url]) ? '<lastmod>' . date('Y-m-d', $urls_to_send[$full_url]) . '</lastmod>' : '';
$maps .= '<url><loc>' . htmlspecialchars($full_url, ENT_QUOTES, 'UTF-8') . '</loc>' . $lastmod . '</url>';
if (++$xmap === $urls_per_xml) {
file_put_contents(__DIR__ . '/sitemap-' . ++$ymap . '.xml', '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . $maps . '</urlset>');
$xmap = 0; $maps = ''; }
};
// 2.1. Форумы и их пагинация
$f_where = $forums_disallow ? "WHERE forum_id NOT IN ($forums_disallow)" : "";
$res = mysqli_query($db, "SELECT forum_id, forum_topics_approved FROM {$table_prefix}forums $f_where");
while (list($fid, $fta) = mysqli_fetch_row($res)) {
for ($start = 0; $start < $fta; $start += $topics_per_page) {
$add("viewforum.php?f=$fid" . ($start ? "&start=$start" : "")); }}
mysqli_free_result($res);
// 2.2. Темы и их пагинация (с фильтрацией мягко удаленных)
$t_where = "WHERE topic_visibility = 1 AND topic_posts_approved > 0 AND NOT topic_moved_id" . ($forums_disallow ? " AND forum_id NOT IN ($forums_disallow)" : "");
$res = mysqli_query($db, "SELECT topic_id, topic_posts_approved FROM {$table_prefix}topics $t_where");
while (list($tid, $tpa) = mysqli_fetch_row($res)) {
for ($start = 0; $start < $tpa; $start += $posts_per_page) {
$add("viewtopic.php?t=$tid" . ($start ? "&start=$start" : "")); }}
mysqli_free_result($res);
mysqli_close($db);
// 2.3. Главная страница
$total_sitemap_urls = $urls_per_xml * $ymap + $xmap +1;
$xmap = $urls_per_xml - 1;
$add('');
// Создание главного файла-индекса
file_put_contents(__DIR__ . '/sitemap.xml',
'<?xml version="1.0" encoding="UTF-8"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
. implode('', array_map(fn($i) => "<sitemap><loc>{$host}sitemap-{$i}.xml</loc></sitemap>", range(1, $ymap)))
. '</sitemapindex>');
// Финальный вывод лога
echo date('[Y-m-d H:i:s]') . " Всего страниц в Sitemap: $total_sitemap_urls. " .
"Отправлено в IndexNow: " . count($urls_to_send) . ". " .
"Ответ IndexNow: " . ($httpCode ? $httpCode : "0 (Нет URL для отправки)") . "\n";
- в строке
$forums_disallow = '0,0,0'; заменить "0,0,0" на список форумов (разделов), которые не нужно индексировать (которые скрыты и недоступны для поисковиков).В той же папке скрипта при каждом его запуске будет создаваться главный индексный файл
sitemap.xml с оглавлением и по одному файлу sitemap-N.xml на каждые 50 тысяч ссылок (страниц форума). Даже если на форуме только пять страниц, всё равно создаётся два файла (оглавление и номерной).В той же папке скрипта только при первом запуске создастся файл ключа
indexnow_абракадабра.txt, где вместо "абракадабра" будет написан сам ключ. Он сгенерируется случайным образом, он нужен для того, чтобы подтвердить Яндексу/Бингу право владения домена и право отправлять информацию об изменённых страницах от имени этого домена. Содержимое этого файла неважно, файл нужен только во время работы скрипта, а точнее, при отправке данных на сервер IndexNow. Его можно и удалить, но при следующем запуске скрипта он создастся там же заново, так что лучше не уалять. Тут пишу о нём только для того, чтоб вы не пугались новых файлов.Мои разработки для phpBB: php-антибот, SiteMap, DiscussionForumPosting, Вставка эмодзи, загрузка изображений.

