Skip to main content

Shahjahan JewelΒ How would a community member change their password? i don't see an option in their profile, and I'm not keen on them going to WordPress to make a simple change?

I mean, I’d like to be able to integrate any WordPress CPT into the community without changing the style or layout in any way.

Currently, when I click on "Leaderboard" here on the site:

  • the color of the left-hand menu changes
  • the bell icon in the top right corner disappears
  • part of the header disappears
  • the entire page refreshes
  • it loads much more slowly

If switching to CPT were completely seamless, the whole experience would be much better, and the plugin could be used more flexibly.

Thanks

Today our weekly digest email was sent to all members, but it contained raw PHP warning messages instead of styled links. The output included the following repeated error:

Warning: Undefined variable $linkColor in /data/sites/web/[domain]/wp-content/plugins/fluent-community/app/Views/email/Default/_user_post_content.php on line 47 (and lines 48, 53)

Could you confirm whether this is a known issue and whether a fix is available? In the meantime, is there a recommended workaround?

1.00

link previews on posts are inconsistent, especially for social-media URLs and for posts where users paste raw URLs (the most common case). I traced the root causes through the source (v2.5.0) and validated fixes via a userland snippet. Sharing the findings below so they can flow into a future release.

Every item is small + surgical. None require new features β€” they're mostly one-line config changes or filter additions.


1. Bare URLs don't become previewable (high impact, one-line fix)

File:Β app/Services/FeedsHelper.php, line 71
Current:

->setUrlsLinked(false)

Issue:Β Parsedown's auto-linker is explicitly off, so any user who pastesΒ https://example.comΒ as plain text gets a non-clickable URL AND no preview card, because the downstreamΒ findFirstUrl()Β only matchesΒ <a href>Β tags. This is the most common user flow on every other community platform.

Proposed fix:Β Flip toΒ ->setUrlsLinked(true). If keeping it off is intentional for a specific reason, expose it as a filter:

->setUrlsLinked(apply_filters('fluent_community/markdown_auto_link_urls', true))

2.Β findFirstUrl()Β regex has a greedy lookahead bug

File:Β app/Services/FeedsHelper.php, line 222
Current:

$pattern = '/<a\s+(?:[^>]*?\s+)?href=([\'"])(?!.*\/u\/)(.*?)\1/';

Issue:Β TheΒ (?!.*\/u\/)Β lookahead uses greedyΒ .*Β against theΒ whole remaining string, so if any mention or profile link appearsΒ anywhere laterΒ in the message, the regex discardsΒ everyΒ preceding URL. Posts that mix a URL with anΒ @mentionΒ get no preview.

Proposed fix:Β UseΒ preg_match_all, then filter results per-match:

preg_match_all('/<a\s+[^>]*href=([\'"])(.*?)\1/i', $html, $matches);

foreach ($matches[2] as $href) {

if (strpos($href, '/u/') === false) {

return $href;

}

}

return '';


3. Outbound User-Agent gets rejected by half the modern web

File:Β app/Services/RemoteUrlParser.php, line 124
Current:

$modified_user_agent = 'WP-URLDetails/' . get_bloginfo('version') . ' (+' . get_bloginfo('url') . ')';

Issue:Β Twitter/X, Meta properties, LinkedIn, and most Cloudflare-fronted sites return 401/403 to this UA. So fetches for the most-shared URL types silently fail and no preview ever gets generated.

Proposed fix:Β Default to a real browser UA, expose a filter for overrides:

$modified_user_agent = apply_filters(

'fluent_community/url_fetch_user_agent',

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'

);


4. Response size cap is too tight for modern sites

File:Β app/Services/RemoteUrlParser.php, line 127
Current:Β 'limit_response_size' => 300 * KB_IN_BYTES
Issue:Β Many modern sites push OG tags below 300KB of inline JSON-LD / preload tags, so theΒ <head>Β section is never reached and metadata extraction fails.

Proposed fix:Β Bump to 600KB and add an explicit timeout so slow news sites don't fail:

