Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
Bonjour Franck.
A propros du souci des double slash dans les liens lorsque l'on utilise freeUrls, des getbase() en getURLfor()...
Voici un copier-coller du class.dc.sitemaps.php proposé par adjaya
<?php # -- BEGIN LICENSE BLOCK ---------------------------------- # # This file is part of Sitemaps, a plugin for DotClear2. # Copyright (c) 2006-2015 Pep and contributors. # Licensed under the GPL version 2.0 license. # See LICENSE file or # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html # # -- END LICENSE BLOCK ------------------------------------ if (!defined('DC_RC_PATH')) {return;} class dcSitemaps { protected $core; protected $blog; protected $urls; protected $freqs; protected $post_types; public function __construct($core) { $this->core = $core; $this->blog = $core->blog; $this->urls = array(); $this->freqs = array('','always','hourly','daily','weekly','monthly','never'); $post_types = array(); // Default post types $this->addPostType( 'post', 'post', $this->blog->settings->sitemaps->sitemaps_posts_fq, $this->blog->settings->sitemaps->sitemaps_posts_pr ); $this->addPostType( 'page', 'pages', $this->blog->settings->sitemaps->sitemaps_pages_fq, $this->blog->settings->sitemaps->sitemaps_pages_pr ); } public function getURLs() { if ($this->blog->settings->sitemaps->sitemaps_active && empty($this->urls)) { $this->collectURLs(); } return $this->urls; } public function addPostType($type,$base_url,$freq = 0, $priority = 0.3) { if (preg_match('!^([a-z_-]+)$!',$type)) { $this->post_types[$type]['base_url'] = $base_url; $this->post_types[$type]['frequency'] = $this->getFrequency($freq); $this->post_types[$type]['priority'] = $this->getPriority($priority); return true; } return false; } public function addEntry($loc,$priority,$frequency,$lastmod = '') { $this->urls[] = array( 'loc' => $loc, 'priority' => $priority, 'frequency' => ($frequency == '')?null:$frequency, 'lastmod' => ($lastmod == '')?null:$lastmod ); } public function getPriority($value) { return(sprintf('%.1f',min(abs((float)$value),1))); } public function getFrequency($value) { return $this->freqs[min(abs(intval($value)),6)]; } public function collectEntriesURLs($type = 'post') { if (!array_key_exists($type,$this->post_types)) { return; } $freq = $this->post_types[$type]['frequency']; $prio = $this->post_types[$type]['priority']; $base_url = $this->post_types[$type]['base_url']; // Let's have fun ! $query = "SELECT p.post_id, p.post_url, p.post_tz, ". "p.post_upddt, MAX(c.comment_upddt) AS comments_dt ". "FROM ".$this->blog->prefix."post AS p ". "LEFT OUTER JOIN ".$this->blog->prefix."comment AS c ON c.post_id = p.post_id ". "WHERE p.blog_id = '".$this->blog->con->escape($this->blog->id)."' ". "AND p.post_type = '".$type."' AND p.post_status = 1 AND p.post_password IS NULL ". 'GROUP BY p.post_id, p.post_url, p.post_tz, p.post_upddt, p.post_dt '. 'ORDER BY p.post_dt ASC'; $rs = $this->blog->con->select($query); while ($rs->fetch()) { if ($rs->comments_dt !== null) { $last_ts = max(strtotime($rs->post_upddt),strtotime($rs->comments_dt)); } else { $last_ts = strtotime($rs->post_upddt); } $last_dt = dt::iso8601($last_ts,$rs->post_tz); $url = $this->blog->url.$this->core->url->getURLFor($base_url, html::sanitizeURL($rs->post_url)); $this->addEntry($url,$prio,$freq,$last_dt); } } protected function collectURLs() { // Homepage URL if ($this->blog->settings->sitemaps->sitemaps_home_url) { $freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_home_fq); $prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_home_pr); $this->addEntry($this->blog->url,$prio,$freq); } // Main syndication feeds URLs if ($this->core->blog->settings->sitemaps->sitemaps_feeds_url) { $freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_feeds_fq); $prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_feeds_pr); $this->addEntry( $this->blog->url.$this->core->url->getURLFor('feed', 'rss2'), $prio,$freq); $this->addEntry( $this->blog->url.$this->core->url->getURLFor('feed', 'atom'), $prio,$freq); } // Posts entries URLs if ($this->core->blog->settings->sitemaps->sitemaps_posts_url) { $this->collectEntriesURLs('post'); } // Pages entries URLs if ($this->core->plugins->moduleExists('pages') && $this->core->blog->settings->sitemaps->sitemaps_pages_url) { $this->collectEntriesURLs('page'); } // Categories URLs if ($this->core->blog->settings->sitemaps->sitemaps_cats_url) { $freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_cats_fq); $prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_cats_pr); $cats = $this->blog->getCategories(array('post_type'=>'post')); while ($cats->fetch()) { $this->addEntry( $this->blog->url.$this->core->url->getURLFor("category", $cats->cat_url), $prio,$freq); } } if ($this->core->plugins->moduleExists('tags') && $this->core->blog->settings->sitemaps->sitemaps_tags_url) { $freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_tags_fq); $prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_tags_pr); $meta = new dcMeta($this->core); $tags = $meta->getMeta('tag'); while ($tags->fetch()) { $this->addEntry( $this->blog->url.$this->core->url->getURLFor("tag", rawurlencode($tags->meta_id)), $prio,$freq); } } // External parts ? # --BEHAVIOR-- sitemapsURLsCollect $this->core->callBehavior('sitemapsURLsCollect', $this); } }
J'ai testé sa proposition, tout semble fonctionel.
Dernière modification par i_love_dc (2017-05-17 10:36:22)
Hors ligne
Je viens de tester la derniere version 1.3.1.
Tout est fonctionnel sauf les billet (/post/) ou le "double slash" est encore présent.
La partie renseignée par adjaya
// Default post types
$this->addPostType(
'post',
'post',
$this->blog->settings->sitemaps->sitemaps_posts_fq,
$this->blog->settings->sitemaps->sitemaps_posts_pr
);
$this->addPostType(
'page',
'pages',
$this->blog->settings->sitemaps->sitemaps_pages_fq,
$this->blog->settings->sitemaps->sitemaps_pages_pr
);
}
semble ne plus provoquer ce "double slash".
Hors ligne
Je viens de tester la derniere version 1.3.1.
Tout est fonctionnel sauf les billet (/post/) ou le "double slash" est encore présent.
La partie renseignée par adjaya
// Default post types $this->addPostType( 'post', 'post', $this->blog->settings->sitemaps->sitemaps_posts_fq, $this->blog->settings->sitemaps->sitemaps_posts_pr ); $this->addPostType( 'page', 'pages', $this->blog->settings->sitemaps->sitemaps_pages_fq, $this->blog->settings->sitemaps->sitemaps_pages_pr ); }
semble ne plus provoquer ce "double slash".
ligne 114, modif également pour être complet:
$url = $this->blog->url.$this->core->url->getURLFor($base_url, html::sanitizeURL($rs->post_url));
Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/
Hors ligne
Merci pour cette nouvelle version. 1.3.2
Dernière modification par i_love_dc (2017-05-18 10:36:42)
Hors ligne
Résultat de config URL optimisées (FreeURLs + tweakURLs )
Tout semble nickel problème de double slash résolu.
Résultat pour config d'url réglée sur TITRE
Problème pour les pages le lien qui devrait être :
https://www.ndd.com/pages/Ma-page
est
https://www.ndd.com/Ma-page
Google hurle au erreurs de liens non trouvés !
Résultat pour une config standard (d'origine)
Problème pour les pages le lien qui devrait être :
https://www.ndd.com/pages/Ma-page
est
https://www.ndd.com/Ma-page
Google hurle au erreurs de liens non trouvés !
Par contre, si je remplace le class.dc.sitemaps.php par celui proposé par adjaya
<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of Sitemaps, a plugin for DotClear2.
# Copyright (c) 2006-2015 Pep and contributors.
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) {return;}
class dcSitemaps
{
protected $core;
protected $blog;
protected $urls;
protected $freqs;
protected $post_types;
public function __construct($core)
{
$this->core = $core;
$this->blog = $core->blog;
$this->urls = array();
$this->freqs = array('','always','hourly','daily','weekly','monthly','never');
$post_types = array();
// Default post types
$this->addPostType(
'post',
'post',
$this->blog->settings->sitemaps->sitemaps_posts_fq,
$this->blog->settings->sitemaps->sitemaps_posts_pr
);
$this->addPostType(
'page',
'pages',
$this->blog->settings->sitemaps->sitemaps_pages_fq,
$this->blog->settings->sitemaps->sitemaps_pages_pr
);
}
public function getURLs()
{
if ($this->blog->settings->sitemaps->sitemaps_active && empty($this->urls)) {
$this->collectURLs();
}
return $this->urls;
}
public function addPostType($type,$base_url,$freq = 0, $priority = 0.3)
{
if (preg_match('!^([a-z_-]+)$!',$type)) {
$this->post_types[$type]['base_url'] = $base_url;
$this->post_types[$type]['frequency'] = $this->getFrequency($freq);
$this->post_types[$type]['priority'] = $this->getPriority($priority);
return true;
}
return false;
}
public function addEntry($loc,$priority,$frequency,$lastmod = '')
{
$this->urls[] = array(
'loc' => $loc,
'priority' => $priority,
'frequency' => ($frequency == '')?null:$frequency,
'lastmod' => ($lastmod == '')?null:$lastmod
);
}
public function getPriority($value)
{
return(sprintf('%.1f',min(abs((float)$value),1)));
}
public function getFrequency($value)
{
return $this->freqs[min(abs(intval($value)),6)];
}
public function collectEntriesURLs($type = 'post')
{
if (!array_key_exists($type,$this->post_types)) {
return;
}
$freq = $this->post_types[$type]['frequency'];
$prio = $this->post_types[$type]['priority'];
$base_url = $this->post_types[$type]['base_url'];
// Let's have fun !
$query =
"SELECT p.post_id, p.post_url, p.post_tz, ".
"p.post_upddt, MAX(c.comment_upddt) AS comments_dt ".
"FROM ".$this->blog->prefix."post AS p ".
"LEFT OUTER JOIN ".$this->blog->prefix."comment AS c ON c.post_id = p.post_id ".
"WHERE p.blog_id = '".$this->blog->con->escape($this->blog->id)."' ".
"AND p.post_type = '".$type."' AND p.post_status = 1 AND p.post_password IS NULL ".
'GROUP BY p.post_id, p.post_url, p.post_tz, p.post_upddt, p.post_dt '.
'ORDER BY p.post_dt ASC';
$rs = $this->blog->con->select($query);
while ($rs->fetch()) {
if ($rs->comments_dt !== null) {
$last_ts = max(strtotime($rs->post_upddt),strtotime($rs->comments_dt));
} else {
$last_ts = strtotime($rs->post_upddt);
}
$last_dt = dt::iso8601($last_ts,$rs->post_tz);
$url = $this->blog->url.$this->core->url->getURLFor($base_url, html::sanitizeURL($rs->post_url));
$this->addEntry($url,$prio,$freq,$last_dt);
}
}
protected function collectURLs()
{
// Homepage URL
if ($this->blog->settings->sitemaps->sitemaps_home_url)
{
$freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_home_fq);
$prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_home_pr);
$this->addEntry($this->blog->url,$prio,$freq);
}
// Main syndication feeds URLs
if ($this->core->blog->settings->sitemaps->sitemaps_feeds_url)
{
$freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_feeds_fq);
$prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_feeds_pr);
$this->addEntry(
$this->blog->url.$this->core->url->getURLFor('feed', 'rss2'),
$prio,$freq);
$this->addEntry(
$this->blog->url.$this->core->url->getURLFor('feed', 'atom'),
$prio,$freq);
}
// Posts entries URLs
if ($this->core->blog->settings->sitemaps->sitemaps_posts_url) {
$this->collectEntriesURLs('post');
}
// Pages entries URLs
if ($this->core->plugins->moduleExists('pages') && $this->core->blog->settings->sitemaps->sitemaps_pages_url) {
$this->collectEntriesURLs('page');
}
// Categories URLs
if ($this->core->blog->settings->sitemaps->sitemaps_cats_url)
{
$freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_cats_fq);
$prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_cats_pr);
$cats = $this->blog->getCategories(array('post_type'=>'post'));
while ($cats->fetch()) {
$this->addEntry(
$this->blog->url.$this->core->url->getURLFor("category", $cats->cat_url),
$prio,$freq);
}
}
if ($this->core->plugins->moduleExists('tags') && $this->core->blog->settings->sitemaps->sitemaps_tags_url)
{
$freq = $this->getFrequency($this->blog->settings->sitemaps->sitemaps_tags_fq);
$prio = $this->getPriority($this->blog->settings->sitemaps->sitemaps_tags_pr);
$meta = new dcMeta($this->core);
$tags = $meta->getMeta('tag');
while ($tags->fetch()) {
$this->addEntry(
$this->blog->url.$this->core->url->getURLFor("tag", rawurlencode($tags->meta_id)),
$prio,$freq);
}
}
// External parts ?
# --BEHAVIOR-- sitemapsURLsCollect
$this->core->callBehavior('sitemapsURLsCollect', $this);
}
}
tout est fonctionnel sur les installations ...
- d'origine
- avec format URLs "titre"
- avec format URLs optimisés (freeURLS + tweakURLs).
.
Dernière modification par i_love_dc (2017-05-18 10:49:10)
Hors ligne
Bonjour Franck.
Testes de la version 1.3.3 = R.A.S
Merci pour ton suivit et ta réactivité, merci également à adjaya.
Hors ligne
bonjour,
encore une question de débutant, lorsque j'enregistre la config de Sitemaps XML, aucun fichier n'est créé sur https://www.yves.brette.biz/sitemap.xml
ai-je raté une étape ?
merci d'avance.
Hors ligne
Le plugin est-il activé ? L'adresse donnée ci-dessus est-elle celle affichée dans la page de configuration du plugin ?
PS le contenu est généré à chaque requête, ce n'est pas un fichier présent sur le serveur
Hors ligne
le plugin est-il activé ? je vois seulement une case à cocher "permettre les sitemaps" et une liste d'éléments à intégrer. Tout est coché.
Oui, l'adresse est celle qui figure dans la configuration du plugin.
Sur d'autres sites, je vois bel et bien un fichier xml présent à l'adresse donnée...
Quand j'utilise l'outil de test de google, la réponse est :
Erreur HTTP générique: 404 introuvable
Hors ligne
Essayez de désinstaller le plugin, de supprimer toutes traces d’installation de ce plugin (sitemap) grâce au plugin CleanConfig 1.4.3, puis également toutes traces éventuelles de configurations du même plugin dans about:config.
une fois toutes traces d'installation et de configuration éventuelles effacées, nettoyez le tout avec l'outil maintenance (cache et tables), puis retenter l’installation du dit plugin.
Hors ligne
Effectivement, quand je teste le plugin sur un site "vierge", il fonctionne :
https://www.gillesorgeret.sterilisation … itemap.xml
Je vais suivre vos conseils.
Merci.
Hors ligne
c'est quand même curieux parce que sur un autre site également "vierge", l'installation aboutit à une page 404
https://www.sterilisation-hopital.com/sitemap.xml
Hors ligne
Bonjour à tous,
Je souhaite créer une sitemap "news" au format suggéré par Google: https://support.google.com/news/publish … 4288?hl=fr
J'ai pensé que le plugin Sitemaps serait une bonne base pour générer un tel sitemap.
Est-il envisageable de dupliquer le plugin Sitemaps, le renommer, pour ensuite le modifier afin de générer une sitemap news? Existe-il une solution plus simple ?
Je n'ai pas d'expérience de création/édition de plugin, mais je suis ouvert à un challenge :)
Merci
je comprends vite, mais faut m'expliquer longtemps. [supporter du F.I.L.L.E]
Hors ligne
Est-il envisageable de dupliquer le plugin Sitemaps, le renommer, pour ensuite le modifier afin de générer une sitemap news?
Oui, ça devrait marcher
Hors ligne
Bonjour,
je suis utilisateur de dotclear 2.15.1
j'ai installé le plugin sitemap
il fonctionne, mon url me donne bien un fichier xml https://www.verstraete.fr/ironmalt/inde … itemap.xml
par contre la search console de google n'en veut pas :( il me dit que la page est bien accessible, par contre il me dit
Impossible de lire le sitemap
quelqu'un a t'il une idée ?
un grand merci
Hors ligne
Dotclear addicted since 2004
Hors ligne
etrangement, ca fonctionne si j'enregistre le fichier sous sitemap.xml et que je l'upload sur mon site. là google index bien le sitemap.
comme si google n'aimait pas le format index.php?sitemap.xml :o(
Hors ligne
Je confirme que les urls de la forme /index.php?sitemap.xml génère une erreur dans "Google Search Console" avec le message "Impossible de récupérer le sitemap".
Pour contourner le problème il est possible de copier un fichier statique, mais pour conserver un système dynamique, j'ai créé un fichier PHP à la racine du site qui ne fait que renvoyer le contenu du contenu généré par le plugins. Voici le contenu :
<?php
$sitemaps_url = "https://" . $_SERVER['HTTP_HOST'] . "/index.php?sitemap.xml";
$sitemaps_content = file_get_contents($sitemaps_url);
header('Content-Type: application/xml; charset=utf-8');
$size = strlen($sitemaps_content);
header("Content-length: $size");
echo $sitemaps_content;
?>
Hors ligne
Alors clairement ce n'est pas un problème côté Dotclear si Google n'est pas capable de gérer une URL de la sorte alors que son robot d'indexation y arrive très bien depuis des années !
Ou alors il n'accepte plus le mime type text/xml ? En fait non, puisque le sitemap d'Open-Time (https://open-time.net/sitemap.xml) est accepté sans souci avec ce type mime.
Donc la seule différence c'est le schéma d'URL, étrange…
Dotclear addicted since 2004
Hors ligne
Vous n'êtes pas identifié(e).