Google Sitemap Xml - Einfach zu Erstellen

lt. den Fehlermeldungen versucht das Script eine Datei “[B]sitemap1.xml[/B]” zu öffnen (fürs schreiben), was fehl schlägt. Die Fehler in Zeile 300 und 301 sind nur folgefehler.

Folglich heißt das:

  • wenn die Datei vorhanden ist, hat das Script nicht die nötige Berechtigung um rein zu
    schreiben

  • wenn sie nicht vorhanden ist, kann das Script in dem betreffenden Verzeichnis keine Dateien erzeugen.

Neben der Schreibberechtigung direkt kann das u.U. auch daran liegen das die Datei einen “höher” gestellten Eigentümer hat. Passiert gern mal wenn man über sftp arbeitet :slight_smile:

…aber mit chmod 777 sollte selbst die falsche Gruppen/Eigentümer - Sache übersteuert sein.

habe das überprüft: Bin mit dem Hauptnutzer angemeldet und alle Dateien haben die benötigten Rechte: 0777. Das ist doch komisch oder? :frowning:

Hi,

nein, ist nicht komisch. Sprich mal mit Deinem Hosting Provider. Ich nehme an, dass der gesamte Ordner auf Deinem Server das Recht braucht, eigene Dateien anlegen zu können.

Gruß

Danke hat wunderbar funktioniert. Leider stimmt aber das Änderungsdatum und Uhrzeit der Kategorien und Produkte nicht. Wie kommt das?

Hallo,

hab alles so gemacht wie im Thread beschrieben und eine Sitemap mit 1091 Urls an Google übermittelt. Google liest auch alle 1091 und übermittelt keinerlei Fehler. Trotzdem werden nur 10 URLs im Web-Index von Google aufgenommen. Woran liegt das, bzw. was mache ich falsch?

Danke für Eure Hilfe

VG

Radox72

Hallo,
wie schon jemand vor mir erwähnt, fände ich es auch schöner wenn die urls der Hauptkategorien eingetragen werden. Gibt es da eine möglichkeit, wenn ja wie/was muss geändert werden? Oder ist das egal (SEO/google)?

Hi, danke für das Script. Nach einigen Anlaufschwierigkeiten hat es dann einigermaßen geklappt.

Das Script hat aber zwei Probleme

  1. Links wie /agb, /impressum, /datenschutz usw gehören eigentlich nicht da rein
  2. /tag und /stichworte fehlen komplett

wie könnte man das anpassen?

außerdem hab ich das Problem, dass zwar eine sitemap.xml erzeugt wird, aber mit einem Link auf sitemap1.xml.gz. Es wird aber nur eine sitemap1.xml erzeugt.

Ich hab jetzt kein Problem damit. Ich gebe Google einfach direkt sitemap1.xml. Aber seltsam ist es trotzdem

guten morgen

vieln dank für das tool. funktioniert jetzt wunderbar. ich hatte auch erst den fehler:

Warning: fopen(/sitemap/sitemap1.xml) [function.fopen]: failed to open stream: Permission denied in /www/htdocs/… sitemap_xml.php on line 299

Warning: fwrite(): supplied argument is not a valid stream resource in /www/htdocs/… sitemap_xml.php on line 300

Warning: fclose(): supplied argument is not a valid stream resource in /www/htdocs/… sitemap_xml.php on line 301 :

meine lösung:
ich hab die beiden datein in das verzeichnis www.domain.de/sitemap geschoben.

dann den filepath einfach auf leer stellen. also $mod_cnf[‘filepath’] = ’ ';

das problem war das das script von dem ort des scriptes aus den pfad berechnet also war die url für ihn: www.domain.de/sitemap/sitemap/sitemap1.xml. die natürlich nicht existiert.

mfg

Hallo zusammen,

hat wer einen Erweiterungsvorschlag für die Ausgabe der englischsprachigen Links.

Hallo zusammen,

