ブログ一覧表示を更新日基準でソートしたい

ブログ一覧表示において、表示順序を「新しい記事順」「古い記事順」とする基準を投稿日ではなく、更新日とする方法をアドバイスいただけないでしょうか。

ちなみに、トップページに表示させているポストリストでは、

<?php $this->BcBaser->blogPosts('news', 5, array('sort'=>'modified')); ?>

とすることで、表示順を更新日基準とすることができました。

以上、よろしくお願いいたします。

1 Like

@GUSSAN 残念ながらブログ一覧で簡単に並び順を変更する方法がありません。
ちょっと難易度が高いかもしれませんが、プラグインで対応する方法を書きますね。

CustomPlugin という名称のプラグインを作成する前提で、下記のファイルを作成します。
/app/Plugin/CustomPlugin/Event/CustomPluginModelEventListener.php

<?php
class CustomPluginModelEventListener extends BcModelEventListener {
	public $events = ['Blog.BlogPost.beforeFind'];
	public function blogBlogPostBeforeFind(CakeEvent $event) {
		if(!$this->getAction('Blog.index')) {
			return;
		}
		$event->data[0]['order'] = ['BlogPost.modified'];
	}
}

管理画面のプラグイン管理より、プラグインを有効化します。

1 Like

ryuringさん、ご回答ありがとうございます。
アドバイス頂いた形でプラグインとして実装したところ、更新日基準で「古い記事順」のソート表示ができました。
もし、「新しい記事順」や特定のブログのみに適用するなど、CustomPluginModelEventListener.phpに追記、修正することで、比較的簡単に実装可能であればアドバイス頂けると嬉しいです。
よろしくお願いいたします。

次のコードでどうでしょ? @GUSSAN

■ 新しい記事順

$event->data[0]['order'] = ['BlogPost.posts_date DESC'];

■ 特定のブログの判定

$request = Router::getRequest();
if($request->params['entityId'] === '1'){

}
1 Like

ryuringさん、
ありがとうございます。
新しい記事順は、以下のコードで問題なく表示できました。

$event->data[0]['order'] = ['BlogPost.modified DESC'];

特定ブログの判定は、上手く実装できず、指定ID以外のブログも反応してしまいますが、あれこれやってみたいと思います!

こんな感じで書く感じっす

	public function blogBlogPostBeforeFind(CakeEvent $event) {
		if(!$this->getAction('Blog.index')) {
			return;
		}
		$request = Router::getRequest();
		if($request->params['entityId'] === '1'){
			$event->data[0]['order'] = ['BlogPost.modified'];
		}
	}

こちらでは動作しました。

entityId は、ブログ設定画面の「実体ID」となります。

1 Like

ryuringさん、コードありがとうございます!
実は、頂いたものとニアリーで何度もテストしていたのですが、管理画面(admin-second)上の記事一覧ばかりに注目していて、実際の出力をきちんと見ていませんでした。
ひとつ気がついたのですが、実は、使用しているサイトは、TOPページに複数のブログのPost一覧が個別に設置されているのですが、更新日ソートをしていないブログのPost一覧も、更新日ソートされた形で表示されていたりします。
ひとまず、たいへん勉強になりました!

そうなんですね。では、画面で判断するでなく、クエリ内容で判断した方がよさそうですね。

$event->data[0]var_dump($event->data[0]); などとしてダンプして頂けると分かると思いますが、
$event->data[0]['conditions'] に、ブログコンテンツIDが検索条件として入っているかと思います。それを判断材料としてもいいかもしれませんね。

1 Like

ryuringさん、ありがとうございます。

ダンプデータから、 ["BlogPost.blog_content_id"]=> string(1) "1"この辺りかと思い、

if($request->params['BlogPost.blog_content_id'] === '1'){
$event->data[0]['order'] = ['BlogPost.modified DESC'];
}

としてみましたが判定しませんでした。

■ ダンプデータ
array(17) { ["conditions"]=> array(4) { ["BlogPost.blog_content_id"]=> string(1) "1" ["BlogPost.status"]=> bool(true) [0]=> array(1) { ["or"]=> array(3) { [0]=> array(1) { ["BlogPost.publish_begin <="]=> string(19) "2020-06-04 19:39:33" } [1]=> array(1) { ["BlogPost.publish_begin"]=> NULL } [2]=> array(1) { ["BlogPost.publish_begin"]=> string(19) "0000-00-00 00:00:00" } } } [1]=> array(1) { ["or"]=> array(3) { [0]=> array(1) { ["BlogPost.publish_end >="]=> string(19) "2020-06-04 19:39:33" } [1]=> array(1) { ["BlogPost.publish_end"]=> NULL } [2]=> array(1) { ["BlogPost.publish_end"]=> string(19) "0000-00-00 00:00:00" } } } } ["listCount"]=> NULL ["limit"]=> int(10) ["page"]=> int(1) ["postId"]=> NULL ["recursive"]=> int(2) ["cache"]=> bool(false) ["fields"]=> NULL ["joins"]=> array(0) { } ["offset"]=> NULL ["order"]=> array(1) { [0]=> string(42) "BlogPost.posts_date DESC, BlogPost.id DESC" } ["group"]=> NULL ["callbacks"]=> bool(true) ["maxLimit"]=> int(100) ["paramType"]=> string(5) "named" ["queryScope"]=> NULL ["type"]=> string(12) "customParams" }