ブログウィジェットの「ブログタグ一覧」の記事数表示の挙動について

【環境情報】
・baserCMSのバージョン:4.4.2
・レンタルサーバー名:ローカルPC(Windows10)上のXAMPP 7.4.11
・使用テーマ:自作テーマ、admin-third(ときどきadmin-second)
・使用プラグイン:Stop the Bokettch for baserCMS、スケジュールプラグイン、CuCustomField
・PHPスキル(自己評価):Dくらい?

いつもお世話になっております。
ヒント、回答等、なにかいただければ幸いです。

ブログウィジェットに「ブログタグ一覧」があります。
あれこれ調べてみましたが、以下の挙動が仕様なのかバグなのか判別つけられなかったため、
ひとまず仕様として質問させていただくものです。
よろしくお願いいたします。

ブログタグ一覧の設定項目に
・記事数表示(する・しない)
・ブログ(指定しない・ブログを一つ指定)
があります。

二つのブログ(NEWS、サービス4)と、「新製品」「おすすめ」というタグを用意して、
NEWSに「新製品」のタグをつけた記事を1件、
サービス4に「新製品」のタグをつけた記事を1件と、「おすすめ」のタグをつけた記事を1件
それぞれ準備します。
そしてブログタグ一覧を二つ用意します。
ひとつは「記事数表示する」、ブログ「NEWS」指定、
もうひとつは「記事数表示する」、ブログ「サービス4」指定とします。

そしてフロント画面で表示した結果が以下です。
キャプチャ

表示されているタグは想定通り(NEWS:新製品、サービス4:おすすめと新製品)ですが、
記事数がふたつのブログを足したもの(新製品 (2))になってしまいます。

上のリンクを押すと、NEWSの新製品が1件表示され、
下のリンクを押すと、サービス4の新製品が1件表示されるので、
記事数の数字と遷移先の記事数が合っていません。

できれば記事数も指定したブログ内だけでカウントして、「新製品 (1)」と表示されてほしいのですが
何か対応方法などありますでしょうか?

すみません、自己解決できました。

lib\Baser\Plugin\Blog\View\Helper\BlogHelper.php にある
_mergePostCountToTagsData() でタグ毎の公開記事数のカウントを行っているのですが、
特にブログを指定するような処理はありませんでした。
(そもそもブログのIDすら持っていない様子)

そこで、ブログのIDを指定してカウントできるようにするため、
同ファイルを使用テーマ下にコピーし、以下の変更を行いました。

1)_mergePostCountToTagsData() にブログのIDが渡るように、呼び元も併せて変更
(ブログのIDは$options[‘contentId’]に入っているので、それを渡すようにしました)

2)_mergePostCountToTagsData() 内で $conditions = array_merge(… という記述があるので、
その下に以下のコードを追加

if (!empty(【ブログのID】)) {
	$conditions = array_merge(
		$conditions,
		['BlogPost.blog_content_id' => 【ブログのID】],
	);
}

これで、ブログを指定している時は指定されたブログのみでカウントできるようになりました。
(ブログを指定していない時は今までどおりの動きです)
無事に希望していた動きを実現することができました。

自力で修正してみましたが、指定ブログで絞り込みができないのはバグのように思えます。。。

とは言え、解決はしたので、解決済みに設定します。

mayiaさん

管理画面でも

  • カテゴリー一覧のURL
    /admin/blog/blog_categories/index/{blog_content_id}
  • タグ一覧のURL
    /admin/blog/blog_tags/

となっているので、もともとブログごとにタグを分けるという設計でなかったのかもしれないですね。GitHub の Issue に投稿してコアに実装してもらう方向もありかと思います。

ご参考までに、私の方ではこんなコード考えてました。

/lib/Baser/Plugin/Blog/View/Helper/BlogHelper.php

getTagList メソッド

if ($options['postCount']) {

- 	$tags = $this->_mergePostCountToTagsData($tags);
+ 	$tags = $this->_mergePostCountToTagsData($tags, $options);

}

_mergePostCountToTagsData メソッド

- private function _mergePostCountToTagsData(array $tags) {
+ private function _mergePostCountToTagsData(array $tags, $options) {

	/** @var BlogPost $BlogPost */
	$BlogPost = ClassRegistry::init('Blog.BlogPost');
	$blogTagIds = Hash::extract($tags, "{n}.BlogTag.id");
	$conditions = array_merge(
		['BlogTag.id' => $blogTagIds],
		$BlogPost->getConditionAllowPublish()
	);

+ 	if (!empty($options['contentId'][0])) {
+ 		$conditions[] = ['BlogPost.blog_content_id=' . $options{'contentId'}{0}];
+ 	}
1 Likes

tecking さま

参考コードをありがとうございます!
とても勉強になりました。
今後の拡張の可能性を考えたら、$optionsは丸ごと渡してしまったほうがいいですね。

あとから気づいたのですが、本気できっちり対応しようと思ったら
contentIdだけでなくcontentUrlも必要でした。

せっかくのご提案ですが、GitHubは使い方がよくわかっていないので
今回はフォーラムの改善要望に挙げてみたいと思います。

いつかGitHubも使いこなせるようになりたいです。

1 Likes