Jump to content

Ajout de la date de publication dans le flux RSS


Recommended Posts

Bonjour,

Est ce que quelqu'un sait comment ajouter la date de publication des articles dans les flux générés par le module: "Flux RSS de produits v0.2"?
Sans cela le flux n'est pas toujours prix en compte (notamment sur Twitter).
Merci

Link to comment
Share on other sites

Merci
En fait la date de publication n'apparait pas lorsqu'on est sur le flux des catégories maisest bien présente sur le flux de la page d'accueil...
Je vais essayer ton module corrigé!

Ps: le flux généré ne passe pas dans les validateur de flux tel que: www.feedvalidator.org

Link to comment
Share on other sites

Théoriquement rien vu que je n'ai pas touché au lien, c'est prestashop qui créer les liens..

Je regarde en arrivant au boulot, je vais forcer le fait qu'il mette http://www... car effectivement avec l'option rewritting ça ne met plus que les liens relatifs

Tu as mis le module sur ton site en signature ?

Link to comment
Share on other sites

As tu résolu le problème des liens relatifs?
J'ai essayé d'insérer mon nom de domaine dans le code du fichier RSS mais je ne dois pas avoir la bonne syntaxe!!!
Je n'y comprends rien à ce language...
Alors j'attends encore ton aide; merci d'avance!

Link to comment
Share on other sites

J'ai un peu modifié le fichier RSS pour avoir des liens non relatifs.
Si ça interesse quelqu'un il suffira de modifier le nom de domaine (www.to-buy-art.com) par l'adresse de la racine de votre site...
Le flux généré est validé sur http://beta.feedvalidator.org

Le fichier RSS.php de Natsu modifié pour mon site :

<?php
include(dirname(__FILE__).'/../../config/config.inc.php');
require_once(dirname(__FILE__).'/../../init.php');

/**
* Fonction de conversion de date/heure du format am?icain (AAAA-MM-JJ HH:MM:SS) en Timestamp.
* @param string $datetime Date/heure au format am?icain (AAAA-MM-JJ HH:MM:SS)
* @return integer Timestamp en seconde
*/
function datetimeUS2Time($datetime)
{
   list($date, $time) = explode(' ', $datetime);
   list($hour, $minute, $second) = explode(':', $time);
   list($year, $month, $day) = explode('-', $date);
   $timestamp = mktime($hour, $minute, $second, $month, $day, $year);
   return $timestamp;
}

// Get data
$number = (intval(Tools::getValue('n')) ? intval(Tools::getValue('n')) : 10);
$orderByValues = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position');
$orderWayValues = array(0 => 'ASC', 1 => 'DESC');
$orderBy = Tools::strtolower(Tools::getValue('orderby', $orderByValues[intval(Configuration::get('PS_PRODUCTS_ORDER_BY'))]));
$orderWay = Tools::strtoupper(Tools::getValue('orderway', $orderWayValues[intval(Configuration::get('PS_PRODUCTS_ORDER_WAY'))]));
if (!in_array($orderBy, $orderByValues))
   $orderBy = $orderByValues[0];
if (!in_array($orderWay, $orderWayValues))
   $orderWay = $orderWayValues[0];
$id_category = (intval(Tools::getValue('id_category')) ? intval(Tools::getValue('id_category')) : 1);
$products = Product::getProducts(intval($cookie->id_lang), 0, ($number > 10 ? 10 : $number), $orderBy, $orderWay, $id_category, true);
$currency = new Currency(intval($cookie->id_currency));
$affiliate = (Tools::getValue('ac') ? '?ac='.Tools::getValue('ac') : '');
$datepub = date(DATE_RSS);

// Send feed
header("Content-Type:text/xml; charset=utf-8");
$rss = '';
$rss .= '<?xml version="1.0" encoding="UTF-8"?>'."\n";

