Category Archives: SEO

Create RSS from your ruby on rails application

For one my recent project need RSS feed. So I have created myself.

This will show you how to create a RSS feed that the Feed Validator considers valid.

First create a FeedsController to host the RSS feed.

class FeedsController < ApplicationController

  layout false

  def rss
    @posts = Post.published_posts.limit(50)
  end

end

Then create a view in views/feeds/rss.rss.builder for RSS.

xml.instruct!
xml.rss :version => '2.0', 'xmlns:atom' => 'http://www.w3.org/2005/Atom' do

  xml.channel do
    xml.title 'Feed title'
    xml.description 'Feed description'
    xml.link root_url
    xml.language 'en'
    xml.tag! 'atom:link', :rel => 'self', :type => 'application/rss+xml', :href => posts_url

    for post in @posts
      xml.item do
        xml.title post.title
        xml.category post.category.name
        xml.pubDate(post.created_at.rfc2822)
        xml.link post_url(post)
        xml.guid post_url(post)
        xml.description(h(post.body))
        xml.image_url post.image_url
      end
    end

  end

end

Create a route to the feed in config/routes.rb:

get 'feed.rss', to: 'feeds#rss', :format => 'rss'

You can get browsers to auto-detect your Rails blog rss feed with a single line of Ruby on Rails code:

<%= auto_discovery_link_tag(:rss, "http://example.com") %>

That’s it.

Happy Coding 🙂

Create dynamic sitemap on ruby on rails

What is sitemap:

Sitemaps are an easy way for webmasters to inform search engines about pages on their sites that are available for crawling. In its simplest form, a Sitemap is an XML file that lists URLs for a site along with additional metadata about each URL (when it was last updated, how often it usually changes, and how important it is, relative to other URLs in the site) so that search engines can more intelligently crawl the site.

It’s basically a XML file describing all URLs in your page:

The following example shows a Sitemap that contains just one URL and uses all optional tags. The optional tags are in italics.

<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

   <url>

      <loc>http://www.example.com/</loc>

      <lastmod>2005-01-01</lastmod>

      <changefreq>monthly</changefreq>

      <priority>0.8</priority>

   </url>

   <url>

      <loc>http://www.example.com/catalog?item=12&amp;desc=vacation_hawaii</loc>

      <changefreq>weekly</changefreq>

   </url>

   <url>

      <loc>http://www.example.com/catalog?item=73&amp;desc=vacation_new_zealand</loc>

      <lastmod>2004-12-23</lastmod>

      <changefreq>weekly</changefreq>

   </url>

   <url>

      <loc>http://www.example.com/catalog?item=74&amp;desc=vacation_newfoundland</loc>

      <lastmod>2004-12-23T18:00:15+00:00</lastmod>

      <priority>0.3</priority>

   </url>

   <url>

      <loc>http://www.example.com/catalog?item=83&amp;desc=vacation_usa</loc>

      <lastmod>2004-11-23</lastmod>

   </url>

</urlset>

 

Creating your dynamic sitemap with Ruby on Rails:
First write this on your routes file.

map.sitemap "/sitemap.:format",
     :controller => "home",
     :action => "sitemap",
     :conditions => { :method => :get }

So sitemap URL will be http://www.mysite.com/sitemap.xml
Now on controller write some method to fetch data.

@posts = Post.all
@categories = Category.all

Now the logic is done and you have to create view for your sitemap to show that sitemap when some request riches http://www.mysite.com/sitemap.xml.

We need to build a XML containing the 3 main nodes to make it a sitemap:

loc – The URL of your page
priority – The priority of the indexing page process between 0 and 1
lasmod – Date of the last modification
changefreq- How frequently the page is likely to change. This value provides general information to search engines and may not correlate exactly to how often they crawl the page. Valid values are

  • always
  • hourly
  • daily
  • weekly
  • monthly
  • yearly
  • never

First node is mandatory, the others are optional. Using the XML builder, create the file sitemap.xml.builder to our sitemap and put the next lines:


base_url = "http://#{request.host_with_port}"
xml.instruct! :xml, :version=>'1.0'