um nicht alte Einträge aus der oxseo zu holen, muss unbedingt das Feld oxexpired abgefragt werden:

    $sql = "SELECT 
                oxart.oxtimestamp,
                seo.oxseourl
            FROM 
                oxarticles as oxart
            LEFT JOIN oxobject2category as oxobj2cat 
                ON (oxobj2cat.oxobjectid = oxart.oxid)
            LEFT JOIN oxcategories as oxcat 
                ON (oxcat.oxid = oxobj2cat.oxcatnid)
            LEFT JOIN oxseo as seo 
                ON (oxart.oxid = seo.oxobjectid)
            WHERE 
                oxart.oxactive = 1 AND 
                oxcat.oxactive = 1 AND 
                oxcat.oxhidden = 0 AND 
                seo.oxexpired = 0 AND
                seo.oxtype='oxarticle'
            GROUP BY 
                oxart.oxid
            LIMIT ".$start." OFFSET ".$end.";";

[QUOTE=DIATOM;11311]Hallo Jungs,

es gibt bestimmt viele unter euch die Ihren Shop bei Google anmelden wollen,
um diesen für Suchmaschinen zu optimieren.

Daher ist aber eine so genannt Google Sitemap Xml von nöten, die leider
bie Oxid nicht dabei ist und auch nur in überteuerten Modulen angeboten wird.

Da wir selber eine schnell Lösung brauchten,
habe ich ein kleines Script aufgesetzt was diese selbst erstellt.

In der Sitemap werden mit SEO URLs alle
Kategorien, Produkte und Kundencmsseiten gespeichert.

[B]google_sitemap_xml.php[/B]

Später soll sich das ganze noch automatisch aktualisieren und
auch mehrere Sprachen unterstützen.

mfg, Sebastian

P.s. more Modules 4 Free ;-)[/QUOTE]

Hallo,

habe eine Frage zu der Geschichte. Das Generieren der xml ist kein Problem. Was mir aufgefallen ist, ist der Umstand, dass aus der Datenbank immer der [B]erste[/B] Fund einer URL ausgelesen wird. Dummerweise muss das nicht die richtige sein. Gibt es eine Möglichkeit festzustellen, welcher Eintrag jetzt der aktuell gültige ist (so wie Backend angezeigt)?

wenn du auf die SEO Urls ansprichst, würde ich behaupten, dass es nur einen eintrag mit “oxactive = 1” geben kann. ergo einfach das auch abfragen.

[QUOTE=caladan;62706]wenn du auf die SEO Urls ansprichst, würde ich behaupten, dass es nur einen eintrag mit “oxactive = 1” geben kann. ergo einfach das auch abfragen.[/QUOTE]

In der DB oxseo gibt es kein oxactive. Als Selectionskriterium kann dort noch oxexpired verwendet werden. Ich habe gedacht, dass diese Feld, wie der Name sagt, die abgelaufenen URLs kennzeichnet. Dem ist leider nicht so. Ich habe mir da jetzt beholfen, indem ich mit seo.oxstdurl LIKE (’%cnid=%’) nur die Einträge verwende, die eine vollständige Pfadangabe (mit Kategorien) liefert. Das funktioniert gut. Auch aus den CMS-Seiten habe ich nur die ausgefiltert, die nur Content liefern (keine META-Daten, keine eMail, keine AGB, keine Impressum, …)

Guten Morgen,

bei mir werden nur die Kategorien generiert,

woran könnte dies liegen?
version OXID eShop CE 4.5.5_40299

Gruß

Erstmal vielen vielen dank für das Script.

Ein Problem habe ich aber: Es werden viele Einträge erzeugt die auf den Index der Seite zeigen, woraufhin Google einige Fehler ausspuckt (Duplicate Content).

Es sind hunderte gleiche Einträge drin:
<url>
<loc>http://www.url.com/</loc>
<priority>1.0</priority>
<lastmod>2012-01-26T10:26:05+00:00</lastmod>
<changefreq>weekly</changefreq>
</url>

Wie kann ich das beheben?

