Generare sitemap automat

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
cadou
Mesaje: 328

Generare sitemap automat

Am vazut ca sitemap e important pentru site asa ca am cautat pe net cod de generare sitemap.
Adica, daca eu fac azi modificari si adaug inregistrari mie sa imi apara in sitemap rapid, pe loc, nu ca sa ma duc eu pe site-uri sa dau generare sitemap manual.
Am gasit 2 coduri.
Am inlocuit cum trebuie pe acolo in loc de domeniu am pus site-u meu, in loc de host parola si ce mai e pe acolo am completat tot, dar da erori.
primul e

Cod: Selectaţi tot

<?php
//include baza de date
$db=mysql_connect($[b]dbhost[/b],$[b]dbuser[/b],$[b]dbpass[/b]);
mysql_select_db($[b]dbdatabase[/b]);
$mainPages = array(
“http://www.domeniu.ro/”,
“http://www.domeniu.ro/topuseri/”,
“http://www.domeniu.ro/toparticole/”);
//declara header si insceput sitemap
header (‘Content-type: text/xml’);
echo ‘<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>’;
echo ‘<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”>’;
for($i=0; $i<count($mainPages); $i++){
echo ‘<url>
<loc>’. $mainPages[$i] .’</loc>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>’;
}
//genereaza categoriile
$map_result = mysql_query(“SELECT id FROM categorii”);
while ($map_row = mysql_fetch_array($map_result)) {
$category = “http://www.domeniu.ro/categorie/” . $map_row['id'] . “/”;
echo ”
<url>
<loc>”. $category  .”</loc>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>”;
}
//genereaza elementele
$map_result = mysql_query(“SELECT id FROM articole WHERE aprobat = 1″);
while ($map_row = mysql_fetch_array($map_result)) {
echo ‘
<url>
<loc>http://www.domeniu.ro/articol/’. $map_row['id'] .’/</loc>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>’;
}
//inchide sitemapul
echo ‘
</urlset>’;
?>
La al 2 lea am inlocuit pe acolo ce si cum trebuie dar afiseaza asa :
"Acest fișier XML nu pare să aibă nicio informație de stil asociată lui."
Mai jos este afișat arborele documentului.

Cod: Selectaţi tot

<?php
require_once('conectare.php');

  $pagina = @$_GET['pagina'];
// how many rows to show per page
$drowsPerPagina = 50;

// by default we show first page
$paginaNum = 1;

// if $page defined, use it as page number
if(isset($pagina))
{
    $paginaNum = $pagina;
}

// counting the offset
$offset = ($paginaNum -1) * $drowsPerPagina;


$sql = "select * from `statusuri` LIMIT $offset, $drowsPerPagina";
$result = mysql_query($sql, $database) or die(mysql_error());
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset>
";

{
while($row = mysql_fetch_array($result)) {
  $URL = $row["status"];
echo "<url><loc>http://www.MYSITE.com/product_$URL.html</loc></url>";
}
}
?>
</urlset>
Al 2 lea cod este :

Cod: Selectaţi tot

<?php
require_once('conectare.php');

  $pagina = @$_GET['pagina'];
// how many rows to show per page
$drowsPerPagina = 50;

// by default we show first page
$paginaNum = 1;

// if $page defined, use it as page number
if(isset($pagina))
{
    $paginaNum = $pagina;
}

// counting the offset
$offset = ($paginaNum -1) * $drowsPerPagina;

$sql = "select * from `statusuri` LIMIT $offset, $drowsPerPagina";
$result = mysql_query($sql, $database) or die(mysql_error());
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9\">
";
{
while($row = mysql_fetch_array($result)) {
  $URL = $row["status"];
echo "<url>
        <loc>http://www.MYSITE.com/product_$URL.html</loc>
      </url>";
}
}
?>
</urlset>

steell Mesaje: 190
Un sitemap.xml arata cam asa:

Cod: Selectaţi tot

<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
      http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

<url>
  <loc>http://www.site.ro/index.php</loc>
  <priority>0.9</priority>
  <changefreq>daily</changefreq>
</url>
</urlset>
In acest exemplu este adaugata doar pagina index a siteului. Tu poti sa adaugi manual toate paginile pe care le ai intre tagurile <url> si </url>.
Acest lucru e valabil in cazul in care ai un site cu un numar constant de pagini.
Daca de exemplu ai un site in care paginile se creaza mereu pe baza unor formulare, de exemplu cum ar fi un site de discutii, poti crea un script php care sa scrie singur acele pagini in fisierul sitemap.xml. Nu trebuie decat sa inregistrezi in baza de date numele paginii care se creaza iar apoi sa apelezi scriptul care creaza sitemap-ul. Personal asa am procedat.
Apoi mai este fisierul "sitemap.html", acesta ajuta vizitatorii sa gaseasca mai usor anumite informatii in site. Si acesta se poate crea folosind php ca in cazul sitemap.xml cum am zis mai sus.

cadou Mesaje: 328
Pe site am asa:
- statusuri 80 de pagini pana in prezent
- bancuri 5 pagini pana in prezent
- id-uri 1 pagina pana in prezent
- anunturi 1 pagina pana in prezent

Cand adaug statusuri sau bancuri sau orice altceva pe site sitemap sa se genereze automat.

steell Mesaje: 190
Personal nu prea am incredere in scripturile astea de pe net care genereaza automat sitemap. In locul tau as face un mic script care sa preia fiecare fisier in parte din folderul parinte si sal adauge in sitemap, apoi faci o conditie daca este detectat un director (deci fara extensie) faci sa se deschida si sa preia toate fisierele din directorul ala, si tot asa cate directoare ai tu.
Din cate te cunosc nu vei reusi sa faci asta, iti ia mai putin timp sa le adaugi manual pe fiecare. Si nu in ultimul rand, banuiesc ca acele pagini se creaza ele atunci cand cineva posteaza un banc sau un status, sau orice.
Deci faci cum ti-am zis in primul post, sa se adauge singure paginile in sitemap.
E mult de munca, pentru ca mi-am facut si eu un astfel de script si stiu cum e. Dar daca vrei, reusesti. Trebuie sa stii lucrul cu fisiere si directoare si cateva functii utile ale lor. Vezi pe site la lucrul cu fisiere si directoare.

cadou Mesaje: 328
Am incercat sa fac sa ia din baza de date informatii dar nu am reusit
Imi da eroare
Cod folosit este:
Nume fisier sitemap.xml

Cod: Selectaţi tot

<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<?php
require_once('conectare.php');

$cerereSQL = "SELECT * FROM `membri` ORDER BY id DESC";
$rezultat = mysql_query($cerereSQL);
while($rand = mysql_fetch_array($rezultat))
{ 
echo "
<url>
    <loc>http://www.scapadeplictiseala.tk/profil-$rand[nume].php</loc>
    <lastmod>2013-01-26</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
  </url>
";
}
?>
</urlset>
Dar afiseaza codu php folosit.

steell Mesaje: 190
Nu mai folosi mereu optiunea "Citeaza", incarca prea mult pagina.
Se pare ca ai mancat niste ghilimele aici: $rand[nume], trebuie $rand['nume'].
Citeste erorile cu atentie ce spune fiecare ca daia sunt afisate.
Incearca sa folosesti concatenarea sirurilor

Cod: Selectaţi tot

echo 'taguri html bla bla bla'. $rand['nume']. '.php bla bal blaa';
Daca folosesti ghilimelle simple sa faci un echo este mult mai usor sa incluzi in acel echo taguri html deoarece acestea au doar ghilimele duble si nu mai trebuie sa daugi backslash la fiecare ghilimea dubla.

MarPlo Mesaje: 4343
Iti afiseaza codul PHP scris in fisier deoarece are extensia XML.
In general instructiunile PHP sunt procesate de server daca sunt adaugate in fisiere cu extensia ".php".
Daca fisierul are extensia ".xml" (sau ".html") e afisat in browser asa cum e scris.
Solutia ar fi sa redenumesti fisierul "sitemap.php" , iar in ".htaccess" adaugi regula de rescriere:

Cod: Selectaţi tot

Options +FollowSymLinks
RewriteEngine On

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

cadou Mesaje: 328
Am facut cum ai zis tu ok dar mie imi da eroare pe linia 1 :

Cod: Selectaţi tot

Parse error: syntax error, unexpected T_STRING in /sitemap.php on line 1
Am schimbat la linia 1 asa din : <?xml version="1.0" encoding="utf-8"?>
am scos semnu ? in ambele parti, dar dupa aceea imi da eroare la linia 11, adica aici :
<loc></loc>
Zice de ghilimea simpla eroarea, dar daca scot afiseaza asa :
http://www.scapadeplictiseala.tk/profil-$rand[nume].php

Am incercat multe varinate dar tot nu am reusit.
Am adaugat si in htaccess.

steell Mesaje: 190
Te complici prea mult cu htacces. eroarea zice ca e o problema cu concatenarile.
Eu am procedat asa:
Am facut o pagina noua in care am creat codul php care face urmatorul lucru: se conecteaza la baza de date si extrage link-urile (link-urile sunt adaugate exact asa)

Cod: Selectaţi tot

<a href="bla bal bla"> pagina</a>
Si o alta coloana ce contine cuvintele dintre <a> si </a>
Pt fiecare rand in parte extrage acest link cu while() si il scrie in fisierul sitemap.xml si sitemap.html cu functia fwrite() (am doua scripturi separate in acea pagina unul pt xml si unul pt html).

In baza de date am doar link-urile care se adauga in urma formularelor. Pe langa cele din baza de date mai am si paginile statice (index.php, contact.php si altele) care raman mereu aceleasi asa ca pe astea le scriu in functia fwrite() nu le mai preiau din baza de date.
Ti-as arata scriptul meu dar nu o sa intelegi nimic, e prea mare si prea intortochiat si nu e bine aranjat in pagina scrisul.
Uite un exemplu:

Cod: Selectaţi tot

fwrite(deschiderea, 'paginile statice bla bla bla');
conectarea la baza de date
while ($row = randul respectiv) {
fwrite(deschiderea, 'taguri xml sau html'. $row[1].' alte tasguri bla bla bla);
}
fwrite(deschiderea, 'alte pagini statice bla bla bla');
Sper ca intelegi din exemplul asta.
Deci partea cu while() scrie doar ce e in baza de date, celelalte adaugate manual sciu paginile statice.

Tu te-ai complicat prea mult, ai adaugat cod php in fisierul xml, nu e bine. fisierul hml trebuia sa contina datele exact asa cum sunt deoarece robotii google si altii iti citesc codul xml (ca si cum ai fi scris tot fisierul manual) nu php.
Apoi fisierul php il accesezi cand se face o modificare (se adauga pagini sau se sterg), insa sa folosesti la fopen() modul w+ ca sa stearga fisierul si sa scrie noile date.

Mai bine de atat nu ma pricep sa explic. Ideea de baza este ca trebuie sa faci un script care cand e accesat sa iti scrie fisierul sitemap.xml.
Depinde de tine daca ai imaginatie (nu cat mai multa programare) cum sa-l faci.
Si imaginatia este o parte din programare pe care daca o ai poti sa-ti dai seama cum sa faci anumiti algoritmi si diferite metode de rezolvare a unei probleme.

cadou Mesaje: 328
Nu prea am inteles nimic din ultimul raspuns.
Ma chinui de vreo 2 zile sa fac sitemap-ul asta.
Dar se pare ca am reusit sa fac un rss imediat cu update din baza de date.