исправлено Sitemap предложения

Dr_Brown

Пользователь
В общем смысл в чем.....
У вас будет все ок до тех пор, пока будет до 40 000 ссылок....после это класс должен создать вторую страницу и т.д.....но там была заморочка, короче в цикле не помню уже смысл, но я в сайтмпап классе добавлял такую строку, так как генерация страниц не работала, или работала не последовательно, в общем вот решение:

найти:

Код:
for ($i =0; $i < $pages_count; $i++) {

ниже добавить:

Код:
$n = '';

т.е. будет выглядеть так:

Код:
for ($i =0; $i < $pages_count; $i++) {
     
                $n = '';
                $t = $i+2;
                $n = $i+1;
 
                $sitemap = $this->build_map_topic( $n );
 
                $handler = fopen(BB_ROOT. "/sitemap/sitemap{$t}.xml", "wb+");
                fwrite($handler, $sitemap);
                fclose($handler);
     
                @chmod(BB_ROOT. "/sitemap/sitemap{$t}.xml", 0666);
 
            }

И ещё нумерацию топиков по ссылкам не правильная, т.е по id, ну типа идет 10,9,8,7......1, а должно быть 1,2.......8,9,10......n. Прикол в том, что если у вас будет больше чем 1 страница с сайтмп, Гогл будет постоянно думать что у вас новый сайтмап и выгружать его каждый раз заново, и переидексировать как бы, т.е. у вас будет 1 сраница сайтмапа все время динамическая, а должна быть статическая, и новые ссылки по мере добавления торренотов например должны ложиться в страницу 2,3, и т.д тогда гогл будет выгружать только то что менялось, поэтому решение изменить запрос:

найти:

Код:
$sql = DB()->sql_query("SELECT topic_id, topic_title, topic_time FROM " . BB_TOPICS . " ".$ignore_forum_sql." ORDER BY topic_time DESC" . $this->limit);

заменить:

Код:
    $sql = DB()->sql_query("SELECT topic_id, topic_title, topic_time FROM " . BB_TOPICS . " ".$ignore_forum_sql." ORDER BY topic_time ASC" . $this->limit);

А ещё в админке не нашел крон задачи, которая обновляет сайтпам каждый день, или это как то по другому сделали ?
 

Sprinx

Пользователь
И ещё нумерацию топиков по ссылкам не правильная, т.е по id, ну типа идет 10,9,8,7......1, а должно быть 1,2.......8,9,10......n.
Специально было так сделано, чтоб новые страницы, лучше индексировались.
 

Exile

Администратор


После такого извращения php выдаст fatal error и дальше работать не будет. Мы сначала переменную объявляем строковой, а потом к ней начинаем числа плюсовать. Это как так вообще? Быть может, проблема с этой сортировкой была вызвана тем, что мод был ворованный? Мы конечно проверим названную проблему, если что - закоммитим исправление.
А ещё в админке не нашел крон задачи, которая обновляет сайтпам каждый день, или это как то по другому сделали ?

На демо? Там дамп неполный, завтра только обновлю. На демо ее в крон-админке нет. В дампе все ок.
Прикол в том, что если у вас будет больше чем 1 страница с сайтмп, Гогл будет постоянно думать что у вас новый сайтмап и выгружать его каждый раз заново, и переидексировать как бы, т.е. у вас будет 1 сраница сайтмапа все время динамическая, а должна быть статическая, и новые ссылки по мере добавления торренотов например должны ложиться в страницу 2,3, и т.д тогда гогл будет выгружать только то что менялось, поэтому решение изменить запрос

Что за бред? Бот поисковой системы выгружает файл sitemap так или иначе постоянно, чтобы удостовериться что в нем нет изменений и т.п. Для чего делать статичные файлы, в которых нет ни единой правки длительное время, если нам наоборот надо чтобы бот поисковой системы как можно больше url из sitemap проиндексировал? Откуда информация про "принципы" сканирования файла sitemap поисковыми системами?

Please Login or Register to view hidden text.

- тут ничего такого, например, нет. Наоборот по описанию желательно чтобы файл всегда "свеженький" был.
 

Dr_Brown

Пользователь
У меня мод не ворованный был я покупал....
щас вложу свой сайтмап класс, и сравни....
у меня прекрасно все работает и индексируется поисковиками и в ерор пхп не уходит, пример сайтмпа на freebie.net.ua, там больше 40 000 топиков
я констатирую лишь факт того что Гугл сайтпам выгружал к себе каждый день, и занова полностью переиндексировал, до того как я внес выше указанные корректировки
Код:
<?php
 
class sitemap {
    var $home = "";
    var $limit = 0;
    var $topic_priority = "0.5";
    var $stat_priority = "0.5";
    var $priority = "0.6";
    var $cat_priority = "0.7";
 
    function sitemap() {
        global $bb_cfg;
     
        $this->home = 'http://'.$bb_cfg['server_name'].'/';
 
    }
 
    function build_map() {
     
        $map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
        $map .= $this->get_static();
        $map .= $this->get_forum();
        $map .= $this->get_topic();
        $map .= "</urlset>";
 
        return $map;
 
    }
 
    function build_index( $count ) {
     
        $map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
 
        $lastmod = date( "Y-m-d" );     
 
        $map .= "<sitemap>\n<loc>{$this->home}sitemap/sitemap1.xml</loc>\n<lastmod>{$lastmod}</lastmod>\n</sitemap>\n";
 
        for ($i =0; $i < $count; $i++) {
            $t = $i+2;
            $map .= "<sitemap>\n<loc>{$this->home}sitemap/sitemap{$t}.xml</loc>\n<lastmod>{$lastmod}</lastmod>\n</sitemap>\n";
        }
 
        $map .= "</sitemapindex>";
     
        return $map;
 
    }
 
    function build_stat() {
     
        $map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
        $map .= $this->get_static();
        $map .= $this->get_forum();
        $map .= "</urlset>";
     
        return $map;
 
    }
 
    function build_map_topic( $n ) {
     
        $map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
        $map .= $this->get_topic( $n );
        $map .= "</urlset>";
     
        return $map;
 
    }
 
    function get_forum() {
 
    global $datastore;
 
        $this->priority = $this->cat_priority; 
 
        $xml = "";
        $lastmod = date( "Y-m-d" );
        if (!$forums = $datastore->get('cat_forums'))
        {
            $datastore->update('cat_forums');
            $forums = $datastore->get('cat_forums');
        }
        $not_forums_id = $forums['not_auth_forums']['guest_view'];
     
        $ignore_forum_sql = ($not_forums_id) ? "WHERE forum_id NOT IN($not_forums_id)" : ''; 
     
        $sql = DB()->sql_query("SELECT forum_id, forum_topics, forum_parent, forum_name FROM ".BB_FORUMS." ".$ignore_forum_sql." ORDER BY forum_id ASC");
     
        while ($row = DB()->sql_fetchrow($sql)) {         
            if (function_exists('seo_url')) $loc = $this->home . seo_url(FORUM_URL . $row['forum_id'], $row['forum_name']);
            else $loc = $this->home . FORUM_URL. $row['forum_id'];
         
            $xml .= $this->get_xml( $loc, $lastmod );
 
        }
         
        return $xml;
    }
 
    function get_topic( $page = false ) {
 
    global $datastore;
 
        $xml = "";
        $this->priority = $this->topic_priority;
     
        if ( $page ) {
 
            $page = $page - 1;
            $page = $page * 40000;
            $this->limit = " LIMIT {$page},40000";
 
        } else {
 
            if( $this->limit < 1 ) $this->limit = false;
         
            if( $this->limit ) {
             
                $this->limit = " LIMIT 0," . $this->limit;
         
            } else {
             
                $this->limit = "";
         
            }
        }
     
        if (!$forums = $datastore->get('cat_forums'))
        {
            $datastore->update('cat_forums');
            $forums = $datastore->get('cat_forums');
        }
     
        $not_forums_id = $forums['not_auth_forums']['guest_view'];
     
        $ignore_forum_sql = ($not_forums_id) ? "WHERE forum_id NOT IN($not_forums_id)" : '';
     
        $sql = DB()->sql_query("SELECT topic_id, topic_title, topic_time FROM " . BB_TOPICS . " ".$ignore_forum_sql." ORDER BY topic_time ASC" . $this->limit);
     
        while ($row = DB()->sql_fetchrow($sql)) {
 
            if( function_exists('seo_url') ) $loc = $this->home . seo_url(TOPIC_URL . $row['topic_id'], $row['topic_title']); 
            else $loc = $this->home . TOPIC_URL. $row['topic_id'];
 
            $xml .= $this->get_xml( $loc, date( "Y-m-d", $row['topic_time'] ) );
        }
     
        return $xml;
    }
 
    function get_static() {
 
    global $bb_cfg;
     
        $xml = "";
        $lastmod = date( "Y-m-d" );
        $this->priority = $this->stat_priority;
     
        if(isset($bb_cfg['static_sitemap'])) {
            $static_url = preg_replace("/\s/", '', $bb_cfg['static_sitemap']);//вырезаем переносы строк
            preg_match_all ('#(https?://[\w-]+[\.\w-]+/((?!https?://)[\w- ./?%&=])+)#', $static_url, $out);
     
            $static_url = count($out['0']);
            if($static_url > 0)
            {
                foreach($out['0'] as $url)
                {
                    $loc = $url;
                    $xml .= $this->get_xml( $loc, $lastmod );                 
                }
            }
        }
        return $xml;
    }
 
    function get_xml($loc, $lastmod) {
     
        $xml = "\t<url>\n";
        $xml .= "\t\t<loc>$loc</loc>\n";
        $xml .= "\t\t<lastmod>$lastmod</lastmod>\n";
        $xml .= "\t\t<priority>" . $this->priority . "</priority>\n";
        $xml .= "\t</url>\n";
     
        return $xml;
    }
 
    function send_url($url, $map) {
                 
        $data = false;
         
        $file = $url.urlencode($map);
                 
        if( function_exists( 'curl_init' ) ) {
                     
            $ch = curl_init();
            curl_setopt( $ch, CURLOPT_URL, $file );
            curl_setopt( $ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] );
            curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, false );
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
            curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 6 );
                     
            $data = curl_exec( $ch );
            curl_close( $ch );
         
            return $data;
                 
        } else {
         
            return @file_get_contents( $file );
         
        }
         
    }
 
    function create() {
 
        $row = DB()->fetch_row("SELECT COUNT(*) AS count FROM ". BB_TOPICS ."");
        if ( !$this->limit ) $this->limit = $row['count'];
 
 
        if ( $this->limit > 40000 ) {
 
            $pages_count = @ceil( $row['count'] / 40000 );
 
            $sitemap = $this->build_index( $pages_count );
 
            $handler = fopen(BB_ROOT. "/sitemap/sitemap.xml", "wb+");
            fwrite($handler, $sitemap);
            fclose($handler);
 
            @chmod(BB_ROOT. "/sitemap/sitemap.xml", 0666);
 
            $sitemap = $this->build_stat();
 
            $handler = fopen(BB_ROOT. "/sitemap/sitemap1.xml", "wb+");
            fwrite($handler, $sitemap);
            fclose($handler);
 
            @chmod(BB_ROOT. "/sitemap/sitemap.xml", 0666);
 
            for ($i =0; $i < $pages_count; $i++) {
     
                $n = '';
                $t = $i+2;
                $n = $i+1;
 
                $sitemap = $this->build_map_topic( $n );
 
                $handler = fopen(BB_ROOT. "/sitemap/sitemap{$t}.xml", "wb+");
                fwrite($handler, $sitemap);
                fclose($handler);
     
                @chmod(BB_ROOT. "/sitemap/sitemap{$t}.xml", 0666);
 
            }
 
        } else {
 
            $sitemap = $this->build_map();
 
            $handler = fopen(BB_ROOT. "/sitemap/sitemap.xml", "wb+");
            fwrite($handler, $sitemap);
            fclose($handler);
 
            @chmod(BB_ROOT. "/sitemap/sitemap.xml", 0666);
        }
     
            $params['sitemap_time'] = TIMENOW;
            bb_update_config($params);
    }
}
 
