2010-04-30 10 views
14

Ich versuche eine Sitemap zu erstellen, die automatisch aktualisiert wird. Ich habe etwas mit meinem RSS-Feed gemacht, aber diese Sitemap verweigert die Arbeit. Sie können es live unter http://designdeluge.com/sitemap.xml ansehen. Ich denke, das Hauptproblem ist, dass es den PHP-Code nicht erkennt. Hier ist die vollständige Quelle:Erstellen einer XML-Sitemap mit PHP

<?php 


include 'includes/connection.php'; 

header("Content-type: text/xml"); 

echo '<?xml version="1.0" encoding="UTF-8" ?>'; 

?> 

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd"> 

    <url> 
     <loc>http://designdeluge.com/</loc> 
     <lastmod>2010-04-20</lastmod> 
     <changefreq>weekly</changefreq> 
     <priority>1.00</priority> 
    </url> 

    <url> 
     <loc>http://designdeluge.com/about.php</loc> 
     <lastmod>2010-04-20</lastmod> 
     <changefreq>never</changefreq> 
     <priority>0.5</priority> 
    </url> 

    <?php 

    $entries = mysql_query("SELECT * FROM Entries"); 

    while($row = mysql_fetch_assoc($entries)) { 
    $title = stripslashes($row['title']); 
    $date = date("Y-m-d", strtotime($row['timestamp'])); 

    echo " 

    <url> 
     <loc>http://designdeluge.com/".$title."</loc> 
     <lastmod>".$date."</lastmod> 
     <changefreq>never</changefreq> 
     <priority>0.8</priority> 
    </url>"; 

} ?> 

</urlset> 

Das Problem ist, dass die dynamische URL (beispielsweise die von der DB gezogen ist) wird nicht erzeugt werden und die Sitemap nicht bestätigen. Vielen Dank!

EDIT: Gerade jetzt, ich versuche nur, den Code selbst zu arbeiten. Ich habe es als PHP-Datei auf meinem lokalen Testserver eingerichtet. Der obige Code wird verwendet. Im Moment zeigt nichts nichts auf dem Bildschirm oder in der Quelle. Ich denke, ich habe einen Syntaxfehler gemacht, aber ich kann nichts finden. Jede und jede Hilfe wird geschätzt!

EDIT 2: Ok, ich habe es Jungs aussortiert. Anscheinend musste ich die XML-Deklaration mit PHP wiederholen. Der endgültige Code ist oben veröffentlicht. Danke für Ihre Hilfe!

Antwort

27

Wenn Sie einen Blick auf die sitemap.xml nehmen, die generiert wird (Quelltext anzeigen Verwendung in Ihrem Browser, zum Beispiel), sehen Sie dies:

<?php header('Content-type: text/xml'); ?> 
<?xml version="1.0" encoding="UTF-8" ?> 
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http:/ 
... 

Die <?php, in dieser Ausgabe, zeigt, dass PHP-Code nicht interpretiert wird.


Dies ist wahrscheinlich, weil Ihr Webserver nicht .xml als Erweiterung von Dateien zu erkennen ist, die PHP-Code enthalten soll.

Mindestens zwei mögliche Lösungen:

  • Re-Konfiguration des Servers, so dass XML-Dateien gehen durch das PHP-Interpreter (vielleicht nicht so sein, eine gute Idee: die Probleme mit bestehenden Dateien verursachen kann)
  • Ändern Sie die Erweiterung Ihrer Sitemap, zum Beispiel sitemap.php, so wird es von Ihrem Server interpretiert.


Ich würde eine andere Lösung hinzu:

  • Haben Sie eine sitemap.php Datei, die den Code
  • Und eine RewriteRule verwenden so die sitemap.xml URL tatsächlich verweist auf die sitemap.php Datei

Damit haben Sie die sitemap.xml URL, die ist nett (erforderlich?), aber wie der Code in sitemap.php sein wird, wird es interpretiert werden.