Es handelt sich um das Script aus dem ersten Post.

DANKE :slight_smile:

[QUOTE=upaffrath;62222]Hallo,

habe eine Frage zu der Geschichte. Das Generieren der xml ist kein Problem. Was mir aufgefallen ist, ist der Umstand, dass aus der Datenbank immer der [B]erste[/B] Fund einer URL ausgelesen wird. Dummerweise muss das nicht die richtige sein. Gibt es eine Möglichkeit festzustellen, welcher Eintrag jetzt der aktuell gültige ist (so wie Backend angezeigt)?[/QUOTE]

Ich habe etwas ähnliches, und zwar gibt es bei mir etliche doppelte Einträge. Also, wirklich 2x die identische URL von einem Artikel.

Hast du da eine Idee bzw. eine Lösung, hast du bei dir ein spezielles Kriterium welches du abfragst?

[QUOTE=Rotkaeqpchen;79933]Erstmal vielen vielen dank für das Script.

Ein Problem habe ich aber: Es werden viele Einträge erzeugt die auf den Index der Seite zeigen, woraufhin Google einige Fehler ausspuckt (Duplicate Content).

Es sind hunderte gleiche Einträge drin:
<url>
<loc>http://www.url.com/</loc>
<priority>1.0</priority>
<lastmod>2012-01-26T10:26:05+00:00</lastmod>
<changefreq>weekly</changefreq>
</url>

Wie kann ich das beheben?

Es handelt sich um das Script aus dem ersten Post.

DANKE :)[/QUOTE]

Hatte ich auch, ich hab jetzt keine CMS Seite mehr drin. Also, die Funktion für die CMS Seiten aus, und eine gemacht, die den nötigen XML Eintrag mit der Startseite erzeugt. das loc auf = ‘’ setzen weil der Domain immer davor gepappt wird, und als Änderungsdatum hab ich date(‘Y-m-d’)

Ich bin jedenfalls auch interessiert, wie man die doppelten Artikeleinträge vermeiden kann, oder wie das kommen kann.

[QUOTE=Niklas;80883]Ich habe etwas ähnliches, und zwar gibt es bei mir etliche doppelte Einträge. Also, wirklich 2x die identische URL von einem Artikel.

Hast du da eine Idee bzw. eine Lösung, hast du bei dir ein spezielles Kriterium welches du abfragst?

Hatte ich auch, ich hab jetzt keine CMS Seite mehr drin. Also, die Funktion für die CMS Seiten aus, und eine gemacht, die den nötigen XML Eintrag mit der Startseite erzeugt. das loc auf = ‘’ setzen weil der Domain immer davor gepappt wird, und als Änderungsdatum hab ich date(‘Y-m-d’)

Ich bin jedenfalls auch interessiert, wie man die doppelten Artikeleinträge vermeiden kann, oder wie das kommen kann.[/QUOTE]

Hallo,

habe am ursprünglichen Code einiges geändert, was mir für die Erstellung der Sitemap logischer erschien (ach so, habe das Ganze noch nach Sprachen getrennt):

// ** FUNCTIONS

/** get all active and visible categories from database
 * @return array
 */
function getCategories()
{
    global $mod_cnf;
    $list = array();
    $sql = "SELECT  
                seo.oxseourl
            FROM 
                oxcategories as oxcats
            LEFT JOIN 
                oxseo as seo ON (oxcats.oxid=seo.oxobjectid)
            WHERE 
                oxcats.oxactive = 1 AND 
                oxcats.oxhidden = 0 AND
                seo.oxtype='oxcategory' AND
                seo.oxstdurl NOT LIKE ('%pgNr=%') AND
                seo.oxlang = 0
            GROUP BY 
                oxcats.oxid;";
    $sql_query = mysql_query($sql);
    while ($sql_row = mysql_fetch_array($sql_query))
    {
        $list[] = array(
            'loc'           => $mod_cnf['siteurl'] . strtolower($sql_row['oxseourl']),
            'priority'      => '1.0',
            'lastmod'       => date("Y-m-d") . 'T' . date("h:i:s") . '+00:00',
            'changefreq'    => 'weekly',
        );
    }
    mysql_free_result($sql_query);
    return $list;
}

