Developers: Introduced 6 filter hooks and 3 action hooks for extending the plugin without forking. See docs/hooks.md inside the plugin folder for full documentation and examples.
Developers: New filter bbfsync_field_sets lets you customize which Graph API fields are requested in each fallback variant.
Developers: New filter bbfsync_posts_after_fetch lets you modify the result array (posts + cursor) before it is written to cache.
Developers: New filter bbfsync_cache_duration lets you override the per-request cache TTL.
Developers: New filter bbfsync_post_data lets you modify a single post’s data before any rendering happens.
Developers: New filter bbfsync_post_html lets you wrap, augment, or replace per-post markup. Fires on both initial render and AJAX Load More.
Developers: New filter bbfsync_feed_html gives you the final feed HTML before it is returned from render().
Developers: New action bbfsync_before_api_fetch fires before each Graph API call.
Developers: New action bbfsync_after_api_fetch fires after a successful fetch is cached — useful for cache busting and notifications.
Developers: New action bbfsync_cache_flushed fires after BBFSYNC_Cache::flush() completes.
Developers: New FAQ entry “Can I extend the plugin from my theme or another plugin?” pointing at the hooks documentation.
i18n: The “%s ago” relative-time format on post timestamps is now admin-customizable from Components > Post Labels, alongside the other label customizations. The %s placeholder is replaced with a human-readable duration; if the placeholder is removed by mistake, the format falls back to the translated default.
No user-visible behavior change unless you customize the new label — the plugin renders identically to 3.9.33 by default.
3.9.33
Performance: Upgraded resource hint for scontent.xx.fbcdn.net from dns-prefetch to preconnect on pages that use the plugin. Preconnect performs the full TCP and TLS handshake ahead of time (not just the DNS lookup), saving an additional ~50-150ms on first thumbnail load. Browser support is universal since 2018.
Performance: Removed the resource hint for graph.facebook.com — the Graph API is called server-side only, so the visitor’s browser never connects to it directly. Under dns-prefetch this was a tiny cost; under preconnect it would tie up a connection slot that nothing uses.
3.9.32
Accessibility: Lightbox now exposes proper dialog semantics — role=”dialog”, aria-modal, aria-label, and a screen-reader hint describing the keyboard shortcuts (Escape, arrow keys)
Accessibility: Lightbox close, previous, and next buttons now have explicit aria-label attributes
Accessibility: Honors prefers-reduced-motion — animations, transitions and smooth-scroll are disabled inside plugin elements when the visitor’s OS requests reduced motion (WCAG 2.3.3)
Accessibility: Added :focus-visible outlines for keyboard users on feed links/buttons, lightbox controls, carousel arrows, and the Load More button
Performance: Added explicit width and height attributes to author avatars and YouTube thumbnails so browsers reserve layout space before the image loads (improves Cumulative Layout Shift)
Performance: Added DNS-prefetch hints for graph.facebook.com and scontent.xx.fbcdn.net on pages that use the plugin, shaving the connection setup off the first interaction
Privacy: Privacy policy content now also discloses that profile pictures, cover photos, and post images are loaded directly from Facebook’s CDN (scontent.xx.fbcdn.net) on every page render
Security: AJAX load_more error responses no longer leak Graph API error details to anonymous visitors — admins still see the full error for debugging
Improved: BBFSYNC_VERSION constant now reads dynamically from the plugin header via get_file_data() — single source of truth, eliminates version drift
Improved: Build script now auto-syncs block.json and index.asset.php version metadata from the plugin header at build time
Cleanup: Removed stale “Facebook SDK (JavaScript)” entry from readme.txt Third-Party Services — the SDK was removed in 3.9.23 but the disclosure was left behind
3.9.31
Improved: Full internationalization audit — all frontend labels now admin-customizable from Components > Labels & Text
Improved: Added “See more”, “View on Facebook”, “Share”, “No more posts”, and “Error” as customizable post labels
Improved: All setting defaults wrapped in translation functions for proper localization on fresh installs
Improved: Proper plural support for “follower/followers” using _n()
Fixed: 12 placeholder attributes in admin panel now properly translatable
Improved: Setup guide Step 5 now uses direct Page ID URL instead of /me/accounts for more reliable token retrieval
Improved: Added troubleshooting tip for “Error validating client secret” in Step 4
Fixed: Header followers label now uses the customizable “Followers label” setting from Components tab
3.9.26
Improved: Simplified “Find your Page ID” step — now uses Graph API Explorer for quick lookup
3.9.25
Improved: Setup guide now correctly explains the 3-step token process (short-lived → long-lived User → permanent Page)
Improved: Added link to Access Token Debugger for verifying token permanence
Improved: Each setup step links to the exact tool or page where it is performed
3.9.24
Removed debug HTML comment from follow card output
Fixed double-escaping in follow card CSS class builder
Fixed stale version fallback in block asset file
3.9.23
New: Like Box replaced with custom follow card — no longer depends on Facebook’s deprecated Page Plugin SDK
The follow card uses Graph API data (avatar, page name, follower count) and renders reliably at all sizes
Cover photo shown in Large mode, all existing settings (position, size, display mode, width) still apply
Removed Facebook JS SDK dependency — one fewer external script loaded on the frontend
3.9.22
Fixed: Lightbox prev/next navigation arrows now visible on text-only posts
Fixed: Text-only lightbox no longer stretches to full viewport height — shrinks to fit content on all screen sizes
3.9.21
New: Infinite lightbox browsing — next batch of posts loads automatically when you reach the last post
New: Text-only posts display in a clean full-width lightbox layout instead of an empty black media panel
New: Customisable Mute, Unmute, and Fullscreen button labels in Features → Labels & Text
Fixed: Per-feed CSS scoping — multiple feeds with different custom colours on the same page no longer conflict
Fixed: Reset palette defaults now match the settings defaults exactly
Fixed: Version consistency across .pot file and all plugin surfaces
Changed: README.md excluded from distribution zip
3.9.20
Fixed: Page name now displays correctly when entered manually in text header mode
Fixed: Bio display logic made consistent across all header styles
Fixed: Lightbox now renders above sticky headers and page builder containers
Improved: Facebook Graph API version centralised as a single constant for easier updates
Improved: API retry logic now logs failures and successes when WP_DEBUG_LOG is enabled
Improved: Dark color scheme error message styling
Changed: Legacy migration now runs only on plugin activation instead of every page load
3.9.18
New: Like Box display mode setting — Always visible or Reveal on scroll
Reveal on scroll: Like Box is hidden initially and fades in when the user scrolls near the bottom of the feed
Display mode option only shown when Like Box position is set to Bottom
Admin UI shows contextual description for each display mode
3.9.17
Improved: Load More button now meets WCAG AAA touch target (44px minimum height)
Improved: Button has larger padding, font size, and subtle shadow for better visibility
Changed: Like Box and Load More button no longer share the same footer bar — Like Box renders independently above the sticky Load More bar for clearer visual separation
3.9.16
Fixed: Video playback now works on iPad and mobile devices
Touch devices open lightbox for video instead of broken inline embed
All Facebook videos (landscape + portrait) show play button on touch devices
Safari/WebKit: Facebook videos open directly on Facebook (iOS ITP workaround)
Customizable Safari video hint text in admin settings
Stale-cache fallback: feed remains visible when API is temporarily unavailable
“Last successful fetch” timestamp shown in admin cache settings
3.7.2
Carousel video no longer cropped by 220px height limit — shows full frame in natural proportions
Portrait and landscape videos both display uncropped in carousel
3.7.1
Video thumbnails now display full frame without cropping (object-fit: contain)
Removed fixed height constraint on carousel video — shows natural proportions
Container dimensions locked from thumbnail before iframe replacement
3.7.0
One-click video playback on all browsers — autoplay with mute for reliable instant play
Facebook video in lightbox now fills entire media area for immersive viewing
Applies to both feed/carousel and lightbox video embeds
3.6.3
Lightbox video loads iframe directly (no thumbnail step) — eliminates double-click on mobile
Portrait video in lightbox now centered horizontally instead of left-aligned
Removed “Watch on Facebook” overlay from lightbox video embeds
3.6.1
Tightened gallery gap from 4px to 2px for cleaner, more professional image grids