I dag har jag suttit i 3.5 timmar och jobbat med Drupals xmlsitemap. Varför?
Jag har använt xmlsitemap 6.x-1.0-beta3 det har länge fungerat bra. Det var lite problem i början men sen gick det som jag ville. För en vecka sen bad Drupal mig att uppdatera till xmlsitemap 6.x-1.0-beta5. Jag funderade på om en uppdatering skulle vara värt besväret... Jag vet ju att många har haft problem med denna modul. "If it's not broken, don't fix it."
Men i morse så hittade jag ett fel i sitemapen. Det fanns en URL som inte var giltig. Då var en uppdatering ett faktum.
Dryga timmen senare så kände jag att ett fel i sitemapen var inte så farligt... För nu hade jag inte sitemap alls. Jag läste min till på Drupals hemsida att massor av andra användare har haft samma problem med xmlsitemap 6.x-1.0-beta5.
xmlsitemap 6.x-2.x-dev
Jag började då testa xmlsitemap 6.x-2.x-dev och märkte att mycket hade ändrats... Dock indexerades inte taxonomy i den nya sitemapen, inte heller kunde jag ange prioriteten ("Priority") på noderna. Men efter ytterligare nån timme kunde hade jag själv (nästan) skrivit dit lite kod så det fungerade som jag vill.
Min kod är så ful att jag inte vill ladda upp den på Drupals hemsida. Men om det är nån som efter timmars googlande läser detta inlägg så ger jag ut lösningen nu.
Uppdatera Drupals xmlsitemap själv
Innan man installerar xmlsitemap 6.x-2.x-dev ska man sätta sidan i off-line mode och ta bort (uninstall) tidigare versioner av xmlsitemap. Sen när man lagt in filerna kan man göra följande ändringar i filen xmlsitemap_node.module.
Den första funktionen gjorde jag lite längre...
function xmlsitemap_node_cron() {
// Start with the most recently changed nodes first.
$query = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {xmlsitemap} x ON x.type = 'node' AND n.nid = x.id WHERE (x.id IS NULL OR x.status IS NULL) ORDER BY n.changed DESC", 0, xmlsitemap_var('batch_limit'));
while ($nid = db_result($query)) {
$node = node_load($nid, NULL, TRUE);
xmlsitemap_node_create_link($node);
xmlsitemap_save_link($node->xmlsitemap);
}
//
//add the taxonomy
$query = db_query_range("SELECT t.tid FROM {term_data} t LEFT JOIN {xmlsitemap} x ON x.type = 'term' AND t.tid = x.id WHERE (x.id IS NULL OR x.status IS NULL) ", 0, xmlsitemap_var('batch_limit'));
//all terms..
while ($tid = db_result($query)) {
$arr=array(
'type' => 'term',
'id' => $tid,
'loc' => 'taxonomy/term/'. $tid,
'status' => '1',
'priority' => '0.5',
'lastmod' => '0',
'changefreq' => '604800',
'changecount' => '0',
'node_type' => 'taxonomy',
);
xmlsitemap_save_link($arr);
}
}
Detta lägger till taxonomy termer i sitemapen. Alla termer får prioriteten 0.5.
För att kunna ändra prioriteten på noderna tog jag bort kommentarerna i funktionen xmlsitemap_node_form_alter på rad ca 100. Den bit kod som jag tog bort kommentarerna framför var:
$form['xmlsitemap']['priority'] = array(
'#type' => 'select',
'#title' => t('Priority'),
'#options' => xmlsitemap_get_priority_options(TRUE, variable_get('xmlsitemap_node_priority_' . $node->type, 'default')),
'#default_value' => $node->xmlsitemap['priority'],
);
För att alternativet ska visas när du redigerar en node så se till att ändra i nån rad ovanför. Ändra från:
'#access' => FALSE && (user_access('administer xmlsitemap') || user_access('administer nodes')),
till:
'#access' => TRUE && (user_access('administer xmlsitemap') || user_access('administer nodes')),
Det finns säkert ett skäl till att det var bortkommenterat... men jag har inte märkt nån bugg än.
Spara sedan xmlsitemap_node.module. För att sitemapen ska känna av när du tar bort en term så måste du ändra i filen xmlsitemap.inc. På rad ca 150 finns en funktion som heter xmlsitemap_generate_chunk. Ändra dess variabel $slq från:
$sql = "SELECT x.loc, x.lastmod, x.changefreq, x.changecount, x.priority FROM {xmlsitemap} x
WHERE x.status = '1'";
Till:
$sql = "SELECT DISTINCT x.loc, x.lastmod, x.changefreq, x.changecount, x.priority FROM {xmlsitemap} x, {term_data} t
WHERE x.status = '1' AND ((x.type='term' AND t.tid = x.id) OR x.type<>'term')";
Detta tar inte bort gamla termer i databasen. Men resultatet blir det samma. Spara filen och kör update.php. Nu kan du sätta sidan i online mode igen. För att sitemapen ska uppdateras måste cron köras ett par gånger.
Nu har du en fungerade sitemap i Drupal. Min lösning är temporär i väntan på en stabil och fungerande version av xmlsitemap.

Post new comment