スタッフブログ Staff Blog

PowerCMS 5を利用したレコメンド機能にまつわるTips

PowerCMS 5によるレコメンド機能 | PowerCMSブログ」を参考に、関連記事とユーザー毎におすすめ記事を表示する作業を行いました。Google AnalyticsとVisitor Analytics、そしてPowerSearchを利用した興味深い実装でした。

ただ、お客様の環境で作業を進めていてすんなりといかない点等がありました。今日は案件でスムーズに進まなかった点や工夫すると良くなりそうな点をご紹介いたします。

一部のページだけ関連記事が出ない

テンプレートやレコメンドAPI、Google Analyticsの準備をしっかり整え関連記事が表示されるようになったのですが、一部のページだけ関連記事が表示されない現象が発生しました。

現象を探っていると関連記事が表示されないのはフォルダ名に全角括弧が含まれている場合のようでした。ドラフトファイルをよく見てみるとmetadata属性(詳細はPowerCMSブログをご覧ください)に列挙しているカテゴリ名の全角括弧が半角括弧になっていました。全角括弧が半角括弧になるのはis_draftモディファイアを使用するとUnicode::Normalize::NFKC( $text )の処理が入るためで、これにより検索に上手くマッチしなくなるようです。

そこで、括弧がある場合は括弧を取り半角スペースを入れて2つのキーワードに分割することとしました。例えばアクセシビリティ(A11Y)だとアクセシビリティ A11Yです。

ドラフトファイルはregex_replaceで置換を行いました。

metadata=<mt:PageFolder glue=" "><mt:FolderLabel regex_replace="/(\(|()(.*?)(\)|))/"," $2" is_draft="1"></mt:PageFolder> <mt:PageTags glue=" "><mt:TagName is_draft="1"></mt:PageTags>

レコメンドAPIにも括弧がある場合の処理を追記しました。

$entry = $type == 'entry' ? $mt->db()->fetch_entry( $entry_id )
                          : $mt->db()->fetch_page( $entry_id );
if ( $entry ) {
    $interests = [];
    (中略)
    $categories = $entry->categories();
    foreach( $categories as $category ) {
        $label = $category->label;
        preg_match( '/(.*)(\(|()(.*?)(\)|))/', $label, $matches );
        if ( $matches[0] ) {
            // 括弧が含まれる場合は2つのワードに分割
            if (! in_array( $matches[1], $interests ) ) {
                $interests[] = $matches[1];
            }
            if (! in_array( $matches[3], $interests ) ) {
                $interests[] = $matches[3];
            }
        } else {
            if (! in_array( $label, $interests ) ) {
                $interests[] = $label;
            }
        }
    }
    $interest = join( ',', $interests );
}

この対策により、無事関連記事が表示されるようになりました。

ビジターデータに興味・関心がセットされない

ウェブサイト配下のブログを閲覧しても、ウェブサイトに蓄積しているビジターデータの「興味・関心」にデータがセットされない状況が起こりました。

しばらく悩んだのですが、ソースコードを読んでみるとmy $blog_ids = MT->config->VisitorAnalyticsInterestBlogIDs || MT->config->VisitorAnalyticsBlogID;とあり、環境変数VisitorAnalyticsInterestBlogIDsでビジターの興味・関心を解析する際に対象とするウェブサイト・ブ ログIDをカンマ区切りで指定する必要がある事が分かりました。

マニュアルは冷静に読まないといけないですね。

おすすめ記事を全ブログから抽出したい

標準では閲覧しているページと同じブログを対象に検索を行いおすすめ記事を表示していますが、ウェブサイト配下の全ブログから抽出することはできるのだろうか?と考えました。しかも今回作業したサイトには複数のウェブサイトがあり、上手く検索をかけないと違うウェブサイトのページをおすすめ記事に表示してしまう可能性があります。

どのようにすれば実現できるか...と考えたのですが、レコメンドAPIでおすすめ記事の検索を行う際に独自の属性を利用すれば良いことに気付きました。例えばwebsite_idを属性を作るのです。

ドラフトファイルでは以下のようにします。

website_id=<mt:WebsiteID is_draft="1" />

レコメンドAPIは以下のように変更します。(ウェブサイトのIDは1とします。)

if ( $type == 'visitor' ) {
    $attr .= ' -attr "website_id NUMEQ 1" ';
} else {
    if ( $blog_id ) {
        $attr .= ' -attr "@blog_id NUMEQ ' . $blog_id . '" ';
    }
}

まとめ

PowerCMS 5を利用したレコメンド機能を使いこなすには、Visitor AnalyticsやPowerSearch、そしてGoogle Analyticsとさまざまな知識が必要だなと分かりました。記事では扱いませんでしたが、Google Analyticsの設定の都合上、複数のトラッカーを使用する必要もありました。

PowerCMS 5でレコメンド機能を扱われる方の参考になれば幸いです。

お問い合わせ Contact

制作のご依頼、ご相談などは下記のフォームからご連絡ください。