?>

у меня имеено в таком варианте он работает как в под спойлером.
 

Exile

Администратор
Dr_Brown, ну он и должен как бы полностью переиндексировать все. Ему указываем ссылки в начале на самое новое, чтобы он знал что появилось и что индексировать будем. Ну в общем спасибо за предложения, потестируем, если какие-то ошибки на самом деле есть - поправим.
 

Exile

Администратор
Dr_Brown, ну и вообще, в каком бы порядке ссылки в sitemap указаны не были, боту поисковой системы только эта строка интересна:
Код:
<lastmod>2014-08-07</lastmod>
Если ссылка есть в индексе и дата индекса аналогична текущей дате ссылки, ничего заново индексироваться не будет. Под проверку только новые пойдут.
 

Dr_Brown

Пользователь
Exile, я согласен с тобой про дату....но этот сайтмап, работает так, когда больше 40 000 ссылок, сначала идет:
sitemap.xml - в нем все форумы и то что добавлено руками
потом
sitemap1.xml
sitemap2.xml
......................
sitemap-n.xml

В них у же будут топики.....Тока как оказалось что для гогла ещё важен порядок ссылок, и не факт что он быстрее индексирует sitemap1.xml чем sitemap2.xml
Сначала у тебя был sitemap1.xml, где было
10,9,8,7
и потом добавили топики 11,12,13
и стало в sitemap1.xml
11,12,13.....10,9,8,7

6,5,4,3 и т.д. попадают в sitemap2.xml

и т.д.

а должно быть так, и везде так, заполнился 1 сайтмап, и все он уже выгружен, и заиндексирован и гогл его не трогает, а тока сомтрит на 2,3, страницы и т.д смысл

И гогла занова выгружает все файлы и переиндексирует. Яндексу похер....не вопрос.

Я пишу с чем я столкнулся в реалии, причем на трех или 4-х трекерах
 

dimka3210

Пользователь
После такого извращения php выдаст fatal error и дальше работать не будет. Мы сначала переменную объявляем строковой, а потом к ней начинаем числа плюсовать.
Вот кстати не выдаст) Это же пхп) Там два массива можно складывать)
 
Сверху