Joomlaのパーマリンク(もどき)、JRouteでソーシャルボタンのURLを正規化する

業界第2位のCMS、Joomla!でぼちぼちとサイトを作っています。なかなか完成しません。

先日、ソーシャルボタンの追加方法を考えていました。

気づかなければ良かったのに、特にソーシャルシェアを考えるのにJoomlaには不利な点がありました。Joomla!ではWordPressよりもURLに柔軟性が高いのです。そこに問題があります。

Sponsored link

WordPressの場合:パーマリンク

WordPressもJoomla!も複数のURLで同じ記事にアクセス出来ます。

例えば、

「https://tek2tech.com/index.php?p=1176」

というURLでは、

ソーシャルボタンをプラグインを使わず自前で追加する方法
てく2テック(当サイト)で使わせて頂いているWordPressテーマのSimplicityは配布されている段階ですでにソーシャルボタンが配置...

にアクセスできます。この場合、index.php?p=1176と書いてもリダイレクトされて/how-to-add-social-share-buttons-on-sites/にURLが書き換わります。

また、サーチエンジン最適化されたURLを

<?php the_permalink(); ?>

<?php get_permalink(); ?>

で簡単に呼び出す事もできます。ブラウザで表示しているURL自体を取得して表示させなくても簡単です。

Joomla!のSEF(検索エンジンフレンドリ)URL

Joomla!でWordPressのパーマリンクに(大体)該当する機能がSEF URLです。投稿日によって変えたりすることは基本的に出来ません。(無理やりできないことはないですが)

サイトに設置したメニューのURLにつながっていくので、パンくずリストが見やすく、理解しやすくなります。

Joomla SEFの問題点

以前の記事で少しだけ触れていますが、JoomlaではSEF URL周りがWordPressと比べるとダメな気がします。

Joomlaに足りないもの・・・Ping機能など
気に入って使っているCMS(コンテンツマネジメントシステム)のJoomlaですが、ブログ系サイトを作るのには足りない機能がいくつかあります。...

WordPressと違って、リダイレクトされないので複数URLで同じ記事にアクセスできることになります。標準だとカノニカルURLにバグがあるので、プラグインをいれるのですが、それでもうまく行かないこともあります。

実在のメニュー名と実在の記事URLを組み合わせると、意図しないレイアウトで表示されてしまうこともあります。

その点、現在試しているJoomlaの拡張機能、FLEXIcontentはとっつきにくいですがほぼ満足行くレベルでまとまっていて良いです。

SEF URLとカノニカル設定、FLEXIcontentの使い方
Joomla用拡張機能のFLEXIcontentを試しています。 機能は複雑ですが、標準の記事コンポーネント(com_cont...

ソーシャルボタンでシェアされるURL

自分でソーシャルボタンを設置していて気づいたのですが、ブラウザで表示されるURLを使ってソーシャルボタンを作った場合、同じ記事に対して付けていただいたソーシャルシェアが分散してしまいます。

どうせなら、同じURLにしておきたいところです。

JoomlaのSEF URL

Joomla!でも「標準」のURLを得ることは出来ます。WordPressほど簡単ではありません。

<?php JRoute::_('index.php?view=article&id=1&catid=20'); ?>

このような感じになります。大抵のテンプレートでは、$this->idとか$item->catidでアイテムIDとカテゴリーIDが使えるようになっているので、

<?php JRoute::_('index.php?view=article&id='.$this->id.'&catid='.$this->catid); ?>

基本的にはカノニカルなURLが得られます。が、この$this->idとかの変数が使えるのがコンテンツコンポーネントの内部(記事内部とテンプレートのPHPファイル内)だけなのです。

ユーザーが設置したモジュール内(この場合は、ソーシャルシェアボタンのモジュール内)でカノニカルなURLを得るには、

$input = JFactory::getApplication()->input;
// article, categories, featured, blog...
$view = $input->get('view'); 
// if it's a category view, this will be the category id, else the article id
$id = $input->getInt('id'); 
// in an article view, this will be the cat id.
$catid = $input->getInt('catid'); 
// this is the menu item id i.e. what you call page id I guess.
$Itemid = $input->getInt('Itemid'); 

こんなコードが追加で必要です。合わせると、

<?php 
$input = JFactory::getApplication()->input;
echo JRoute::_('index.php?view='. $input->get('view')
   .'&id='. $input->getInt('id')
   .'&catid='. $input->getInt('catid'));
?>

ただしviewがarticleの場合に限る、という長いコードになります。WordPressだとthe_permalink(); で終わるのに!

まあ、WordPressでも内部ではきっと何か面倒な(そしてきっと冗長な!)処理をしているとはずなので、そう思えば諦めも付きます。

FLEXIcontentのSEF URL

今使っているFLEXIcontentは、Joomlaの標準記事com_contentを拡張する形で実装されていて、Joomlaが吐き出したSEF URLをそのまま使っても動作はしてくれます。

が、Joomlaのカテゴリーブログをメニューに指定していない状態だとSEF URLが働かないので、出力されるURLが非常に長い非SEF URLになってしまいます。

隠しメニューを使ってJoomlaカテゴリーブログを設定するか、FLEXIcontentのURL出力機能を噛ませます。

先ほどのJRoute::_();の引数にFLEXIcontentの関数を入れます。

<?php echo JRoute::_( FlexicontentHelperRoute::getItemRoute($id, $catid=0, $Itemid=0, $item=null) ); ?>

少なくとも現在のFLEXIcontent 3では、記事ページに対してはitemを返すようなので、$input->get(‘view’)が”item”だった時にはこの関数getItemRouteを呼び出せば良いようです。が、残念ながらこれだけでは解決できません。

別の考え方

ソーシャルボタンに動的にURLを割り当てて、どの(いつ、誰が)シェアしてくれたURLからサイトに来る人が多いのか、解析する方法もあります。

リダイレクトを使えばできるのですがあまりにも面倒なので、(有料ですが)専用のプラグインに頼ったほうが良さそうです。

Sponsored link
Spinsored link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする