PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.7
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.7
2.0.13 2.0.12 2.0.11 2.0.10 2.0.9 trunk 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8
blockenberg / blocks / related-posts / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.7, at blocks/related-posts/frontend.js

76 lines 3.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 ( function () {
2 /* Get current post ID and taxonomy data from body classes or JSON */
3 var bodyEl = document.body;
4 var postId = null;
5 var bodyClass = bodyEl.className || '';
6
7 /* Try to get postid from body class: "postid-123" */
8 var pidMatch = bodyClass.match(/postid-(\d+)/);
9 if ( pidMatch ) postId = parseInt( pidMatch[1], 10 );
10
11 document.querySelectorAll( '.bkrp-wrap' ).forEach( function ( wrap ) {
12 var grid = wrap.querySelector( '.bkrp-grid' );
13 if ( !grid || !postId ) return;
14
15 var relation = wrap.dataset.relation || 'category';
16 var count = parseInt( wrap.dataset.count, 10 ) || 3;
17 var showImage = wrap.dataset.showImage === '1';
18 var showExcerpt = wrap.dataset.showExcerpt === '1';
19 var showDate = wrap.dataset.showDate === '1';
20 var imageRatio = wrap.dataset.imageRatio || '16/9';
21
22 /* First get current post's terms */
23 var postUrl = '/wp-json/wp/v2/posts/' + postId;
24 fetch( postUrl )
25 .then( function (r) { return r.json(); } )
26 .then( function ( post ) {
27 var cats = post.categories || [];
28 var tags = post.tags || [];
29 var param = '';
30 if ( relation === 'category' && cats.length ) {
31 param = '&categories=' + cats.join(',');
32 } else if ( relation === 'tag' && tags.length ) {
33 param = '&tags=' + tags.join(',');
34 } else {
35 if ( cats.length ) param += '&categories=' + cats.join(',');
36 if ( tags.length ) param += '&tags=' + tags.join(',');
37 }
38 return fetch( '/wp-json/wp/v2/posts?per_page=' + ( count + 1 ) + '&_embed&exclude=' + postId + param );
39 } )
40 .then( function (r) { return r.json(); } )
41 .then( function ( posts ) {
42 if ( !posts || !posts.length ) { grid.innerHTML = '<p style="color:#9ca3af;font-size:.9em">No related posts found.</p>'; return; }
43 posts = posts.slice( 0, count );
44 grid.classList.remove( 'bkrp-loading' );
45 grid.innerHTML = '';
46 posts.forEach( function ( post ) {
47 var thumb = post._embedded && post._embedded['wp:featuredmedia'] && post._embedded['wp:featuredmedia'][0];
48 var thumbUrl = thumb && thumb.source_url ? thumb.source_url : '';
49 var date = post.date ? new Date( post.date ).toLocaleDateString() : '';
50 var excerpt = post.excerpt && post.excerpt.rendered ? post.excerpt.rendered.replace(/<[^>]+>/g,'') : '';
51 excerpt = excerpt.length > 100 ? excerpt.slice(0,100) + '' : excerpt;
52
53 var a = document.createElement( 'a' );
54 a.className = 'bkrp-card';
55 a.href = post.link;
56 var html = '';
57 if ( showImage ) {
58 html += '<div class="bkrp-img-wrap" style="aspect-ratio:' + imageRatio + '">' +
59 ( thumbUrl ? '<img src="' + thumbUrl + '" alt="' + post.title.rendered + '" loading="lazy" />' : '' ) +
60 '</div>';
61 }
62 html += '<div class="bkrp-body">';
63 if ( showDate ) html += '<div class="bkrp-date">' + date + '</div>';
64 html += '<div class="bkrp-title">' + post.title.rendered + '</div>';
65 if ( showExcerpt && excerpt ) html += '<p class="bkrp-excerpt">' + excerpt + '</p>';
66 html += '</div>';
67 a.innerHTML = html;
68 grid.appendChild( a );
69 } );
70 } )
71 .catch( function () {
72 grid.innerHTML = '<p style="color:#9ca3af;font-size:.9em">Unable to load related posts.</p>';
73 } );
74 } );
75 } )();
76