$rss .= '';
$rss .= "\t\n";
$rss .= "\t\t<title><![CDATA[".Configuration::get('PS_SHOP_NAME')."]]></title>\n";
$rss .= "\t\t<link>http://www.to-buy-art.com/</link>\n";
$rss .= "\t\t\n";
$rss .= "\t\t<![CDATA[ ".Configuration::get('PS_SHOP_NAME')." ]]>\n";
$rss .= "\t\t".Language::getIsoById(intval($cookie->id_lang))."\n";
$rss .= "\t\thttp://www.rssboard.org/rss-specification\n";
$rss .= "\t\tPrestaShop\n";
$rss .= "\t\tCopyright <![CDATA[ ".Configuration::get('PS_SHOP_NAME')." ]]>.\n";
$rss .= "\t\t".$datepub."\n";
$rss .= "\t\t1\n";
$rss .= "\t\t\n";
$rss .= "\t\t\t<title><![CDATA[ ".Configuration::get('PS_SHOP_NAME')." ]]></title>\n";
$rss .= "\t\t\thttp://www.to-buy-art.com/img/logo.jpg\n";
$rss .= "\t\t\t<link>http://www.to-buy-art.com/</link>\n";
$rss .= "\t\t\n";

   foreach ($products AS $product)
   {
       $logged = date(DATE_RSS, datetimeUS2Time($product['date_upd'])); 
       $image = Image::getImages(intval($cookie->id_lang), $product['id_product']);
       $rss .= "\t\t\n";
       $rss .= "\t\t\t<title><![CDATA[".$product['name']." - ".html_entity_decode(Tools::displayPrice(Product::getPriceStatic($product['id_product']), $currency), ENT_COMPAT, 'UTF-8')." ]]></title>\n";
       $rss .= "\t\t\t<link><![CDATA[http://www.to-buy-art.com".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]></link>\n";
       $rss .= "\t\t\t".$logged."\n";
       $rss .= "\t\t\t<![CDATA[http://www.to-buy-art.com".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]>\n";
       $rss .= "\t\t\t<img src="http://www.to-buy-art.com/img/p/".$image[0]['id_product']."-".$image[0]['id_image']."-large.jpg" title="".$product['name']."" alt="thumb" />
       <![CDATA[".$product['description_short']."]]>\n";
       $rss .= "\t\t\n";
   }

$rss .= "\t\t\n";
$rss .= "";

file_put_contents('./../../rss.xml', $rss);

echo $rss;

?>

Link to comment
Share on other sites

Ouhaa !
C'est un super boulot que vous avez fait !
J'avais moi aussi re-manier le fichier rss.php pour le rendre valide, mais pas au point qu'il génère de lui même un fichier rss.xml à la racine !!!

Quand j'ai voulu essayer le code cité juste au-dessus par "lehangart", ça passait pas chez moi et chez lui nickel ...
et j'ai trouvé pourquoi :
il faut faire une modif. sur la ligne en dessous :

$rss .= "\t\t\t



J'ai cherché longtemps, mais je comprend pourquoi maintenant le BBcode du site interprète et modifie le code présenté...

Au début, au lieu de.....<img src=....
il faut mettre (j'espace les lettre volontairement ) & l t ; img src=.......

et à la fin.........alt="thumb" / & g t ;

il vous faudra donc enlever les espaces entre & l t ; et & g t ; qui sont traduit par < et >
Mais après, ça marche nickel !

Encore super boulot, merci à vous ! ;)

Link to comment
Share on other sites

  • 6 months later...

Je republie le code qui prend en compte directement le nom de domaine...
Il peut maintenant s'adapter à un site multilangue avec un nom de domaine (ou sous domaine) différent par langue.
C'est intéressant quand vous voulez référencez votre flux dans les différentes langues.

<?php
include(dirname(__FILE__).'/../../config/config.inc.php');
require_once(dirname(__FILE__).'/../../init.php');

/**
* Fonction de conversion de date/heure du format am?icain (AAAA-MM-JJ HH:MM:SS) en Timestamp.
* @param string $datetime Date/heure au format am?icain (AAAA-MM-JJ HH:MM:SS)
* @return integer Timestamp en seconde
*/
function datetimeUS2Time($datetime)
{
   list($date, $time) = explode(' ', $datetime);
   list($hour, $minute, $second) = explode(':', $time);
   list($year, $month, $day) = explode('-', $date);
   $timestamp = mktime($hour, $minute, $second, $month, $day, $year);
   return $timestamp;
}