/** get active cms content from database
 * @return array
 */
function getCmsSite()
{
    global $mod_cnf;
    $list = array();
    $sql = "SELECT 
                seo.oxseourl
            FROM 
                oxcontents as content
            LEFT JOIN 
                oxseo as seo ON (content.oxid=seo.oxobjectid)
            WHERE 
                content.oxactive = 1 AND 
                content.oxfolder = '' 
                AND seo.oxseourl <> ''
                AND seo.oxseourl NOT LIKE ('%META%')
                AND seo.oxlang = 0
            GROUP BY
                content.oxid;";
    
    $sql_query = mysql_query($sql);
    while ($sql_row = mysql_fetch_array($sql_query))
    {
        $list[] = array(
            'loc'           => $mod_cnf['siteurl'] . strtolower($sql_row['oxseourl']),
            'priority'      => '1.0',
            'lastmod'       => date("Y-m-d") . 'T' . date("h:i:s") . '+00:00',
            'changefreq'    => 'weekly',
        );
    }
    mysql_free_result($sql_query);
    return $list;
}

/** get active products from database with offset
 * @return array
 */
function getProducts($limit)
{
    global $mod_cnf;
    $list = array();

    // calculate offset 
    $start = $mod_cnf['offset'];
    if (1 == $limit)
    {
        $end = 0;
    }
    else {
        $end = (($limit-1) * $mod_cnf['offset']) - 1;
    }
                
    $sql = "SELECT 
                oxart.oxtimestamp,
                seo.oxseourl
            FROM 
                oxarticles as oxart
            LEFT JOIN oxobject2category as oxobj2cat 
                ON (oxobj2cat.oxobjectid = oxart.oxid)
            LEFT JOIN oxcategories as oxcat 
                ON (oxcat.oxid = oxobj2cat.oxcatnid)
            LEFT JOIN oxseo as seo 
                ON (oxart.oxid = seo.oxobjectid)
            WHERE 
                oxart.oxactive = 1 AND 
                oxcat.oxactive = 1 AND 
                oxcat.oxhidden = 0 AND 
                seo.oxlang = 0 AND 
                seo.oxtype='oxarticle' AND
                seo.oxstdurl LIKE ('%cnid=%')
            GROUP BY 
                oxart.oxid
            LIMIT ".$start." OFFSET ".$end.";";
                        
    $sql_query = mysql_query($sql);
    while ($sql_row = mysql_fetch_array($sql_query))
    {
        $lastmod = $sql_row['oxtimestamp'];
if ("0000-00-00 00:00:00" == $lastmod)
{
$lastmod = date("Y-m-d") . 'T' . date("h:i:s") . '+00:00';
}
$lastmod = date("Y-m-d") . 'T' . date("h:i:s") . '+00:00';
$list[] = array(
            'loc'           => $mod_cnf['siteurl'] . strtolower($sql_row['oxseourl']),
            'priority'      => '0.5',
            'lastmod'       => $lastmod,
            'changefreq'    => 'daily',
        );
    }
    mysql_free_result($sql_query);
    return $list;
}

Hi Uwe,

wäre es möglich die komplette sitemap.php zu posten? Ich kann mit dem Teilstück leider nichts anfangen, ich scheitere daran es in das vorhandene einzufügen / zu ersetzen…

EDIT: Sorry, habe das falsche Script gehabt, mit der aus Seite 4 und deinen Änderungen klappt alles perfetto :slight_smile:

VIELEN DANK!

[QUOTE=Rotkaeqpchen;86084]

wäre es möglich die komplette sitemap.php zu posten?

VIELEN DANK![/QUOTE]

Hi,

geht leider nicht, da zu groß. Aber ich kann sie direkt als Mail senden.