xml.tag! 'urlset', "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do

  xml.url do
    xml.loc "#{base_url}"
    xml.changefreq "monthly"
    xml.priority 1.0
  end

  xml.url do
    xml.loc "#{base_url}/FAQ"
    xml.lastmod Time.now.to_date
    xml.changefreq "monthly"
    xml.priority 1.0
  end

  xml.url do
    xml.loc "#{base_url}/contact-us"
    xml.lastmod Time.now.to_date
    xml.changefreq "monthly"
    xml.priority 1.0
  end

  xml.url do
    xml.loc "#{base_url}/about"
    xml.lastmod Time.now.to_date
    xml.changefreq "monthly"
    xml.priority 1.0
  end

  @categories.each do |category|
    xml.url do
      xml.loc category_url(category)
      xml.priority 0.9
    end
  end

  @posts.each do |post|
    xml.url do
      xml.loc post_url(post)
      xml.lastmod post.updated_at.to_date
      xml.changefreq "always"
      xml.priority 0.9
    end
  end

  @categories.each do |category|
    xml.url do
      xml.loc category_url(category)
      xml.lastmod post.updated_at.to_date
      xml.changefreq "always"
      xml.priority 0.9
    end
  end

end

That’s it. Happy coding 🙂

Create XML pingomatic for your PHP project

Ping-O-Matic is a service to update different search engines that your blog has updated.

Here is simple way to do that:

 <?php
/**
 * XML Pingomatic
 *
 * @category  Model
 * @author    Md. Sirajus Salayhin <salayhin@gmail.com>
 *
 */
 
class xmlPingoMatic
{
    public function pingoMatic($debug = false)
    {
 
        $sql = "SELECT DISTINCT * ,DATE_FORMAT(date, '%Y-%m-%dT%H:%i:%s+00:00') AS new_date FROM articles
                    WHERE articles.status =  0
                    AND DATE_FORMAT(date, '%Y-%m-%d') = CURDATE() ORDER BY articles.id DESC";
        $res = mysql_query($sql);
 
 
        while ($row = mysql_fetch_assoc($res)) {
 
            $data[] = $row;
        }
 
        $content = '';
        $content .= '<?xml version="1.0"?>';
        $content .= '<methodCall>';
        $content .= '<methodName>weblogUpdates.ping</methodName>';
        $content .= '<params>';
 
        for ($i = 0; $i < count($data); $i++) {
            $content .= '<param>';
            $content .= '<value>' . $data[$i]['title'] . '</value>';
            $content .= '</param>';
            $content .= '<param>';
            $content .= '<value>' . 'http://www.yourdomain.com/article.php?id=' . $data[$i]['id'] . '</value>';
            $content .= '</param>';
        }
 
        $content .= ' </params>';
        $content .= '</methodCall>';
 
        $headers = "POST / HTTP/1.0\r\n" .
            "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)\r\n" .
            "Host: rpc.pingomatic.com\r\n" .
            "Content-Type: text/xml\r\n" .
            "Content-length: " . strlen($content);
 
        if ($debug) nl2br($headers);
 
        $request = $headers . "\r\n\r\n" . $content;
        $response = "";
        $fs = fsockopen('rpc.pingomatic.com', 80, $errno, $errstr);
        if ($fs) {
            fwrite($fs, $request);
            while (!feof($fs)) $response .= fgets($fs);
            if ($debug) echo "<xmp>" . $response . "</xmp>";
            fclose($fs);
            preg_match_all("/<(name|value|boolean|string)>(.*)<\/(name|value|boolean|string)>/U", $response, $ar, PREG_PATTERN_ORDER);
            for ($i = 0; $i < count($ar[2]); $i++) $ar[2][$i] = strip_tags($ar[2][$i]);
            return array('status' => ($ar[2][1] == 1 ? 'ko' : 'ok'), 'msg' => $ar[2][3]);
        } else {
            if ($debug) echo "<xmp>" . $errstr . " (" . $errno . ")</xmp>";
            return array('status' => 'ko', 'msg' => $errstr . " (" . $errno . ")");
        }
 
    }
}

Create sitemap for PHP project