$args = [

'limit_response_size' => 600 * KB_IN_BYTES,

'timeout' => 15,

'redirection' => 5,

'user-agent' => $modified_user_agent,

];


5. Eye-icon preview button silently fails for OG cards

File:Β assets/app.jsΒ (composer preview component)
Current behavior:

this.$get("feeds/oembed", {url}).then(e => {

this.media.html = e.oembed.html // only renders if HTML exists

})

Issue:Β The composer's preview button only renders embeddable iframe HTML (YouTube, Vimeo, etc.). Generic OG cards (image + title + description, the format most websites return) come back without anΒ htmlΒ field, so the preview button silently shows nothing. Users perceive the button as broken.

Proposed fix:Β When the response isΒ type: 'meta_data', render a fallback OG card client-side usingΒ oembed.image,Β oembed.title,Β oembed.description. Same component you already render under a posted feed β€” just reuse it in the composer.


6. No proxy hook for blocked hosts

Issue:Β Twitter/X, Instagram, TikTok, Facebook actively block all unauthenticated server-side fetches regardless of UA. No CSS / config fix bypasses this β€” the only solution is routing through a third-party metadata service (Iframely, Microlink, LinkPreview). The plugin has no documented extension point for this.

Proposed fix:Β Add an early-exit filter insideΒ RemoteUrlParser::parse():

public static function parse($url)

{

// Allow third-party services to handle blocked hosts.

$preempted = apply_filters('fluent_community/preview_metadata_pre_fetch', null, $url);

if ($preempted) {

return $preempted;

}

// ... existing logic

}

That single filter lets agencies and community admins plug in Iframely (paid, rich) or Microlink (free tier) for hosts that block direct fetches, without forking the plugin.


Cache backend (nice-to-have, item 7)

File:Β app/Services/RemoteUrlParser.php, lines 88, 117
UsesΒ wp_cache_get/wp_cache_set, which is non-persistent unless an object cache plugin is installed. Consider falling back toΒ get_transient/set_transientΒ so first-page-load previews aren't re-fetched on every request on stock installs.


Priority recommendation

If you can only ship one thing:Β item #1Β (setUrlsLinked(true)). That alone solves the majority of "no preview" complaints because it makes raw pasted URLs work the way users expect on every other platform.

If you can ship two: addΒ #3Β (browser UA). That unblocks LinkedIn + most CDN-protected sites.

Items #5 and #6 are bigger UX wins but require more work.

Hi everyone,

I’m facing an issue where users are not being automatically enrolled in specific FluentCommunity courses and spaces after purchasing a product via FluentCart.

My Setup:

  • FluentCart -> FluentCRM Integration Feed: Event Trigger is "Order Paid", Add Tag A (Product Name)
  • FluentCart -> FluentCommunity Integration Feed: Event Trigger is "Order Paid", - Add to Space B & Add to Course A
  • FluentCommunity Access Management: Sync Tag A with Course A

The Problem (Occurrence Conditions):

The failure rate depends heavily on the checkout routing:

  1. Via FluentCommunity's Paywalls: Fails 100% of the time. It doesn't matter if it's a completely new user or an existing logged-in user. While the WordPress user account is successfully created and they can access the community itself, the automatic enrollment to the specific Course and Space never works.
  2. Via Standard Cart or Direct Checkout Links: Mostly works fine, but I have encountered the exact same Course/Space enrollment failure at least once.

What I've verified so far:

  • Even when Course/Space enrollment fails, FluentCRM does successfully receive "Tag A" upon purchase (so the "Order Paid" trigger in FluentCart itself is definitely firing).
  • However, neither the direct integration feed from FluentCart to FluentCommunity, nor the tag synchronization from FluentCRM to FluentCommunity, is triggering properly.
  • I am not using any caching plugins, so this is not a cache issue.

Has anyone experienced a similar issue, particularly with Paywalls failing to trigger Course/Space enrollments? I would appreciate any advice on which settings I should review or if this is a known bug.

It would be great if we could archive spaces and/or let the people hide things from the menu.

