hi
Is it possible to create an dynamic RSS feed for the products of each merchant, at present the sitemap is gettting our products listed OK on google, however we would like to provide an RSS feed for the products so this could be used if people wanted them to display on their site.
Any help would be great
Thanks
Brent
hi
I seem to be getting an error with the above code
Parse error: syntax error, unexpected ';' in /home/utodayno/public_html/rss.php on line 9
Any ideas
Brent
Hi Brent,
There was a missing bracket on the call to database_safe() - i've fixed it now in the above code...
Cheers,
David.
I've tried without success, but would it be possible to modify the code above to work with a search query?
Maybe the url would look like this, http://example.com/rss.php?q=baseball%20bat and the rss feed created would include all items that matched the search term?
My php skills are weak :) I tried to modify searchresults.php to spit out an rss feed but could not get it to work.
Hello Don,
Yes - this is quite straight forward. What's needed is the search code from search.php (that constructs the SQL based on $q from the URL) in place of the single line of SQL contained in the above rss.php script. Here's the basic idea:
Usage: rss.php?q=query
rss.php
<?php
require("includes/common.php");
header("Content-Disposition: attachment; filename=products.xml");
header("Content-Type: text/xml");
print "<?xml version='1.0' encoding='UTF-8'?>";
print "<rss>";
print "<channel>";
$q = $_GET["q"];
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') GROUP BY name";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' GROUP BY name";
}
if (database_querySelect($sql,$rows))
{
foreach($rows as $row)
{
print "<item>";
if ($config_useRewrite)
{
$href = "product/".tapestry_hyphenate($row["name"]).".html";
}
else
{
$href = "products.php?q=".urlencode($row["name"]);
}
print "<title>".$row["name"]."</title>";
print "<link>http://www.example.com".$config_baseHREF.$href."</link>";
print "<description>".$row["description"]."</description>";
print "</item>";
}
}
print "</channel>";
print "</rss>";
?>
Hope this helps!
Cheers,
David.
Hi all
The above gets me to download a xml file, is it possible to show a list on the screen without the download?
Mally
Hi Mally,
The download is forced by this line:
header("Content-Disposition: attachment; filename=products.xml");
If you just delete or comment out that line, a browser should just display the XML instead of offering it for download.
Cheers,
David.
Hi David
I have been using this feed for some time, my question is there any way to get images of the product in this feed.
thanks
brent
Hi Brent,
Yes- that's straight forward; the image URL is in the result set as $row["image_url"], although it's not used. If you wanted to add it as a simple image tag; where you currently have:
print "<description>".$row["description"]."</description>";
...add the following line:
print "<image>".$row["image_url"]."</image>";
However, that isn't standard RSS. If you want to be strictly RSS, an image needs to be specified through an enclosue tag, so you would do it like this:
print "<enclosure src='".$row["image_url"]."' type='image' />";
(although that version is more complex to parse, so if you don't need to do this i'd stick with the first version)
Cheers,
David.
Thank you for this code David
It works fine for me
I wonder how i could make appear only the 10 or 20 last items in the rss ?
Moreover, is it possible to have a similar rss for categories ?
Cheers,
Coyote
Hi,
To get the last products, you should be able to sort by ID descending; so where you have the following block of code in the above script (the version which accepts a query):
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') GROUP BY name";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' GROUP BY name";
}
...change this to:
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') GROUP BY name ORDER BY id DESC limit 20";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' GROUP BY name ORDER BY id DESC limit 20";
}
If you're not using this modified version, simply add:
ORDER BY id DESC limit 20
...to the end of the line that constructs the SQL and that should do the trick.
Here's a quick go at a categories feed:
category_rss.php
<?php
require("includes/common.php");
header("Content-Disposition: attachment; filename=categories.xml");
header("Content-Type: text/xml");
print "<?xml version='1.0' encoding='UTF-8'?>";
print "<rss>";
print "<channel>";
$sql = "SELECT DISTINCT(category) as category FROM `".$config_databaseTablePrefix."products` ORDER BY category";
if (database_querySelect($sql,$rows))
{
foreach($rows as $row)
{
print "<item>";
if ($config_useRewrite)
{
$href = "category/".tapestry_hyphenate($row["category"])."/";
}
else
{
$href = "search.php?q=category:".urlencode($row["category"]);
}
print "<title>".$row["category"]."</title>";
print "<link>http://www.example.com".$config_baseHREF.$href."</link>";
print "<description>".$row["category"]."</description>";
print "</item>";
}
}
print "</channel>";
print "</rss>";
?>
Remember to change www.example.com to your URL!
Cheers,
David.
Hi,
How do I get the above rss feed to only display 20 items?
Do I need to use a cron job to update the feeds?
Lastly, is it possible to display a feeds that show a variety of different merchants?
Thank You
Hi,
Both of these can be achieved simply by changing the SQL, currently:
$sql = "SELECT * FROM `".$config_databaseTablePrefix."products` WHERE merchant='".database_safe($_GET["merchant"])."'";
To limit to 20 items, add "LIMIT 20" to the end, for example:
$sql = "SELECT * FROM `".$config_databaseTablePrefix."products` WHERE merchant='".database_safe($_GET["merchant"])."' LIMIT 20";
To include products from all merchants, the WHERE clause can simply be removed:
$sql = "SELECT * FROM `".$config_databaseTablePrefix."products` LIMIT 20";
(originally, the script takes the merchant from the URL in the ?merchant= parameter)
Or, to include products from selected merchants:
$sql = "SELECT * FROM `".$config_databaseTablePrefix."products` WHERE merchant IN ('Merchant 1','Merchant 2','Merchant 3') LIMIT 20";
Hope this helps!
Cheers,
David.
Hi David,
Thank you for the quick response. Can you please provide the same example for displaying options when using the rss.php example originally posted above by Don?
Thanks
Pat
Hi Pat,
I assume you're referring to the version that returns results based on a query (q=xxx in the URL) rather than per merchant...
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') GROUP BY name";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' GROUP BY name";
}
In this case, the modification to limit to 20 results would be:
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') GROUP BY name LIMIT 20";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' GROUP BY name LIMIT 20";
}
And similarly, to restrict this to certain merchants, the same IN statement can be added to the WHERE clauses in each case:
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') AND merchant IN ('Merchant 1','Merchant 2','Merchant 3') GROUP BY name LIMIT 20";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' AND merchant IN ('Merchant 1','Merchant 2','Merchant 3') GROUP BY name LIMIT 20";
}
For more or less merchants (or just a single merchant) simply add or remove merchants from the list in brackets after the merchant IN...
Cheers,
David.
Hello David
Would it be possible to provide the code to select a rss feed for a particular category, so instead of searching for a product, your searching for items in a particular product? Thanks Mally
Hello David
Ref the above, you mentioned to add print "<image>".$row["image_url"]."</image>";
to get the images
How would you get the cheapest price?
Thanks MAlly
Hi Mally,
It's in the minPrice variable in $row, so something like:
print "<lowestPrice>".$row["minPrice"]."</lowestPrice>";
Cheers,
David.
Hello David
Would it be possible to provide the code to select a rss feed for a particular category, so instead of searching for a product, your searching for items in a particular product? Thanks Mally
Great stuff
Hi Mally,
Not quite sure what you mean there - are you looking to create an index page with every category name being a link to it's RSS feed URL?
Cheers,
David.
Hi David,
Not sure if its possible but instead of using a rss then keyword, I would like to do rss and a category name (e.g
Fishing Magazines ), so basically the rss feed display's all the items and their details. so in this case it would be about 12 fishing mags
Hope this makes sense
Cheers Mally
Hi Mally,
That's straight forward - if you want to email me your existing rss.php i'll modify it to support this, then you can add a feed link to the category index pages...
Cheers,
David.
I still have the rss.php code working but I'd really love to insert the image and price in the description of the rss feed. Has anyone accomplished this using cdata?
I can't get the image url to show up at all,
code I'm using
I used
print "<enclosure src='".$row["image_url"]."' type='image' />";
to experiment with the image url but it always shows up black
<?php
require("includes/common.php");
header("Content-Type: text/xml");
print "<?xml version='1.0' encoding='UTF-8'?>";
print "<rss>";
print "<channel>";
$q = $_GET["q"];
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') AND merchant IN ('HockeyGiant.com') GROUP BY name ORDER BY id DESC limit 20";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' AND merchant IN ('HockeyGiant.com') GROUP BY name ORDER BY id DESC limit 20";
}
if (database_querySelect($sql,$rows))
{
foreach($rows as $row)
{
print "<item>";
if ($config_useRewrite)
{
$href = "product/".tapestry_hyphenate($row["name"]).".html";
}
else
{
$href = "products.php?q=".urlencode($row["name"]);
}
print "<title>".$row["name"]."</title>";
print "<link>http://www.hockeyshopper.com".$config_baseHREF.$href."</link>";
print "<description>".$row["description"]."</description>";
print "<enclosure src='".$row["image_url"]."' type='image' />";
print "</item>";
}
}
print "</channel>";
print "</rss>";
?>
Hi Dave, when i use this bit of programming i get a feed code error.
Thanks
Nigel
Hi Nigel,
What is the error message you are getting exactly? Can email me your script and screen shot or copy and paste the error text?
Cheers,
David.
Hi David
I am also getting an error
Only one top level element is allowed in an XML document.
Line: 2 Character: 2
Parse error: syntax error, unexpected T_ELSE in /home/example/public_html/rss3.php on line 17
Here is the code
<?php
require("includes/common.php");
header("Content-Type: text/xml");
print "<?xml version='1.0' encoding='UTF-8'?>";
print "<rss>";
print "<channel>";
$q = $_GET["q"];
if (strlen($q) > 3)
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants, MATCH name AGAINST ('".database_safe($q)."') AS relevance FROM `".$config_databaseTablePrefix."products` WHERE MATCH name AGAINST ('".database_safe($q)."') AND merchant IN ('Flirty Lingerie','Eden Fantasys','Wicked Temptations') GROUP BY name LIMIT 20";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' AND merchant IN ('Flirty Lingerie
','Eden Fantasys','Wicked Temptations') GROUP BY name LIMIT 20";
}
else
{
$sql = "SELECT * , MIN( price ) AS minPrice, MAX( price ) AS maxPrice, COUNT( id ) AS numMerchants FROM `".$config_databaseTablePrefix."products` WHERE search_name LIKE '%".database_safe($q)."%' GROUP BY name";
}
if (database_querySelect($sql,$rows))
{
foreach($rows as $row)
{
print "<item>";
if ($config_useRewrite)
{
$href = "product/".tapestry_hyphenate($row["name"]).".html";
}
else
{
$href = "products.php?q=".urlencode($row["name"]);
}
print "<title>".$row["name"]."</title>";
print "<link>http://".$_SERVER["HTTP_HOST"].$config_baseHREF.$href."</link>";
print "<description>".$row["description"]."</description>";
print "<enclosure src='".$row["image_url"]."' type='image' />";
print "</item>";
}
}
print "</channel>";
print "</rss>";
?>
Any help will be appreciated
Thank You
Dean
Hi Dean,
The code looks fine as far as I can tell! Could you perhaps email me a link to the feed so that I can view the actual code generated...
Cheers,
David.
Will this work in the newer versions of price tapestry?
Hi,
Sure - no changes in the relevant database schema but in case of any problems, just let me know what code you're using as there are a number of examples above and i'll check it out..
Cheers,
David.
--
PriceTapestry.com
Hi Brent,
RSS is not ideally suited towards product export where there are likely to be thousands of products, however it is quite straight forward to dump a merchant's products as an RSS feed.
rss.php
<?php
require("includes/common.php");
header("Content-Disposition: attachment; filename=products.xml");
header("Content-Type: text/xml");
print "<?xml version='1.0' encoding='UTF-8'?>";
print "<rss version='2.0'>";
print "<channel>";
print "<title>RSS Product Export</title>";
print "<link>http://www.example.com/</link>";
print "<description>RSS Product Export</description>";
$sql = "SELECT * FROM `".$config_databaseTablePrefix."products` WHERE merchant='".database_safe($_GET["merchant"])."'";
if (database_querySelect($sql,$rows))
{
foreach($rows as $row)
{
print "<item>";
if ($config_useRewrite)
{
$href = "product/".tapestry_hyphenate($row["name"]).".html";
}
else
{
$href = "products.php?q=".urlencode($row["name"]);
}
print "<title>".$row["name"]."</title>";
print "<link>http://www.example.com".$config_baseHREF.$href."</link>";
print "<description><![CDATA[".$row["description"]."]]></description>";
print "</item>";
}
}
print "</channel>";
print "</rss>";
?>
Remember to change http://www.example.com in the above code to your URL so that the links are correct. Then, to use the export, the URL would be:
http://www.example.com/rss.php?merchant=Merchant
Hope this helps get you started...
Cheers,
David.