業界第2位のCMS、Joomla!でぼちぼちとサイトを作っています。なかなか完成しません。
先日、ソーシャルボタンの追加方法を考えていました。
気づかなければ良かったのに、特にソーシャルシェアを考えるのにJoomlaには不利な点がありました。Joomla!ではWordPressよりもURLに柔軟性が高いのです。そこに問題があります。
WordPressの場合:パーマリンク
WordPressもJoomla!も複数のURLで同じ記事にアクセス出来ます。
例えば、
「https://tek2tech.com/index.php?p=1176」
というURLでは、

にアクセスできます。この場合、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と比べるとダメな気がします。

WordPressと違って、リダイレクトされないので複数URLで同じ記事にアクセスできることになります。標準だとカノニカルURLにバグがあるので、プラグインをいれるのですが、それでもうまく行かないこともあります。
実在のメニュー名と実在の記事URLを組み合わせると、意図しないレイアウトで表示されてしまうこともあります。
その点、現在試しているJoomlaの拡張機能、FLEXIcontentはとっつきにくいですがほぼ満足行くレベルでまとまっていて良いです。

ソーシャルボタンでシェアされる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からサイトに来る人が多いのか、解析する方法もあります。
リダイレクトを使えばできるのですがあまりにも面倒なので、(有料ですが)専用のプラグインに頼ったほうが良さそうです。
コメント