I have a bunch of spaces that aren't really active anymore (from masterclasses and workshops over a year ago). I don't want to keep them in the sidebar but I want the content available if the people want to revisit it.

If you're like me β€” having a FluentCommunity lifetime deal license sitting idle and not yet having moved away from your Circle community β€” then this one is for you.

We are an adult academy, running a large course catalog. We currently have 3 Circle community-driven courses with three full-year courses containing hundreds of items, and I faced the challenge of migrating all of these to FluentCommunity. I didn't want to do it manually, so I used Claude Code to handle every single part of the migration β€” without touching FluentCommunity manually even once (after the initial setup).

Here I want to share the skill I created out of this completed migration. You can use it if you're on the fence about migrating your Circle community to FluentCommunity. I asked AI to generate a summary of everything this migration skill (and all the included python scripts) can do, and you can simply download it, , unzip it, install it (tell Claude to also use the python scripts), and get started.

Note: To use the Circle API you need their Business plan (USD 199.- /month), but you can wait until the last 7 days before your next billing cycle, and upgrade then and only pay the difference for those 7 days (and then quit).

Here is that summary:

Circle.so β†’ FluentCommunity Migration Guide

A practical guide for applying this skill to migrate eLearning content from a Circle.so community to a FluentCommunity (WordPress) installation.

What this skill can and can't migrate -> check the attachments


Important Caveats & Workarounds

1. Circle Admin API v2 Returns Wrong Lesson Positions ⚠️

TheΒ positionΒ field in Circle's Admin API v2 responses does NOT reflect the actual display order in the Circle UI.

Example: In Modul 7 of a Numerologie course, the API reported all Quizzes at positions 19–30 and Meditations at 31–42 β€” but the Circle UI actually shows them interleaved directly after each Lebenszahl lesson.

Solution:Β Always scrape the correct lesson order directly from the Circle browser UI using Playwright.


2. Circle CDN URLs Must Never Be Embedded in FC

Circle media is hosted atΒ https://assets-v2.circle.so/.... These URLs:

  • Require Circle authentication to access
  • Will break when a Circle subscription ends
  • Must not be stored in FC content

Solution:Β Always download Circle assets locally first, then re-upload to FC via the WP media library (POST /feeds/media-upload) or document endpoint (POST /documents/upload).


3. Lesson Videos: Circle "Featured Video" Requires a Workaround

In Circle, lesson videos are typically stored as "featured video" (Active Storage blob), not as a URL in the lesson API response. The lesson API returns no video URL for these.

Solution:Β Since most Circle videos are hosted on Vimeo and then embedded in Circle, retrieve them directly from yourΒ Vimeo account:

  1. Fetch all videos from the relevant Vimeo folder via Vimeo API

  2. Match each Circle lesson title to a Vimeo video title (fuzzy word-overlap matching)

  3. Embed the Vimeo URL in FC using oEmbed format:

    { "type": "oembed", "url": "https://vimeo.com/{video_id}", "content_type": "video" }
  4. For webinar recordings not yet on Vimeo: upload using PyVimeo (vimeo.upload(filepath))



4. XProfile Username β‰  WordPressΒ user_nicename

FluentCommunity creates XProfile usernames byΒ removing hyphensΒ from the WPΒ user_nicename. For example,Β clemens-mazzaΒ becomesΒ clemensmazzaΒ as the XProfile username.

Impact:Β REST API badge/profile endpoints use the XProfile username, not the WP nicename. Always look up the actual XProfile username via WP-CLI before making API calls:

wp eval '$x = \FluentCommunity\App\Models\XProfile::where("user_id", 123)->first(); echo $x->username;'

5. XProfile Must Be Created Before Badge Assignment

New WP users created via the REST API do NOT automatically get an FC XProfile. XProfiles are only created on first portal login β€” or explicitly:

wp eval '

foreach ([101, 102, 103] as $uid) {

` $u = \FluentCommunity\App\Models\User::find($uid);`

` if ($u) $u->syncXProfile(true);`

}

echo "Done\n";

'

wp fluent_community sync_x_profile --forceΒ is insufficient β€” it only runs for already-active portal users.


