@@ -79,6 +79,7 @@ const { type } = props;
7979let post: CollectionEntry <" blog" > | undefined ;
8080let Content: AstroComponentFactory | undefined ;
8181let relatedPostsToShow: CollectionEntry <" blog" >[] = [];
82+ let latestPosts: CollectionEntry <" blog" >[] = [];
8283let url: URL | undefined ;
8384
8485// Variables for Tag View
@@ -93,9 +94,26 @@ if (type === "post") {
9394
9495 // Get related posts
9596 const allPosts = await getCollection (" blog" );
97+ const currentTags = post ! .data .tags || [];
98+
9699 const relatedPosts = allPosts
97100 .filter ((p ) => p .slug !== post ! .slug )
98- .filter ((p ) => p .data .tags ?.some ((t ) => post ! .data .tags ?.includes (t )));
101+ .map ((p ) => {
102+ const commonTags =
103+ p .data .tags ?.filter ((t ) => currentTags .includes (t )) || [];
104+ return {
105+ post: p ,
106+ score: commonTags .length ,
107+ };
108+ })
109+ .filter ((item ) => item .score > 0 )
110+ .sort ((a , b ) => {
111+ if (b .score !== a .score ) return b .score - a .score ; // Higher score first
112+ return (
113+ b .post .data .pubDate .valueOf () - a .post .data .pubDate .valueOf ()
114+ ); // Newer first
115+ })
116+ .map ((item ) => item .post );
99117
100118 // Get up to 4 related posts
101119 relatedPostsToShow = relatedPosts .slice (0 , 4 );
@@ -107,6 +125,12 @@ if (type === "post") {
107125 .slice (0 , 4 - relatedPostsToShow .length );
108126 relatedPostsToShow = [... relatedPostsToShow , ... morePosts ];
109127 }
128+
129+ // Get latest posts (excluding current and related)
130+ latestPosts = allPosts
131+ .filter ((p ) => p .slug !== post ! .slug && ! relatedPostsToShow .includes (p ))
132+ .sort ((a , b ) => b .data .pubDate .valueOf () - a .data .pubDate .valueOf ())
133+ .slice (0 , 4 );
110134} else {
111135 tag = props .tag ;
112136 tagPosts = props .posts ;
@@ -225,6 +249,35 @@ const components = {
225249 </div >
226250 )}
227251
252+ { latestPosts .length > 0 && (
253+ <div class = " related-post-container" >
254+ <h3 class = " related-heading" >Latest Blogs</h3 >
255+ <div class = " related-grid" >
256+ { latestPosts .map ((latestPost ) => (
257+ <a
258+ href = { ` /blog/${latestPost .slug } ` }
259+ class = " related-card"
260+ >
261+ { latestPost .data .image && (
262+ <div class = " related-image-wrapper" >
263+ <OptimizedImage
264+ src = { latestPost .data .image }
265+ alt = { latestPost .data .title }
266+ class = " related-image"
267+ />
268+ </div >
269+ )}
270+ <div class = " related-content" >
271+ <h4 class = " related-title" >
272+ { latestPost .data .title }
273+ </h4 >
274+ </div >
275+ </a >
276+ ))}
277+ </div >
278+ </div >
279+ )}
280+
228281 <MultiplexAd />
229282 </article >
230283 </Layout >
0 commit comments