{"id":290191,"date":"2026-03-20T16:25:33","date_gmt":"2026-03-20T16:25:33","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/bluebook-feed-sync\/"},"modified":"2026-04-12T21:32:27","modified_gmt":"2026-04-12T21:32:27","slug":"bluebook-feed-sync","status":"publish","type":"plugin","link":"https:\/\/frp.wordpress.org\/plugins\/bluebook-feed-sync\/","author":23453481,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"3.12.16","stable_tag":"3.12.16","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"BlueBook Feed Sync","header_author":"SDAweb - Rune Stake Stavdal, Vinjar Romsvik, Christer Andvik","header_description":"Display a customizable social page feed on your WordPress site with multiple layouts, color schemes, header options, like box, lightbox, and more.","assets_banners_color":"1e3fb7","last_updated":"2026-04-12 21:32:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/sdaweb.no","rating":0,"author_block_rating":0,"active_installs":60,"downloads":816,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"3.10.0":{"tag":"3.10.0","author":"rstake","date":"2026-04-11 23:57:13"},"3.11.0":{"tag":"3.11.0","author":"rstake","date":"2026-04-12 11:42:38"},"3.12.16":{"tag":"3.12.16","author":"rstake","date":"2026-04-12 21:32:27"},"3.9.16":{"tag":"3.9.16","author":"rstake","date":"2026-03-20 22:00:40"},"3.9.17":{"tag":"3.9.17","author":"rstake","date":"2026-03-30 10:27:07"},"3.9.18":{"tag":"3.9.18","author":"rstake","date":"2026-03-30 11:16:02"},"3.9.19":{"tag":"3.9.19","author":"rstake","date":"2026-03-30 17:26:14"},"3.9.20":{"tag":"3.9.20","author":"rstake","date":"2026-03-30 21:31:44"},"3.9.21":{"tag":"3.9.21","author":"rstake","date":"2026-04-02 09:24:39"},"3.9.22":{"tag":"3.9.22","author":"rstake","date":"2026-04-02 10:07:03"},"3.9.24":{"tag":"3.9.24","author":"rstake","date":"2026-04-02 12:56:47"},"3.9.25":{"tag":"3.9.25","author":"rstake","date":"2026-04-02 13:04:56"},"3.9.26":{"tag":"3.9.26","author":"rstake","date":"2026-04-02 14:01:17"},"3.9.27":{"tag":"3.9.27","author":"rstake","date":"2026-04-02 15:18:48"},"3.9.28":{"tag":"3.9.28","author":"rstake","date":"2026-04-02 21:23:16"},"3.9.29":{"tag":"3.9.29","author":"rstake","date":"2026-04-03 17:00:52"},"3.9.30":{"tag":"3.9.30","author":"rstake","date":"2026-04-03 21:08:08"},"3.9.31":{"tag":"3.9.31","author":"rstake","date":"2026-04-04 21:38:27"},"3.9.32":{"tag":"3.9.32","author":"rstake","date":"2026-04-11 21:06:26"},"3.9.33":{"tag":"3.9.33","author":"rstake","date":"2026-04-11 22:27:54"}},"upgrade_notice":{"3.4.0":"<p>Major admin panel redesign with improved navigation, client-side tab switching, accordion sections, and card-based feature toggles. All existing settings preserved.<\/p>","3.3.0":"<p>Fixes Facebook video playback, adds feed export\/import, and header text color option.<\/p>","3.2.0":"<p>Security improvements and mobile experience enhancements. Recommended update for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3487495,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3487495,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3487495,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3487495,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":{"bluebook-feed-sync\/feed":{"apiVersion":3,"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","name":"bluebook-feed-sync\/feed","version":"3.10.0","title":"BlueBook Feed","category":"widgets","icon":"share","description":"Display a customizable social page feed.","textdomain":"bluebook-feed-sync","editorScript":"bbfsync-block-editor","render":"file:.\/render.php","supports":{"html":false,"align":["wide","full"],"multiple":true},"attributes":{"feedId":{"type":"integer","default":1},"layout":{"type":"string","default":"list"},"colorScheme":{"type":"string","default":"inherit"},"postsDesktop":{"type":"integer","default":9},"postsMobile":{"type":"integer","default":6},"columnsDesktop":{"type":"integer","default":3},"columnsTablet":{"type":"integer","default":2},"columnsMobile":{"type":"integer","default":1},"textClampEnabled":{"type":"boolean","default":true},"textLinesGrid":{"type":"integer","default":14}}}},"tagged_versions":["3.10.0","3.11.0","3.12.16","3.9.16","3.9.17","3.9.18","3.9.19","3.9.20","3.9.21","3.9.22","3.9.24","3.9.25","3.9.26","3.9.27","3.9.28","3.9.29","3.9.30","3.9.31","3.9.32","3.9.33"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Admin settings \u2014 Connect tab with credential masking and connection status banner","2":"Admin settings \u2014 Layout tab with visual layout picker","3":"Admin settings \u2014 Style tab with colour scheme and header options","4":"Feed display \u2014 List layout with lightbox","5":"Feed display \u2014 Carousel layout"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[191549,258222,2877,154,258223],"plugin_category":[],"plugin_contributors":[257114,256141],"plugin_business_model":[],"class_list":["post-290191","plugin","type-plugin","status-publish","hentry","plugin_tags-feed-widget","plugin_tags-page-feed","plugin_tags-social-feed","plugin_tags-social-media","plugin_tags-social-sync","plugin_contributors-rstake","plugin_contributors-sdaweb","plugin_committers-rstake"],"banners":{"banner":"https:\/\/ps.w.org\/bluebook-feed-sync\/assets\/banner-772x250.png?rev=3487495","banner_2x":"https:\/\/ps.w.org\/bluebook-feed-sync\/assets\/banner-1544x500.png?rev=3487495","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/bluebook-feed-sync\/assets\/icon-128x128.png?rev=3487495","icon_2x":"https:\/\/ps.w.org\/bluebook-feed-sync\/assets\/icon-256x256.png?rev=3487495","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>BlueBook Feed Sync is a professional WordPress plugin that displays your social page feed with multiple layouts, full customization, multi-feed management, and an interactive lightbox. Easy setup, fully customizable, and lightweight. Multiple layouts, interactive lightbox, video support, and multi-feed management.<\/p>\n\n<h4>Multi-Feed Manager<\/h4>\n\n<p>Create unlimited feeds, each with their own settings. Perfect for sites that need different feeds on different pages.<\/p>\n\n<ul>\n<li>Feed selector dropdown to switch between feeds<\/li>\n<li>Create, duplicate, rename, and delete feeds<\/li>\n<li>New feeds automatically inherit connection settings from the primary feed<\/li>\n<li>Per-feed shortcodes with unique ID<\/li>\n<li>Override any setting directly in the shortcode<\/li>\n<\/ul>\n\n<h4>Layouts<\/h4>\n\n<ul>\n<li><strong>List<\/strong> \u2014 Single-column vertical feed (max-width 960px)<\/li>\n<li><strong>Masonry<\/strong> \u2014 Pinterest-style multi-column grid<\/li>\n<li><strong>Carousel<\/strong> \u2014 Multi-card horizontal slider with snap-based swipe navigation, dot indicators, and arrow buttons<\/li>\n<li><strong>Boxed<\/strong> \u2014 Clean CSS Grid layout with subtle borders<\/li>\n<\/ul>\n\n<h4>Header Styles<\/h4>\n\n<p><strong>Visual Header<\/strong> with 4 layout presets: Classic, Compact, Banner, and Clean.<\/p>\n\n<p><strong>Text Header<\/strong> with Facebook icon and custom text.<\/p>\n\n<p>Both header types support custom backgrounds (theme, solid color, gradient, transparent), page name override, show bio toggle, and bio\/description override.<\/p>\n\n<h4>Lightbox<\/h4>\n\n<p>All posts open in a split-layout lightbox with full-size image or inline video, post text, author info, engagement stats, thumbnail strip for multi-photo galleries, arrow and swipe navigation, and keyboard support. Infinite scroll \u2014 when you reach the last loaded post, the next batch loads automatically so you can keep browsing without leaving the lightbox. Text-only posts display in a clean full-width layout instead of a split view.<\/p>\n\n<h4>Video Support<\/h4>\n\n<ul>\n<li><strong>YouTube<\/strong> \u2014 Auto-detected from shared links with privacy-enhanced embedding<\/li>\n<li><strong>Facebook Videos<\/strong> \u2014 Thumbnail with play button, embedded via Facebook plugin<\/li>\n<\/ul>\n\n<h4>Color System<\/h4>\n\n<p>Three built-in schemes (Inherit, Light, Dark) plus a full custom palette with 9 individually configurable colors.<\/p>\n\n<h3>Third-Party Services<\/h3>\n\n<p>This plugin connects to external services to retrieve and display social media content. No data is sent without your explicit configuration.<\/p>\n\n<h4>Facebook Graph API<\/h4>\n\n<p>Used to fetch page posts, page info (name, bio, avatar, cover photo), and to verify your access token.<\/p>\n\n<ul>\n<li>Service: Meta Platforms, Inc.<\/li>\n<li>Website: <a href=\"https:\/\/developers.facebook.com\/\">https:\/\/developers.facebook.com\/<\/a><\/li>\n<li>Terms of Service: <a href=\"https:\/\/developers.facebook.com\/terms\/\">https:\/\/developers.facebook.com\/terms\/<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/www.facebook.com\/privacy\/policy\/\">https:\/\/www.facebook.com\/privacy\/policy\/<\/a><\/li>\n<\/ul>\n\n<p>Data sent: your Facebook Page ID and Page Access Token. Requests are made server-side when the feed cache expires or when you click \"Verify Connection\" in the admin panel.<\/p>\n\n<h4>Facebook CDN (Image Hosting)<\/h4>\n\n<p>Profile pictures, cover photos, and post images are loaded directly from Facebook's image servers (scontent.xx.fbcdn.net) when a page containing the feed is rendered. This means Meta can see the visitor's IP address as soon as the page loads, before any interaction.<\/p>\n\n<ul>\n<li>Service: Meta Platforms, Inc.<\/li>\n<li>Privacy Policy: <a href=\"https:\/\/www.facebook.com\/privacy\/policy\/\">https:\/\/www.facebook.com\/privacy\/policy\/<\/a><\/li>\n<\/ul>\n\n<h4>Facebook Video Embed<\/h4>\n\n<p>When a visitor clicks play on a Facebook video, the video is embedded via an iframe from Facebook's servers.<\/p>\n\n<ul>\n<li>Service: Meta Platforms, Inc.<\/li>\n<li>Embed URL: https:\/\/www.facebook.com\/plugins\/video.php<\/li>\n<li>Terms of Service: <a href=\"https:\/\/developers.facebook.com\/terms\/\">https:\/\/developers.facebook.com\/terms\/<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/www.facebook.com\/privacy\/policy\/\">https:\/\/www.facebook.com\/privacy\/policy\/<\/a><\/li>\n<\/ul>\n\n<h4>YouTube<\/h4>\n\n<p>When your Facebook posts contain YouTube links, the plugin loads the YouTube iframe API to enable inline video playback and fetches thumbnail images from YouTube's servers.<\/p>\n\n<ul>\n<li>Service: Google LLC<\/li>\n<li>Website: <a href=\"https:\/\/www.youtube.com\/\">https:\/\/www.youtube.com\/<\/a><\/li>\n<li>Terms of Service: <a href=\"https:\/\/www.youtube.com\/t\/terms\">https:\/\/www.youtube.com\/t\/terms<\/a><\/li>\n<li>Privacy Policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<p>The YouTube iframe API script (https:\/\/www.youtube.com\/iframe_api) is loaded on pages that display the feed. Thumbnail images are fetched from https:\/\/img.youtube.com\/. Video embeds use the privacy-enhanced domain https:\/\/www.youtube-nocookie.com\/.<\/p>\n\n<h4>Open Graph Image Recovery<\/h4>\n\n<p>When a shared post has no image from the Graph API, the plugin makes a single server-side HTTP request to the post's permalink or link target URL to extract the Open Graph (og:image) meta tag. This request is made from your web server, not from the visitor's browser. The recovered image URL is cached for one hour.<\/p>\n\n<ul>\n<li>This may connect to any website linked in a shared post (e.g., facebook.com, youtube.com, or any external URL shared on the page)<\/li>\n<li>Data sent: a standard HTTP GET request with a User-Agent header<\/li>\n<li>No visitor data is transmitted \u2014 the request originates from the server only<\/li>\n<li>Privacy policies of the target websites apply to their handling of these requests<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Download <code>bluebook-feed-sync.zip<\/code>.<\/li>\n<li>In WordPress admin, go to <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>.<\/li>\n<li>Upload the zip file and click <strong>Install Now<\/strong>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>BlueBook Feed<\/strong> in the admin menu to configure your connection.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20get%20a%20facebook%20access%20token%3F\"><h3>How do I get a Facebook Access Token?<\/h3><\/dt>\n<dd><p>You need to create a Meta (Facebook) App at developers.facebook.com, then use the Graph API Explorer to generate a Page Access Token. See the full guide in the plugin's admin page or the included README.md.<\/p><\/dd>\n<dt id=\"can%20i%20display%20multiple%20feeds%20on%20the%20same%20site%3F\"><h3>Can I display multiple feeds on the same site?<\/h3><\/dt>\n<dd><p>Yes. Use the Multi-Feed Manager to create additional feeds, each with their own settings. Display them using the shortcode with an ID parameter, e.g. <code>[bbfsync_feed id=\"2\"]<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20override%20settings%20in%20the%20shortcode%3F\"><h3>Can I override settings in the shortcode?<\/h3><\/dt>\n<dd><p>Yes. Any setting key can be used as a shortcode attribute, e.g. <code>[bbfsync_feed layout=\"carousel\" posts_desktop=\"6\" color_scheme=\"dark\"]<\/code>.<\/p><\/dd>\n<dt id=\"how%20does%20caching%20work%3F\"><h3>How does caching work?<\/h3><\/dt>\n<dd><p>The plugin caches API responses to minimize Facebook API calls. You can clear the cache from the Connect tab in the plugin settings (under \"Advanced\"). The minimum cache duration is 15 minutes.<\/p><\/dd>\n<dt id=\"can%20i%20extend%20the%20plugin%20from%20my%20theme%20or%20another%20plugin%3F\"><h3>Can I extend the plugin from my theme or another plugin?<\/h3><\/dt>\n<dd><p>Yes. As of 3.10.0 the plugin exposes 9 documented WordPress filter and action hooks covering Graph API field selection, post data and HTML rendering, cache duration, and lifecycle events. Full documentation with copy-paste examples lives in <code>docs\/hooks.md<\/code> inside the plugin folder. Examples include: filtering posts by date before caching, adding badges to posts containing specific hashtags, busting your page cache when the feed refreshes, and overriding the Graph API field set. All hooks are stable within the 3.x major version.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.12.16<\/h4>\n\n<ul>\n<li>New: Controls Style setting \u2014 choose between iOS (liquid glass) and Classic button styles for lightbox navigation, close buttons, and video play overlays. iOS is the default.<\/li>\n<li>New: Lightbox buttons (prev, next, close) now use SVG stroke icons instead of text characters for crisp rendering at all sizes.<\/li>\n<li>New: iOS liquid glass buttons use layered glassmorphism with SVG turbulence distortion filter, specular highlights, and backdrop-filter blur.<\/li>\n<li>Improved: Lightbox buttons repositioned outside the modal content area for cleaner layout \u2014 prev on the left, next and close on the right of the full-screen overlay.<\/li>\n<li>Improved: Buttons fade in on hover (desktop) and are always visible on touch devices.<\/li>\n<li>Accessibility: Added aria-hidden=\"true\" to decorative SVG icons inside buttons that already have aria-label.<\/li>\n<li>Accessibility: Glass-layer DOM elements only render when iOS style is active, avoiding unnecessary markup in Classic mode.<\/li>\n<li>Code: New play_button_style setting with enum validation (ios\/classic), registered in Components tab group. Also available as shortcode attribute.<\/li>\n<\/ul>\n\n<h4>3.11.0<\/h4>\n\n<ul>\n<li>New: Smart Share Cards \u2014 shared posts that previously appeared as plain text-only cards now display with a visually distinct link-preview style. Three-tier fallback: (1) recovered OG image with title\/description, (2) styled metadata card with share icon, (3) minimal dashed-border CTA linking to Facebook.<\/li>\n<li>New: OG image recovery \u2014 when the Graph API cannot serve media for shared\/cross-page posts, the plugin fetches the Open Graph image from the permalink server-side. Results are cached to avoid repeated requests.<\/li>\n<li>New: Added <code>status_type<\/code> and attachment <code>type<\/code>\/<code>target<\/code> to Graph API field requests, enabling reliable detection of shared posts vs. genuinely text-only posts.<\/li>\n<li>Improved: Attachment <code>title<\/code> and <code>description<\/code> fields (already requested but previously unused) are now rendered inside share cards, providing context for shared content.<\/li>\n<li>Improved: Dark mode and custom color scheme support for share cards.<\/li>\n<\/ul>\n\n<h4>3.10.0<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>Developers: New filter bbfsync_field_sets lets you customize which Graph API fields are requested in each fallback variant.<\/li>\n<li>Developers: New filter bbfsync_posts_after_fetch lets you modify the result array (posts + cursor) before it is written to cache.<\/li>\n<li>Developers: New filter bbfsync_cache_duration lets you override the per-request cache TTL.<\/li>\n<li>Developers: New filter bbfsync_post_data lets you modify a single post's data before any rendering happens.<\/li>\n<li>Developers: New filter bbfsync_post_html lets you wrap, augment, or replace per-post markup. Fires on both initial render and AJAX Load More.<\/li>\n<li>Developers: New filter bbfsync_feed_html gives you the final feed HTML before it is returned from render().<\/li>\n<li>Developers: New action bbfsync_before_api_fetch fires before each Graph API call.<\/li>\n<li>Developers: New action bbfsync_after_api_fetch fires after a successful fetch is cached \u2014 useful for cache busting and notifications.<\/li>\n<li>Developers: New action bbfsync_cache_flushed fires after BBFSYNC_Cache::flush() completes.<\/li>\n<li>Developers: New FAQ entry \"Can I extend the plugin from my theme or another plugin?\" pointing at the hooks documentation.<\/li>\n<li>i18n: The \"%s ago\" relative-time format on post timestamps is now admin-customizable from Components &gt; 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.<\/li>\n<li>No user-visible behavior change unless you customize the new label \u2014 the plugin renders identically to 3.9.33 by default.<\/li>\n<\/ul>\n\n<h4>3.9.33<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>Performance: Removed the resource hint for graph.facebook.com \u2014 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.<\/li>\n<\/ul>\n\n<h4>3.9.32<\/h4>\n\n<ul>\n<li>Accessibility: Lightbox now exposes proper dialog semantics \u2014 role=\"dialog\", aria-modal, aria-label, and a screen-reader hint describing the keyboard shortcuts (Escape, arrow keys)<\/li>\n<li>Accessibility: Lightbox close, previous, and next buttons now have explicit aria-label attributes<\/li>\n<li>Accessibility: Honors prefers-reduced-motion \u2014 animations, transitions and smooth-scroll are disabled inside plugin elements when the visitor's OS requests reduced motion (WCAG 2.3.3)<\/li>\n<li>Accessibility: Added :focus-visible outlines for keyboard users on feed links\/buttons, lightbox controls, carousel arrows, and the Load More button<\/li>\n<li>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)<\/li>\n<li>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<\/li>\n<li>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<\/li>\n<li>Security: AJAX load_more error responses no longer leak Graph API error details to anonymous visitors \u2014 admins still see the full error for debugging<\/li>\n<li>Improved: BBFSYNC_VERSION constant now reads dynamically from the plugin header via get_file_data() \u2014 single source of truth, eliminates version drift<\/li>\n<li>Improved: Build script now auto-syncs block.json and index.asset.php version metadata from the plugin header at build time<\/li>\n<li>Cleanup: Removed stale \"Facebook SDK (JavaScript)\" entry from readme.txt Third-Party Services \u2014 the SDK was removed in 3.9.23 but the disclosure was left behind<\/li>\n<\/ul>\n\n<h4>3.9.31<\/h4>\n\n<ul>\n<li>Improved: Full internationalization audit \u2014 all frontend labels now admin-customizable from Components &gt; Labels &amp; Text<\/li>\n<li>Improved: Added \"See more\", \"View on Facebook\", \"Share\", \"No more posts\", and \"Error\" as customizable post labels<\/li>\n<li>Improved: All setting defaults wrapped in translation functions for proper localization on fresh installs<\/li>\n<li>Improved: Proper plural support for \"follower\/followers\" using _n()<\/li>\n<li>Fixed: 12 placeholder attributes in admin panel now properly translatable<\/li>\n<li>Fixed: Visual style preset labels (Classic, Compact, Banner, Clean) now translatable<\/li>\n<li>Fixed: Regenerated POT file with correct line references and all missing entries<\/li>\n<\/ul>\n\n<h4>3.9.30<\/h4>\n\n<ul>\n<li>New: Text-Only Posts setting \u2014 choose between \"Expand in feed\" (default) or \"Open in lightbox\" for posts without images or video<\/li>\n<li>Fixed: Lightbox no longer shows a dark strip at the top when viewing text-only posts<\/li>\n<li>Improved: Text-only posts expand and collapse in place with smooth animation when \"Expand in feed\" is selected<\/li>\n<\/ul>\n\n<h4>3.9.29<\/h4>\n\n<ul>\n<li>Fixed: Text-only posts now display content in the mobile lightbox instead of showing a black screen.<\/li>\n<li>Fixed: Swipe navigation now works on text-only posts in the lightbox on all touch devices (mobile and iPad).<\/li>\n<li>Fixed: Vertical text scrolling in the lightbox sidebar no longer accidentally closes the lightbox.<\/li>\n<\/ul>\n\n<h4>3.9.28<\/h4>\n\n<ul>\n<li>New: Text Preview Lines setting \u2014 limits post text in grid layouts (masonry, boxed, carousel) to keep cards compact<\/li>\n<li>New: Expand indicator (line with caret) appears below clamped text \u2014 click to expand inline<\/li>\n<li>New: Setting configurable per feed (0\u201320 lines, default 14, 0 = unlimited), also available as shortcode attribute and Gutenberg block control<\/li>\n<li>Improved: Mobile single-column layouts lift the text clamp for full readability<\/li>\n<li>Improved: \"See more\" link hidden in grid layouts \u2014 lightbox and expand indicator handle full text<\/li>\n<\/ul>\n\n<h4>3.9.27<\/h4>\n\n<ul>\n<li>Improved: Setup guide Step 3 now clarifies that a User token (not Page token) must be selected, and that your own app must be chosen<\/li>\n<li>Improved: Setup guide Step 4 adds easier recommended method via Access Token Debugger \"Extend Access Token\" button<\/li>\n<li>Improved: Setup guide Step 5 now uses direct Page ID URL instead of \/me\/accounts for more reliable token retrieval<\/li>\n<li>Improved: Added troubleshooting tip for \"Error validating client secret\" in Step 4<\/li>\n<li>Fixed: Header followers label now uses the customizable \"Followers label\" setting from Components tab<\/li>\n<\/ul>\n\n<h4>3.9.26<\/h4>\n\n<ul>\n<li>Improved: Simplified \"Find your Page ID\" step \u2014 now uses Graph API Explorer for quick lookup<\/li>\n<\/ul>\n\n<h4>3.9.25<\/h4>\n\n<ul>\n<li>Improved: Setup guide now correctly explains the 3-step token process (short-lived \u2192 long-lived User \u2192 permanent Page)<\/li>\n<li>Improved: Added link to Access Token Debugger for verifying token permanence<\/li>\n<li>Improved: Each setup step links to the exact tool or page where it is performed<\/li>\n<\/ul>\n\n<h4>3.9.24<\/h4>\n\n<ul>\n<li>Removed debug HTML comment from follow card output<\/li>\n<li>Fixed double-escaping in follow card CSS class builder<\/li>\n<li>Fixed stale version fallback in block asset file<\/li>\n<\/ul>\n\n<h4>3.9.23<\/h4>\n\n<ul>\n<li>New: Like Box replaced with custom follow card \u2014 no longer depends on Facebook's deprecated Page Plugin SDK<\/li>\n<li>The follow card uses Graph API data (avatar, page name, follower count) and renders reliably at all sizes<\/li>\n<li>Cover photo shown in Large mode, all existing settings (position, size, display mode, width) still apply<\/li>\n<li>Removed Facebook JS SDK dependency \u2014 one fewer external script loaded on the frontend<\/li>\n<\/ul>\n\n<h4>3.9.22<\/h4>\n\n<ul>\n<li>Fixed: Lightbox prev\/next navigation arrows now visible on text-only posts<\/li>\n<li>Fixed: Text-only lightbox no longer stretches to full viewport height \u2014 shrinks to fit content on all screen sizes<\/li>\n<\/ul>\n\n<h4>3.9.21<\/h4>\n\n<ul>\n<li>New: Infinite lightbox browsing \u2014 next batch of posts loads automatically when you reach the last post<\/li>\n<li>New: Text-only posts display in a clean full-width lightbox layout instead of an empty black media panel<\/li>\n<li>New: Customisable Mute, Unmute, and Fullscreen button labels in Features \u2192 Labels &amp; Text<\/li>\n<li>Fixed: Per-feed CSS scoping \u2014 multiple feeds with different custom colours on the same page no longer conflict<\/li>\n<li>Fixed: Reset palette defaults now match the settings defaults exactly<\/li>\n<li>Fixed: Version consistency across .pot file and all plugin surfaces<\/li>\n<li>Changed: README.md excluded from distribution zip<\/li>\n<\/ul>\n\n<h4>3.9.20<\/h4>\n\n<ul>\n<li>Fixed: Page name now displays correctly when entered manually in text header mode<\/li>\n<li>Fixed: Bio display logic made consistent across all header styles<\/li>\n<li>Fixed: Lightbox now renders above sticky headers and page builder containers<\/li>\n<li>Improved: Facebook Graph API version centralised as a single constant for easier updates<\/li>\n<li>Improved: API retry logic now logs failures and successes when WP_DEBUG_LOG is enabled<\/li>\n<li>Improved: Dark color scheme error message styling<\/li>\n<li>Changed: Legacy migration now runs only on plugin activation instead of every page load<\/li>\n<\/ul>\n\n<h4>3.9.18<\/h4>\n\n<ul>\n<li>New: Like Box display mode setting \u2014 Always visible or Reveal on scroll<\/li>\n<li>Reveal on scroll: Like Box is hidden initially and fades in when the user scrolls near the bottom of the feed<\/li>\n<li>Display mode option only shown when Like Box position is set to Bottom<\/li>\n<li>Admin UI shows contextual description for each display mode<\/li>\n<\/ul>\n\n<h4>3.9.17<\/h4>\n\n<ul>\n<li>Improved: Load More button now meets WCAG AAA touch target (44px minimum height)<\/li>\n<li>Improved: Button has larger padding, font size, and subtle shadow for better visibility<\/li>\n<li>Changed: Like Box and Load More button no longer share the same footer bar \u2014 Like Box renders independently above the sticky Load More bar for clearer visual separation<\/li>\n<\/ul>\n\n<h4>3.9.16<\/h4>\n\n<ul>\n<li>Fixed: Video playback now works on iPad and mobile devices<\/li>\n<li>Touch devices open lightbox for video instead of broken inline embed<\/li>\n<li>All Facebook videos (landscape + portrait) show play button on touch devices<\/li>\n<li>Safari\/WebKit: Facebook videos open directly on Facebook (iOS ITP workaround)<\/li>\n<li>Customizable Safari video hint text in admin settings<\/li>\n<li>Stale-cache fallback: feed remains visible when API is temporarily unavailable<\/li>\n<li>\"Last successful fetch\" timestamp shown in admin cache settings<\/li>\n<\/ul>\n\n<h4>3.7.2<\/h4>\n\n<ul>\n<li>Carousel video no longer cropped by 220px height limit \u2014 shows full frame in natural proportions<\/li>\n<li>Portrait and landscape videos both display uncropped in carousel<\/li>\n<\/ul>\n\n<h4>3.7.1<\/h4>\n\n<ul>\n<li>Video thumbnails now display full frame without cropping (object-fit: contain)<\/li>\n<li>Removed fixed height constraint on carousel video \u2014 shows natural proportions<\/li>\n<li>Container dimensions locked from thumbnail before iframe replacement<\/li>\n<\/ul>\n\n<h4>3.7.0<\/h4>\n\n<ul>\n<li>One-click video playback on all browsers \u2014 autoplay with mute for reliable instant play<\/li>\n<li>Facebook video in lightbox now fills entire media area for immersive viewing<\/li>\n<li>Applies to both feed\/carousel and lightbox video embeds<\/li>\n<\/ul>\n\n<h4>3.6.3<\/h4>\n\n<ul>\n<li>Lightbox video loads iframe directly (no thumbnail step) \u2014 eliminates double-click on mobile<\/li>\n<li>Portrait video in lightbox now centered horizontally instead of left-aligned<\/li>\n<li>Removed \"Watch on Facebook\" overlay from lightbox video embeds<\/li>\n<\/ul>\n\n<h4>3.6.1<\/h4>\n\n<ul>\n<li>Tightened gallery gap from 4px to 2px for cleaner, more professional image grids<\/li>\n<\/ul>\n\n<h4>3.6.0<\/h4>\n\n<ul>\n<li>Pro gallery grid: 6-column CSS Grid matching Facebook\/Smash Balloon layout patterns<\/li>\n<li>2 images: equal side-by-side; 3: large left + 2 stacked right; 4: 2\u00d72; 5+: 2 top + 3 bottom<\/li>\n<li>Up to 5 visible images per gallery with +N overlay on last<\/li>\n<li>Subtle inset border on gallery cells (Facebook-style depth)<\/li>\n<li>All images use object-fit: cover for consistent look with mixed portrait\/landscape<\/li>\n<\/ul>\n\n<h4>3.5.9<\/h4>\n\n<ul>\n<li>Redesigned gallery grid: 2 side-by-side, 3 L-shape, 4 as 2\u00d72, 5+ as 2-top\/3-bottom (Facebook pattern)<\/li>\n<li>Gallery now shows up to 5 visible images with +N overlay for remaining<\/li>\n<li>Improved gallery proportions and spacing across all layouts<\/li>\n<\/ul>\n\n<h4>3.5.8<\/h4>\n\n<ul>\n<li>Fixed multi-image posts: explicit subattachment fields in API request and fallback for multiple attachments<\/li>\n<li>Increased subattachment limit to 25 images per post<\/li>\n<\/ul>\n\n<h4>3.5.7<\/h4>\n\n<ul>\n<li>Facebook-inspired gallery grid: 2 images side-by-side, 3 images L-shaped, 4+ with top hero and thumbnail row<\/li>\n<li>Gallery uses CSS Grid with center-crop for consistent layout across all image orientations<\/li>\n<li>+N overlay on last visible image when posts contain more than 4 photos<\/li>\n<li>Carousel layout now accommodates gallery grids with adaptive height<\/li>\n<li>Portrait video thumbnails use 4:5 aspect ratio matching Facebook feed standard<\/li>\n<li>Cleaned up duplicate play button CSS and legacy portrait video placeholder rules<\/li>\n<\/ul>\n\n<h4>3.5.6<\/h4>\n\n<ul>\n<li>Gallery main image capped at 400px height for consistent layout with mixed portrait\/landscape images<\/li>\n<li>Gallery thumbnails increased from 100px to 120px height<\/li>\n<\/ul>\n\n<h4>3.5.5<\/h4>\n\n<ul>\n<li>Fixed portrait video playback: container height locked before iframe replaces thumbnail<\/li>\n<li>Portrait videos in lightbox now render in correct aspect ratio<\/li>\n<li>Portrait video detection propagated to lightbox for consistent display<\/li>\n<\/ul>\n\n<h4>3.5.4<\/h4>\n\n<ul>\n<li>Portrait video thumbnails now display in natural aspect ratio instead of being cropped to 16:9<\/li>\n<\/ul>\n\n<h4>3.5.3<\/h4>\n\n<ul>\n<li>Added \"Loading Text\" admin setting for Load More button loading state<\/li>\n<\/ul>\n\n<h4>3.5.2<\/h4>\n\n<ul>\n<li>Added \"Watch on Facebook\" fallback link for copyright-blocked video embeds<\/li>\n<li>Fallback appears on hover in feed, always visible in lightbox<\/li>\n<\/ul>\n\n<h4>3.5.1<\/h4>\n\n<ul>\n<li>Added esc_attr() wrappers on assembled style attributes for Plugin Check compliance<\/li>\n<li>Added esc_url() in linkify() for proper URL escaping in href attributes<\/li>\n<li>Added phpcs:ignore comments for pre-escaped concatenated output<\/li>\n<li>Added \"No posts found\" admin-only message for empty feeds<\/li>\n<li>Prefixed uninstall.php variables for codesniffer compliance<\/li>\n<\/ul>\n\n<h4>3.5.0<\/h4>\n\n<ul>\n<li>Admin panel redesign: reduced from 4 tabs to 3 (Connect, Appearance, Features)<\/li>\n<li>Header settings moved into Appearance tab as a section (no longer a separate tab)<\/li>\n<li>Content settings (page name, bio, avatar, cover) shown directly without accordion<\/li>\n<li>Mobile header toggles shown inline (removed Mobile accordion)<\/li>\n<li>Backwards-compatible URL mapping for old tab names (layout-style, header)<\/li>\n<\/ul>\n\n<h4>3.4.3<\/h4>\n\n<ul>\n<li>Added constant definition guards to prevent redefinition errors<\/li>\n<li>Fixed unprepared DB query in legacy migration (now uses $wpdb-&gt;prepare)<\/li>\n<li>Added privacy policy suggestion via wp_add_privacy_policy_content()<\/li>\n<li>Removed hardcoded BBFSYNC_LAST_UPDATED constant<\/li>\n<\/ul>\n\n<h4>3.4.2<\/h4>\n\n<ul>\n<li>Whitespace cleanup across PHP, CSS, and JS files<\/li>\n<\/ul>\n\n<h4>3.4.1<\/h4>\n\n<ul>\n<li>Fixed unprefixed variables in uninstall.php<\/li>\n<li>Added missing contributor to readme.txt<\/li>\n<\/ul>\n\n<h4>3.4.0<\/h4>\n\n<ul>\n<li>Admin panel UX redesign: reorganised from 6 tabs to 4 (Connect, Layout &amp; Style, Header, Features)<\/li>\n<li>Client-side tab switching \u2014 no page reloads when navigating between settings tabs<\/li>\n<li>Header tab now uses collapsible accordion sections (Content, Background, Typography, Mobile)<\/li>\n<li>Features tab merges Sections and Lightbox into card-based toggles with enable\/disable switches<\/li>\n<li>Layout &amp; Style tab merges Layout and Colours into one tab with clear visual sections<\/li>\n<li>Connect tab: collapsible Advanced section for cache settings, auto-expanding setup guide<\/li>\n<li>Two-row feed management bar with shortcode badge and copy button<\/li>\n<li>Sticky save button with unsaved changes indicator<\/li>\n<li>Connection status banner shows setup progress at a glance<\/li>\n<li>Unsaved changes warning when navigating away from modified settings<\/li>\n<li>Backwards-compatible URL mapping for old tab names<\/li>\n<\/ul>\n\n<h4>3.3.0<\/h4>\n\n<ul>\n<li>Fixed Facebook video playback (black screen on play) with direct iframe embed<\/li>\n<li>Added feed Export\/Import functionality in admin panel<\/li>\n<li>Added header text color option for text-style headers<\/li>\n<li>Fixed inline SVG icons being stripped by output escaping<\/li>\n<\/ul>\n\n<h4>3.2.0<\/h4>\n\n<ul>\n<li>Added lightbox image counter for multi-photo posts<\/li>\n<li>Security hardening: feed management actions use POST requests<\/li>\n<li>Mobile carousel improvements (auto-height images, swipe navigation)<\/li>\n<li>Added mobile-specific toggles for header page name and bio visibility<\/li>\n<li>Two-level lightbox navigation: images within posts, then between posts<\/li>\n<li>WordPress.org audit compliance improvements<\/li>\n<\/ul>\n\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Multi-Feed Manager \u2014 Create unlimited feeds with individual settings<\/li>\n<li>Feed selector dropdown with create, duplicate, rename, delete<\/li>\n<li>Per-feed shortcodes with ID parameter<\/li>\n<li>Shortcode attribute overrides for any setting<\/li>\n<li>New feeds inherit API connection from primary feed<\/li>\n<\/ul>\n\n<h4>2.9.0<\/h4>\n\n<ul>\n<li>Header redesign with 4 visual styles (Classic, Compact, Banner, Clean)<\/li>\n<li>Header backgrounds: Theme, Solid color, Gradient, Transparent<\/li>\n<li>Visual style picker with mini preview cards in admin<\/li>\n<li>Show Bio toggle shared across header types<\/li>\n<\/ul>\n\n<h4>2.8.0<\/h4>\n\n<ul>\n<li>Header style picker with visual preview cards<\/li>\n<li>Text header: transparent background option, custom text size<\/li>\n<li>Visual header: reorganised settings with size\/color controls<\/li>\n<\/ul>\n\n<h4>2.7.0<\/h4>\n\n<ul>\n<li>Dark color scheme with OLED-friendly pure grey palette<\/li>\n<li>Reset to Default button for custom color palette<\/li>\n<\/ul>\n\n<h4>2.6.0<\/h4>\n\n<ul>\n<li>Sticky footer bar combining Like Box and Load More<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>Carousel swipe with snap-based passive touch navigation<\/li>\n<li>List layout width increased to 960px<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Multi-card carousel with responsive columns<\/li>\n<li>Dot pagination and arrow navigation<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Touch swipe in lightbox<\/li>\n<li>Facebook video iframe embed<\/li>\n<li>Video touch zones for mobile<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>YouTube auto-detection and click-to-play<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Universal post lightbox with split layout<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>9-color customization system<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Boxed layout, author links, image galleries, engagement bar<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Carousel slider, video lightbox, cursor-based pagination<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release with List and Masonry layouts<\/li>\n<\/ul>","raw_excerpt":"Display a customizable social page feed on your WordPress site with multiple layouts, color schemes, header options, like box, lightbox, and more.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/290191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=290191"}],"author":[{"embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rstake"}],"wp:attachment":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=290191"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=290191"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=290191"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=290191"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=290191"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=290191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}