7. Wordfence Rate-Limits Bulk Media Uploads

Bulk file uploads (MP3s, PDFs, images) trigger Wordfence security rules at high frequency.

Solution:Β AddΒ 0.5sΒ delay between uploads. If still blocked, use Playwright browser upload as fallback (drag-and-drop via admin UI).


8. Badge Assignment: WP-CLI Is More Reliable Than REST API

Writing badges via the REST API requires the correct XProfile username (see caveat 5). Writing directly to the database via WP-CLI bypasses all these issues:

wp eval '

$x = \FluentCommunity\App\Models\XProfile::where("user_id", 123)->first();

$meta = is_string($x->meta) ? json_decode($x->meta, true) : ($x->meta ?? []);

$meta["badge_slug"] = ["your-badge-slug"];

$x->meta = $meta;

$x->save();

'


9. Circle API Must Be Called From Local Machine, Not Cloud Sandbox

Circle's API blocks requests from cloud sandbox IPs (e.g. ctx_execute sandboxes get HTTP 403). Always run Circle API scripts locally:

python3 /tmp/fetch_circle_lessons.py

Step-by-Step Migration Order

  1. Course structure + lessonsΒ β€” text, status, section hierarchy
  2. Lesson order correctionΒ β€” scrape Circle UI via Playwright, apply PATCH indexes
  3. VideosΒ β€” fetch from Vimeo, match by title, embed in lessons
  4. Audio files (MP3s)Β β€” download from Circle CDN, upload to FC
  5. Documents (PDFs)Β β€” download and re-upload as FC lesson documents
  6. Course + space iconsΒ β€” fetch and set as featured images
  7. MembersΒ β€” create WP users, sync XProfiles, add to spaces
  8. BadgesΒ β€” define badge slugs in FC, assign via WP-CLI
  9. FluentCRMΒ β€” create tags, import subscribers
  10. Lesson order final checkΒ β€” re-verify via Playwright UI scrape vs FC order

Required Inputs From the User

Before starting the migration, collect the following credentials and IDs:

Circle.so

Input Where to find it Example Circle API Token Circle Admin β†’ Settings β†’ Developers β†’ API Tokens BF2J1jST... Circle Community ID URL of any API response, or Admin β†’ Settings β†’ General 107415 Circle Community Slug URL of your Circle space:Β circle.so/c/{slug} numerologie-persoenlichkeit Circle Admin Login Your Circle admin email + password (for Playwright UI scraping) β€”

WordPress / FluentCommunity

Input Where to find it Example WP Domain Your WordPress site URL https://www.your-domain.com WP Admin Username WP Admin β†’ Users admin WP Application Password WP Admin β†’ Users β†’ your user β†’ Application Passwords β†’ Add New XXXX XXXX XXXX XXXX XXXX XXXX WP-CLI SSH access Server access to runΒ wp eval '...'Β commands β€”

Vimeo (only if migrating videos)

Input Where to find it Example Vimeo Access Token developer.vimeo.com β†’ My Apps β†’ your app β†’ Authentication β†’ Generate Token abc123... Vimeo Folder/Showcase ID URL of your Vimeo folder:Β vimeo.com/manage/folders/{id} 12345678

Technical Prerequisites

  • Python 3.10+ withΒ requests,Β PyVimeoΒ installed
  • Playwright MCP active in Claude Code
  • WordPress MCP configured with your domain + application password
  • WP-CLI access to the server (SSH or local) - can be done manually
  • Claude Code running locally (not in cloud) for Circle API calls
Circle to FluentCommunity migration skill for Claude Code Circle to FluentCommunity migration skill for Claude Code Circle to FluentCommunity migration skill for Claude Code

I have been highlight this issue from past 6 months, Fluent Community β€” OG Link Preview does not work, very important for my community to share links with rich preview...

Fluent Community β€” OG Link Preview not working

This string is not available for translation. Please add it.
Shahjahan JewelΒ 

Untranslatable string

After the FC update, link previews are being shown for posts with images. Also, images uploaded to posts are being cut by Show More. How to fix this?