// Get data
$number = (intval(Tools::getValue('n')) ? intval(Tools::getValue('n')) : 10);
$orderByValues = array(0 => 'name', 1 => 'price', 2 => 'date_add', 3 => 'date_upd', 4 => 'position');
$orderWayValues = array(0 => 'ASC', 1 => 'DESC');
$orderBy = Tools::strtolower(Tools::getValue('orderby', $orderByValues[intval(Configuration::get('PS_PRODUCTS_ORDER_BY'))]));
$orderWay = Tools::strtoupper(Tools::getValue('orderway', $orderWayValues[intval(Configuration::get('PS_PRODUCTS_ORDER_WAY'))]));
if (!in_array($orderBy, $orderByValues))
   $orderBy = $orderByValues[0];
if (!in_array($orderWay, $orderWayValues))
   $orderWay = $orderWayValues[0];
$id_category = (intval(Tools::getValue('id_category')) ? intval(Tools::getValue('id_category')) : 1);
$products = Product::getProducts(intval($cookie->id_lang), 0, ($number > 10 ? 10 : $number), $orderBy, $orderWay, $id_category, true);
$currency = new Currency(intval($cookie->id_currency));
$affiliate = (Tools::getValue('ac') ? '?ac='.Tools::getValue('ac') : '');
$datepub = date(DATE_RSS);

// Send feed
header("Content-Type:text/xml; charset=utf-8");
$rss = '';
$rss .= '<?xml version="1.0" encoding="UTF-8"?>'."\n";

$rss .= '';
$rss .= "\t\n";
$rss .= "\t\t<title><![CDATA[".Configuration::get('PS_SHOP_NAME')."]]></title>\n";
$rss .= "\t\t<link><![CDATA[".'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__."]]></link>\n";
$rss .= "\t\t\n";
$rss .= "\t\t<![CDATA[ ".Configuration::get('PS_SHOP_NAME')." ]]>\n";
$rss .= "\t\t".Language::getIsoById(intval($cookie->id_lang))."\n";
$rss .= "\t\thttp://www.rssboard.org/rss-specification\n";
$rss .= "\t\tPrestaShop\n";
$rss .= "\t\tCopyright <![CDATA[ ".Configuration::get('PS_SHOP_NAME')." ]]>.\n";
$rss .= "\t\t".$datepub."\n";
$rss .= "\t\t1\n";
$rss .= "\t\t\n";
$rss .= "\t\t\t<title><![CDATA[ ".Configuration::get('PS_SHOP_NAME')." ]]></title>\n";
$rss .= "\t\t\t<![CDATA[".'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__."img/logo.jpg]]>\n";
$rss .= "\t\t\t<link><![CDATA[".'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__."]]></link>\n";
$rss .= "\t\t\n";

   foreach ($products AS $product)
   {
       $logged = date(DATE_RSS, datetimeUS2Time($product['date_upd'])); 
       $image = Image::getImages(intval($cookie->id_lang), $product['id_product']);
       $rss .= "\t\t\n";
       $rss .= "\t\t\t<title><![CDATA[".$product['name']." - ".html_entity_decode(Tools::displayPrice(Product::getPriceStatic($product['id_product']), $currency), ENT_COMPAT, 'UTF-8')." ]]></title>\n";
       $rss .= "\t\t\t<link><![CDATA[".'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]></link>\n";
       $rss .= "\t\t\t".$logged."\n";
       $rss .= "\t\t\t<![CDATA[".'http://'.htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Tools::getValue('id_category'))).$affiliate."]]>\n";
       $rss .= "\t\t\t<img src="http://".htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8').__PS_BASE_URI__."img/p/".$image[0]['id_product']."-".$image[0]['id_image']."-large.jpg" title="".$product['name']."" alt="thumb" />
       <![CDATA[".$product['description_short']."]]>\n";
       $rss .= "\t\t\n";
   }

$rss .= "\t\t\n";
$rss .= "";

file_put_contents('./../../rss.xml', $rss);

echo $rss;

?>



Ps: attention à la remarque précédente sur les BBcodes

