2010-04-30 8 views
14

Estoy tratando de crear un mapa del sitio que se actualizará automáticamente. He hecho algo similar con mi feed RSS, pero este sitemap se niega a funcionar. Puede verlo en vivo en http://designdeluge.com/sitemap.xml. Creo que el problema principal es que no reconoce el código PHP. Aquí está el código fuente completo:Crear un mapa de sitio 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> 

El problema es que (por ejemplo, los extraídos de la base de datos) no se están generando de la URL dinámico y el mapa del sitio no se validará. ¡Gracias!

EDITAR: Ahora mismo, estoy intentando que el código funcione. Lo tengo configurado como un archivo PHP en mi servidor de prueba local. El código de arriba está siendo usado. En este momento, nada muestra nada en la pantalla o en la fuente. Estoy pensando que cometí un error de sintaxis, pero no puedo encontrar nada. ¡Cualquier y toda ayuda es apreciada!

EDIT 2: Ok, ya lo tengo claro chicos. Aparentemente, tuve que repetir la declaración xml con PHP. El código final está publicado arriba. ¡Gracias por tu ayuda!

Respuesta

27

Si se echa un vistazo en el sitemap.xml que se genera (utilizando una fuente de vista, en el navegador, por ejemplo), verá esto:

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

El <?php, presente en esa salida, muestra que código PHP no se interpreta.


Esto es probablemente porque su servidor web no reconoce .xml como una extensión de los archivos que deben contener código PHP.

Al menos dos soluciones posibles:

  • volver a configurar su servidor, por lo que los archivos XML pasar por el intérprete de PHP (podría no ser tan buena idea: que puede causar problemas con los archivos existentes)
  • Cambie la extensión de su mapa del sitio, por ejemplo, al sitemap.php, por lo que su servidor lo interpretará.


me gustaría añadir otra solución:

  • tiene un archivo sitemap.php, que contiene el código
  • Y utilizar un RewriteRule por lo que la URL sitemap.xml puntos de hecho en el fichero de sitemap.php

Con eso, tendrá el sitemap.xml URL, que es bueno (requerido?), pero como el código estará en sitemap.php, se interpretará.

Ver Apache's mod_rewrite.

+0

bien los únicos dos archivos .xml en mi servidor está usando PHP, así que no veo ningún daño. ¿Sería la primera opción algo como agregar esto a un archivo .htaccess? AddType application/x-httpd-php .xml – williamg

+2

No estoy seguro de que esto se pueda hacer en un archivo '.htaccess' * (dependiendo de la configuración de su servidor, puede ser necesario hacerlo directamente en la configuración del servidor) * ;; pero podría intentarlo, quizás funcione :-) –

+0

@iMaster: para que su código funcione, short_tags también debe estar desactivado (es por defecto, algo a tener en cuenta). Además, cuando visito http://designdeluge.com/sitemap.xml recibo una respuesta HTTP 500, por lo que su configuración está rota (probablemente porque está trabajando en ello ahora mismo). Por último, para sitios grandes, la generación de todo el mapa del sitio en tiempo real es probablemente inviable, por lo que si espera crecer a miles de páginas o más, prepárese para volver a implementarlo más adelante. –

3

He usado el código de William (gracias) y con algunas pequeñas modificaciones funcionó para mí.

creo que la línea:

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

debería ser la segunda línea después de la <?php superior

Por cierto, sólo un pequeño punto a cualquier otra persona que lo copia, pero no hay un único carácter de espacio antes el <?php en la primera línea; si lo copia inadvertidamente como lo hice, pasará un poco de tiempo tratando de descubrir por qué el código no funcionará para usted.

Tuve que modificar un poco la declaración de selección de MySql.

Finalmente, en la salida, he usado un $ dominio variable para que este fragmento de código se pueda utilizar como plantilla sin necesidad de pensar en ello (siempre que use el mismo nombre de tabla cada vez). La variable se agrega al archivo connectdb.php que se incluye para conectarse a la base de datos.

aquí está mi versión de trabajo del código de la 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 mejor solución es añadir a tu Apache .htaccess archivo de la siguiente línea después RewriteEngine On

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

y luego simplemente tener un archivo sitemap.php en su carpeta raíz a la que normalmente se podría acceder a través de http://yoursite.com/sitemap.xml, la URL predeterminada donde todos los motores de búsqueda buscarán primero.

El archivo sitemap.php deberá comenzar con

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

funciona :)

Cuestiones relacionadas