2010-04-30 9 views
14

Sto tentando di creare una sitemap che verrà aggiornata automaticamente. Ho fatto qualcosa di simile al mio feed RSS, ma questa sitemap si rifiuta di funzionare. Puoi vederlo dal vivo allo http://designdeluge.com/sitemap.xml Penso che il problema principale sia che non riconosce il codice PHP. Ecco il sorgente completo:Creazione di una sitemap XML con 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> 

Il problema è che (per esempio quelli tirati dal DB) non vengono generati del URL dinamico e la mappa del sito non convalida. Grazie!

MODIFICA: In questo momento, sto solo cercando di far funzionare il codice stesso. L'ho impostato come file PHP sul mio server di test locale. Il codice sopra è in uso. In questo momento, nulla visualizza nulla sullo schermo o nella sorgente. Sto pensando di aver commesso un errore di sintassi, ma non riesco a trovare nulla. Qualsiasi aiuto è apprezzato!

MODIFICA 2: Ok, ho capito ragazzi. Apparentemente, ho dovuto echo la dichiarazione XML con PHP. Il codice finale è pubblicato sopra. Grazie per l'aiuto!

risposta

27

Se si dà un'occhiata alla sitemap.xml che ha generato (utilizzando la visualizzazione di origine, nel browser, per esempio), vedrete questo:

<?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:/ 
... 

Il <?php, presente in quel di uscita, mostra che il codice PHP non viene interpretato.


Questo probabilmente è perché vostro web server non riconosce .xml come estensione di file che dovrebbe contenere codice PHP.

Almeno due possibili soluzioni:

  • Re-configurare il server, in modo da file XML passare attraverso l'interprete PHP (potrebbe non essere una buona idea: che può causare problemi con i file esistenti)
  • Modifica l'estensione della tua sitemap, ad esempio sitemap.php, quindi è interpretato dal tuo server.


vorrei aggiungere un'altra soluzione:

  • hanno un file sitemap.php, che contiene il codice
  • E utilizzare un RewriteRule così l'URL sitemap.xml punti effettivamente al file sitemap.php

Con quello, avrete il sitemap.xml URL, che è bello (richiesto?), ma poiché il codice sarà in sitemap.php, verrà interpretato.

Vedere Apache's mod_rewrite.

+0

Bene gli unici due file .xml sul mio server stia usando PHP quindi non vedo alcun danno. Fare la prima opzione sarebbe qualcosa come aggiungere questo in un file .htaccess? AddType application/x-httpd-php .xml – williamg

+2

Non sicuro che ciò possa essere fatto in un file '.htaccess' * (a seconda della configurazione del tuo server, potrebbe essere necessario farlo direttamente nella configurazione del server) * ;; ma potresti provare, forse funzionerà :-) –

+0

@iMaster: Perché il tuo codice funzioni, anche short_tags deve essere disattivato (è di default - solo qualcosa di cui essere a conoscenza). Inoltre, quando visito attualmente http://designdeluge.com/sitemap.xml ottengo una risposta HTTP 500, quindi la configurazione è interrotta (probabilmente perché ci stai lavorando proprio ora). Infine, per i siti di grandi dimensioni, la generazione di tutta la sitemap in tempo reale è probabilmente impossibile, quindi se ti aspetti di crescere a migliaia di pagine o più, preparati a reimplementarla più tardi. –

3

Ho usato il codice di William (grazie) e con alcune piccole modifiche ha funzionato per me.

Penso che la linea:

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

dovrebbe essere la seconda linea, dopo la parte superiore <?php

Tra l'altro, solo un piccolo punto a chiunque altro che le copie di esso, ma non v'è un singolo carattere spazio prima <?php nella prima riga: se la copi inavvertitamente come ho fatto, passerai un po 'di tempo a cercare di capire perché il codice non funziona per te!

Ho dovuto modificare anche l'istruzione di selezione MySql.

Infine, nell'output, ho utilizzato una variabile $ dominio in modo che questa parte di codice possa essere utilizzata come modello senza la necessità di pensarci (purché si usi sempre lo stesso nome di tabella). La variabile viene aggiunta al file connectdb.php che è incluso per connettersi al database.

Ecco la mia versione di lavoro del codice del 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

La soluzione migliore è quella di aggiungere al vostro apache .htaccess del file la seguente riga dopo RewriteEngine On

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

e poi semplicemente avere un file sitemap.php nella cartella principale che sarebbe normalmente accessibile tramite http://yoursite.com/sitemap.xml, l'URL predefinito in cui verranno innanzitutto ricercati tutti i motori di ricerca.

Il file sitemap.php deve iniziare con

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

funziona :)