Providers

Every provider returns the same normalized Item; they differ only in configuration and where the data comes from. All of them ride the same cache pipeline.

LinkedIn (company page)

Displays a company page's own posts via LinkedIn's official Community Management API. LinkedIn has no public feed — the official API requires a LinkedIn developer app with Community Management access, and the member who connects must be an admin of the page. That's a LinkedIn rule, not ours: this provider shows your page, not arbitrary pages.

Setup (bring-your-own app):

  1. Create an app on developer.linkedin.com and request Community Management API access (LinkedIn reviews this — days to weeks).
  2. In Feeds → Connections, add a connection with the app's Client ID and Secret. Register the redirect URL shown there in your LinkedIn app, verbatim.
  3. Click Connect and authorize as a page admin. Tokens refresh automatically (~60-day access tokens, ~1-year refresh tokens); when reauthorization is eventually needed, an admin notice tells you.
  4. Create a feed: pick the connection, enter the numeric organization ID (from your page's admin URL), optionally the display name and public slug.

Post images arrive from LinkedIn as short-lived signed URLs — the plugin downloads them locally during each fetch, so they never break on your pages.

RSS / Atom

Any RSS 2.0 or Atom feed by URL. Handles content:encoded, media:content/media:thumbnail, and image enclosures; HTML is flattened to plain text (your templates decide markup).

Also the escape hatch for platforms that expose RSS without an open API: Mastodon (https://instance/@user.rss), subreddits (/.rss), podcast feeds, most news sites.

YouTube (channel)

Channel uploads via YouTube's keyless public Atom feed — no API key, no quota. Configure the UC… channel ID (from youtube.com/channel/UC… — not the @handle), or a PL… playlist ID. Returns the ~15 latest videos with titles, descriptions, and thumbnails. Ships with a video-shaped default template (item-youtube.php): thumbnail + play overlay linking to YouTube — no iframe, no third-party requests until the visitor clicks.

Bluesky (profile)

Profile posts via Bluesky's public AppView API — no authentication at all. Configure the handle (name.bsky.social or a custom-domain handle). Reposts, replies, and pins are filtered out; embedded images (with alt text) and link-card thumbnails are mapped.

Mock

Fixture data shaped exactly like LinkedIn's API responses, run through the same normalizer as the live provider. Zero credentials — build and style templates before any API access exists. Visible when WP_ENVIRONMENT_TYPE is not production; mock feeds don't count toward the free-tier limit outside production.

What about X / Instagram / Facebook?

X has had no free read API since 2023 and no RSS — the only "free" routes are scraping mirrors, which we won't build on. If you accept the trade-offs, point the RSS provider at a bridge you host yourself. Instagram/Facebook (Meta Graph API, app review required) are on the roadmap.

Custom providers

Third-party providers plug into the same registry:

add_action( 'thewpfeeds_register_providers', function ( $registry ) {
    $registry->register( new My_Custom_Provider() );
} );

Implement TheWPFeeds\Provider\ProviderInterfaceid(), label(), fetch( Feed $feed ): ItemCollection, and settingsFields() for the admin form. Return normalized Item objects and you inherit caching, image localization, templates, and the block for free.