Force.com Sites のSEO対策②!URL書き換えクラスを設定して、URL設計をカイゼンする
					こんにちは! エナジードリンクを飲むと喉が渇いて、つい水を飲んでしまい… せっかく飲んだのにカラダの中で薄まっている気がする今日この頃です。

くだらない話はさておき… 今日は、再びForce.com SitesのSEO対策についてです。 前回は、robots.txtについて書きました。 Force.com SitesのSEO。Visualforceページでrobots.txtを作成して設定する。 同じ方面で、今回はSitesのURLについて掘り下げてみようと思います。
Sites URLについて本気出して考えてみる。
通常、SitesでVisualforceページを公開すると、下記のような形式のURLになるかと思います。
http://xxx.force.com/SampleSitesPage?category=staff&name=田中太郎
Visualforceページの名称が剥き出しになってしまったり、 複数のパラメータが含まれる複雑なURLになってしまいがち…。 Googleの公開している「検索エンジン最適化スターターガイド」によると、 SEO的には「ユーザフレンドリーなURLであること」「シンプルなURLであること」がより良いURLであると記載されています。
http://xxx.force.com/staff/田中太郎
こっちの方が分かりやすいですよね。 おそらく、複数名いるスタッフのうちの田中太郎さんのページなのだと直感的に分かります。 では、Force.com Sitesでここを改善する場合はどうすればいいのか? 答えは、「URL書き換えクラス」を開発して、カスタマイズすることになります。
URL書き換えクラスを実装してみようのコーナー。
Force.com Sites でURL書き換えクラスに設定できるApexクラスは、 UrlRewriterインターフェースを実装したクラスのみです。 開発者ガイド(英語)を参考にしながら実装してみます。 取引先オブジェクトを例にしたサンプルがあるので、動作を確認するだけであればコピペで試せる良きガイドです。 が、折角なので田中太郎さんに再登場してもらうことにします。
/**
 * URL書き換えクラスサンプル
 *
 * http://xxx.force.com/SampleSitesPage?category=staff&name=田中太郎
 * ↓
 * http://xxx.force.com/staff/田中太郎
 */
global with sharing class customRewriter implements Site.UrlRewriter {
    String CATEGORY_STAFF = '/staff/';
    String CATEGORY_STAFF_PAGEURL = '/SampleSitesPage?category=staff&name=';
    /**
     * 単一
     */
    global PageReference mapRequestUrl(PageReference myFriendlyUrl) {
        // URL取得。
        String url = myFriendlyUrl.getUrl();
        // '/staff/'で始まっていれば、スタッフ名で検索を行う。
        if(url.startsWith(CATEGORY_STAFF)){
            String name = url.substring(CATEGORY_STAFF.length(),url.length());
            // スタッフオブジェクトからスタッフ名でレコードを検索。
            Staff__c staff = [SELECT Id,StaffName__c FROM Staff__c WHERE StaffName__c =: name LIMIT 1];
            // スタッフレコードのIdを付与した書き換え前のURLでreturn
            return new PageReference(CATEGORY_STAFF_PAGEURL + staff.StaffName__c);
        }
        return null;
    }
    /**
     * 複数
     */
    global List<PageReference> generateUrlFor(List<PageReference> mySalesforceUrls){
        List<PageReference> myFriendlyUrls = new List<PageReference>();
        List<String> staffNames = new List<String>();
        // スタッフ名の取得
        for (PageReference mySalesforceUrl : mySalesforceUrls) {
            String url = mySalesforceUrl.getUrl();
            // '/staff/'で始まっていれば、スタッフ名をListに格納する。
            if(url.startsWith(CATEGORY_STAFF)){
                String name = url.substring(CATEGORY_STAFF.length(),url.length());
                staffNames.add(name);
            }
        }
        // スタッフオブジェクトからスタッフ名でレコードを検索。
        List <Staff__c> staffs = [SELECT Id,StaffName__c FROM Staff__c WHERE StaffName__c IN :staffNames];
        Integer counter = 0;
        for(PageReference mySalesforceUrl : mySalesforceUrls) {
            // URL取得
            String url = mySalesforceUrl.getUrl();
            // '/staff/'で始まっていれば、スタッフレコードのIdを付与した書き換え前のURLをadd
            if(url.startsWith(CATEGORY_STAFF)){
                myFriendlyUrls.add(new PageReference(CATEGORY_STAFF_PAGEURL + staffs.get(counter).StaffName__c));
                counter++;
            } else {
                myFriendlyUrls.add(mySalesforceUrl);
            }
        }
        return myFriendlyUrls;
    }
}
クラスの概要としては、 /staff/〇〇〇〇〇 で来たら、 /SampleSitesPage?category=staff&name=田中太郎 と変換するよ、というものです。 言葉で書くと、単純ですね。
設定して、動作を確認する!
実装が終わったら、Sitesの設定画面からポチポチと設定します。

ちなみに、UrlRewriterインターフェースが実装されていないクラスを設定するとエラーになりました。

設定できたら、 Idと名前が出るだけの単純なVisualforceページを用意したので、早速動かしてみます!


どちらも同じ結果になり、うまく動作してくれていることが確認できました。 こう比べると、URLはシンプルな方がユーザビリティも高くてキレイ…。 画面のレイアウト等と同じく人の目に触れるところなので、気を付けていきたいですね。