Siehe Apache's mod_rewrite.

+0

Nun, die nur zwei XML-Dateien auf meinem Server mit PHP, so dass ich keinen Schaden sehen. Wäre die erste Option etwas wie das Hinzufügen zu einer .htaccess-Datei? AddType application/x-httpd-php .xml – williamg

+2

Nicht sicher, dass dies in einer '.htaccess' Datei * möglich ist (abhängig von der Konfiguration Ihres Servers, kann es notwendig sein, dies direkt in der Konfiguration des Servers zu tun) * ;; aber Sie könnten versuchen, vielleicht wird es funktionieren :-) –

+0

@iMaster: Damit Ihr Code funktioniert, müssen short_tags auch ausgeschaltet sein (es ist standardmäßig - nur etwas zu beachten). Wenn ich derzeit http://designdeluge.com/sitemap.xml besuche, erhalte ich eine HTTP 500-Antwort, daher ist Ihre Konfiguration kaputt (wahrscheinlich, weil Sie gerade daran arbeiten). Schließlich ist es bei großen Websites wahrscheinlich nicht möglich, die gesamte Sitemap in Echtzeit zu erstellen. Wenn Sie also mit Tausenden von Seiten oder mehr rechnen, sollten Sie darauf vorbereitet sein, dies später noch einmal zu implementieren. –

3

Ich habe William's Code verwendet (danke) und mit ein paar kleinen Modifikationen hat es für mich funktioniert.

denke ich die Zeile:

header("Content-type: text/xml"); 

sollte die zweite Zeile nach oben <?php

übrigens nur ein kleiner Punkt zu jeder andere, dass Kopien es sein, aber es ein einzelnes Leerzeichen ist vor die <?php in der ersten Zeile - wenn Sie es versehentlich kopieren, wie ich es tat, werden Sie ein wenig Zeit verbringen versuchen, herauszufinden, warum der Code nicht für Sie arbeiten wird!

Ich musste die MySql Select-Anweisung ein wenig zu zwicken.

Schließlich habe ich in der Ausgabe eine Variable $ domain verwendet, so dass dieses Stück Code als Vorlage verwendet werden kann, ohne darüber nachzudenken (vorausgesetzt, Sie verwenden jedes Mal denselben Tabellennamen). Die Variable wird zur Datei connectdb.php hinzugefügt, die zur Verbindung mit der Datenbank gehört.

Hier ist meine Arbeitsversion des Codes des William:

<?php 
header("Content-type: text/xml"); 
echo '<?xml version="1.0" encoding="UTF-8" ?>'; 
include 'includes/connectdb.php'; 
?> 

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd"> 

    <url> 
     <loc>http://www.DOMAIN.co.uk/</loc> 
     <priority>1.00</priority> 
    </url> 

    <?php 

    $sql = "SELECT * FROM pages WHERE onshow = 1 ORDER BY id ASC"; 
    $result = mysql_query($sql,$conn);  
    while($row = mysql_fetch_array($result)) 
    { 
    $filename = stripslashes($row['filename']); 
    ?> 
    <url> 
     <loc>http://www.<?php echo "$domain"; ?>/<?php echo "$filename" ?></loc> 
     <changefreq>monthly</changefreq> 
     <priority>0.5</priority> 
    </url> 

<?php } ?> 

</urlset> 
3

Die beste Lösung ist, um Ihre Apache .htaccess Datei die folgende Zeile nach RewriteEngine On

RewriteRule ^sitemap\.xml$ sitemap.php [L] 

und dann einfach mit einer Datei hinzufügen sitemap.php in Ihrem Stammordner, der normalerweise über http://yoursite.com/sitemap.xml, die Standard-URL, wo alle Suchmaschinen zunächst suchen werden.

Die Datei sitemap.php soll beginnen mit

<?php header('Content-type: application/xml; charset=utf-8') ?> 
<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?> 

es funktioniert :)