For Search Engin Optimization you need to create site map for your website. Here is a simple class example to do that.

 <?php
 
/**
 * Create Site map
 *
 * @category  Model
 * @author    Md. Sirajus Salayhin <salayhin@gmail.com>
 *
 */
 
class xmlSitemap
{
 
    public function generateXML()
    {
 
        $xmlFile = "../sitemap.xml";
        $fh = fopen($xmlFile, 'w') or die("can't open file");
 
        $sql = "SELECT DISTINCT * ,DATE_FORMAT(date, '%Y-%m-%dT%H:%i:%s+00:00') AS new_date FROM articles
 
             WHERE articles.status =  0 ORDER BY articles.id DESC";
        
        $res = mysql_query($sql);
 
 
        while ($row = mysql_fetch_assoc($res)) {
 
            $content[] = $row;
        }
 
 
        $str = '';
        $str .= '<?xml version="1.0" encoding="UTF-8"?>';
        $str .= '<?xml-stylesheet type="text/xsl" href="sitemap.xsl"?>
<!-- sitemap-generator-url="http://www.yourdomain.com" sitemap-generator-version="3.2.6" -->
<!-- generated-on="October 13, 2011 05:29" -->';
        $str .= '<urlset 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" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
 
        for ($i = 0; $i < count($content); $i++) {
 
            $str .= '<url>';
            $str .= '<loc>http://www.yourdomain.com/article.php?id=' . $content[$i]['id'] . '</loc>';
            $str .= '<lastmod>' . $content[$i]['new_date'] . '</lastmod>';
            $str .= '<changefreq>daily</changefreq>';
            $str .= '<priority>1.0</priority>';
            $str .= '</url>';
        }
 
        $str .= '</urlset>';
 
        fwrite($fh, $str);
        fclose($fh);
    }
}

Add custom style for your sitemap:

 <?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:html="http://www.w3.org/TR/REC-html40"
                xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title>XML Sitemap</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
            <style type="text/css">
                body {
                    font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana;
                    font-size: 13px;
                }
 
                #intro {
                    background-color: #CFEBF7;
                    border: 1px #2580B2 solid;
                    padding: 5px 13px 5px 13px;
                    margin: 10px;
                }
 
                #intro p {
                    line-height: 16.8667px;
                }
 
                td {
                    font-size: 11px;
                }
 
                th {
                    text-align: left;
                    padding-right: 30px;
                    font-size: 11px;
                }
 
                tr.high {
                    background-color: whitesmoke;
                }
 
                #footer {
                    padding: 2px;
                    margin: 10px;
                    font-size: 8pt;
                    color: gray;
                }
 
                #footer a {
                    color: gray;
                }
 
                a {
                    color: black;
                }
            </style>
        </head>
        <body>
        <h1>XML Sitemap</h1>
 
        <div id="intro">
            <p>
                articleofweek.com
            </p>
        </div>
        <div id="content">
            <table cellpadding="5">
                <tr style="border-bottom:1px black solid;">
                    <th>URL</th>
                    <th>Priority</th>
                    <th>Change Frequency</th>
                    <th>LastChange (GMT)</th>
                </tr>
                <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
                <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
                <xsl:for-each select="sitemap:urlset/sitemap:url">
                    <tr>
                        <xsl:if test="position() mod 2 != 1">
                            <xsl:attribute name="class">high</xsl:attribute>
                        </xsl:if>
                        <td>
                            <xsl:variable name="itemURL">
                                <xsl:value-of select="sitemap:loc"/>
                            </xsl:variable>
                            <a href="{$itemURL}">
                                <xsl:value-of select="sitemap:loc"/>
                            </a>
                        </td>
                        <td>
                            <xsl:value-of select="concat(sitemap:priority*100,'%')"/>
                        </td>
                        <td>
                            <xsl:value-of
                                select="concat(translate(substring(sitemap:changefreq, 1, 1),concat($lower, $upper),concat($upper, $lower)),substring(sitemap:changefreq, 2))"/>
                        </td>
                        <td>
                            <xsl:value-of
                                select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))"/>
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </div>
        <div id="footer">
 
        </div>
        </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Happy coding 🙂