Link to comment
Share on other sites

  • 2 years later...

Salut,

j'avais le meme probleme (en fait je recupere mes flux rss de catégories via rss graphiti pour publier sur le facebook et le twitter de ma boutique).

Donc a cause des dates absentes du flux rss, le flux n'etait pas repris.

 

J'ai bien essayé le code ci-dessus mais a priori pas compatible avec mon prestashop 1.4.7.0

 

donc j'ai fait un mix entre le rss.php d'origine de prestashop et les infos trouvée ici.

 

donc j'ai modifié deux parties de rss.php

 

// Get data
$number = ((int)(Tools::getValue('n')) ? (int)(Tools::getValue('n')) : 10);
$orderBy = Tools::getProductsOrder('by', Tools::getValue('orderby'));
$orderWay = Tools::getProductsOrder('way', Tools::getValue('orderway'));
$id_category = ((int)(Tools::getValue('id_category')) ? (int)(Tools::getValue('id_category')) : 1);
$products = Product::getProducts((int)($cookie->id_lang), 0, ($number > 10 ? 10 : $number), $orderBy, $orderWay, $id_category, true);
$currency = new Currency((int)($cookie->id_currency));
$affiliate = (Tools::getValue('ac') ? '?ac='.(int)(Tools::getValue('ac')) : '');
$datepub = date(DATE_RSS);

ici, j'ai juste ajouté le $datepub = date(DATE_RSS);

 

Plus loin ...

 

foreach ($products AS $product)
{
	$image = Image::getImages((int)($cookie->id_lang), $product['id_product']);
	echo "\t\t<item>\n";
	echo "\t\t\t<title><![CDATA[".$product['name']." - ".html_entity_decode(Tools::displayPrice(Product::getPriceStatic($product['id_product']), $currency), ENT_COMPAT, 'UTF-8')." ]]></title>\n";
	echo "\t\t<pubDate>".$datepub."</pubDate>\n";
	echo "\t\t\t<description>";
	$cdata = true;
	if (is_array($image) AND sizeof($image))
	{
		$imageObj = new Image($image[0]['id_image']);
		echo "<![CDATA[<img src='"._PS_BASE_URL_._THEME_PROD_DIR_.$imageObj->getExistingImgPath()."-small.jpg' title='".str_replace('&', '', $product['name'])."' alt='thumb' />";
		$cdata = false;
	}
	if ($cdata)
		echo "<![CDATA[";
	echo $product['description_short']."]]></description>\n";

	echo "\t\t\t<link><![CDATA[".htmlspecialchars($link->getproductLink($product['id_product'], $product['link_rewrite'], Category::getLinkRewrite((int)($product['id_category_default']), $cookie->id_lang))).$affiliate."]]></link>\n";
	echo "\t\t</item>\n";
}

 

ici j'ai ajouté la ligne echo "\t\t<pubDate>".$datepub."</pubDate>\n";

 

Du coup j'ai bien la date des articles ajoutés et ca poste correctement sur mon facebook et mon twitter.

 

voila ,je laisse ce temoignage pour ceux qui cherchent une solution aussi.

 

a+

Link to comment
Share on other sites

  • 4 weeks later...

Salut à tous.

 

Darkv j'ai essayé ta solution. Le seul problème etait qu'a chaque fois qu'on rechargeait le flux, la date de publication changeait --> du coup rss grafitti remettait en boucle les infos. En outre, une date de publication ou de mise à jour ca doit être fixe !

De même les images n'etaient pas remontées.

 

J'ai bidouillé un truc avec les solutions de ce fil qui marche parfaitement en se servant de la variable date_upd de la table product.

 

Donc ca donne ceci :

 

Pour les images il faut passer en medium car les small sont trop petites pour Rss Grafitti.

Et il faut écrire la variable pubdate.

 

J'ai fait d'autre modif pour rendre le flux RSS valide --> Ajout de la donnée Guid, suppression de Mail

 

Voila si ca peut servir je vous mets le fichier rss.php en PJ à mettre dans le module feeder (apres avoir conservé le fichier original).

 

Testé uniquement sur 1.4

rss.php

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...