[3.2]SEO Sitemap

У вас есть идея для расширения функциональности phpBB? Расскажите о ней здесь!
Правила форума
Местная Конституция | Шаблон запроса | Документация (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 »

igorbond писал(а): 28.04.2021 17:23 А если еще раз загрузить? Последняя версия 1.1.2
Блин, да я как оказалось даже данные этого расширения удалить не могу. Error 524.
Аватара пользователя
southklad
phpBB 3.1.0 RC4
Сообщения: 3471
Стаж: 14 лет 8 месяцев
Благодарил (а): 871 раз
Поблагодарили: 200 раз

Re: [3.2]SEO Sitemap

Сообщение southklad »

Удалять через STK
Изображение
Аватара пользователя
romaamor
phpBB 3.0.7-PL1
Сообщения: 2517
Стаж: 14 лет 5 месяцев
Откуда: Одесса
Благодарил (а): 829 раз
Поблагодарили: 214 раз

Re: [3.2]SEO Sitemap

Сообщение romaamor »

Удалил данные, удалил с сервера, залил версию 1.1.2 и получил ошибку - Процесс обновления завершился с ошибкой.

Отправлено спустя 4 минуты 45 секунд:
Таки переустановил версию 1.1.2. Всё равно ошибка 404.
Аватара пользователя
southklad
phpBB 3.1.0 RC4
Сообщения: 3471
Стаж: 14 лет 8 месяцев
Благодарил (а): 871 раз
Поблагодарили: 200 раз

Re: [3.2]SEO Sitemap

Сообщение southklad »

У вас явно какие то проблемы, потому что ошибки просто так не вылазят
Изображение
Аватара пользователя
romaamor
phpBB 3.0.7-PL1
Сообщения: 2517
Стаж: 14 лет 5 месяцев
Откуда: Одесса
Благодарил (а): 829 раз
Поблагодарили: 214 раз

Re: [3.2]SEO Sitemap

Сообщение romaamor »

Кароче, удалил полностью плагин Шредера и установил плагин SEO Sitemap. Запустилось сразу и гугл схавал.
Аватара пользователя
southklad
phpBB 3.1.0 RC4
Сообщения: 3471
Стаж: 14 лет 8 месяцев
Благодарил (а): 871 раз
Поблагодарили: 200 раз

Re: [3.2]SEO Sitemap

Сообщение southklad »

romaamor писал(а): 28.04.2021 18:14 плагин Шредера и установил плагин SEO Sitemap
КОторое заброшенное? Или просто скачанное с другого сайта но того же автора )))
Изображение
Аватара пользователя
romaamor
phpBB 3.0.7-PL1
Сообщения: 2517
Стаж: 14 лет 5 месяцев
Откуда: Одесса
Благодарил (а): 829 раз
Поблагодарили: 214 раз

Re: [3.2]SEO Sitemap

Сообщение romaamor »

Почему заброшенное ? Обновлялось всего год назад. :)
https://github.com/CrazyC0d3r/sitemap
Аватара пользователя
Kuskow
phpBB 2.0.6
Сообщения: 524
Стаж: 10 лет 4 месяца
Откуда: 🇰🇿 Караганда
Благодарил (а): 42 раза
Поблагодарили: 53 раза

Re: [3.2]SEO Sitemap

Сообщение Kuskow »

Kuskow писал(а): 18.06.2020 11:13 написал свой PHP, который выбирает данные напрямую из базы, работает 0.1 секунд, создаёт текстовые файлы .TXT со списком страниц разделов и тем.
Прошло несколько лет, мне опять стало нечего делать, и я переработал свой скрипт, а заодно своё отношение к SiteMap.
RedNaxi писал(а): 18.06.2020 11:21 А яндекс и гугл поддерживают sitemap в формате текста?
Да, но есть нюанс. Файл txt, если по всем правилам, может быть только один (главный). А если как у меня несколько файлов, то вместе с оглавлением они все должны быть только xml. Конечно, Google и Яндекс, обрабатывают их , даже если они разные, но по правилам не положено, вроде как. Ну и поскольку я тут недавно наловчился всё делать с искусственным интеллектом, то мы вместе с Google-ai сделали совершенно новый скрипт.

В новой редакции не только создаются xml-файлы sitemap, но и отправляются изменения с момента последней генерации напрямую в Яндекс, Bing и другие системы, которые подключились к проекту SendNow. Google пока не принял для себя эту технологию, якобы рассматривает её, но и ему мы угодили, вписав таки дату изменения страницы в SiteMap, но не для всех страниц, а только для тех, в которых появились новые сообщения или какое-то сообщение было изменено пользователем/модератором.

Итак, для установки и запуска скрипта нужно:

1️⃣ В той же папке, где находится 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";

2️⃣ В тексте скрипта настроить параметры для конкретно своего форума:
- в строке $forums_disallow = '0,0,0'; заменить "0,0,0" на список форумов (разделов), которые не нужно индексировать (которые скрыты и недоступны для поисковиков).

3️⃣ Настроить запуск этого скрипта в системном cron. Я себе сделал раз в сутки ночью (ранним утром), когда основная масса пользователей поисписалась и пошла спать.

4️⃣ После первого запуска скрипта проверить наличие файла sitemap.xml и прописать его в своём robots.txt.

В той же папке скрипта при каждом его запуске будет создаваться главный индексный файл sitemap.xml с оглавлением и по одному файлу sitemap-N.xml на каждые 50 тысяч ссылок (страниц форума). Даже если на форуме только пять страниц, всё равно создаётся два файла (оглавление и номерной).
В той же папке скрипта только при первом запуске создастся файл ключа indexnow_абракадабра.txt, где вместо "абракадабра" будет написан сам ключ. Он сгенерируется случайным образом, он нужен для того, чтобы подтвердить Яндексу/Бингу право владения домена и право отправлять информацию об изменённых страницах от имени этого домена. Содержимое этого файла неважно, файл нужен только во время работы скрипта, а точнее, при отправке данных на сервер IndexNow. Его можно и удалить, но при следующем запуске скрипта он создастся там же заново, так что лучше не уалять. Тут пишу о нём только для того, чтоб вы не пугались новых файлов.

Вернуться в «Запросы расширений для phpBB»