Description
SocialPromoter by PublisherKits lets publishers post and schedule social media content from WordPress Posts directly to X (Twitter), LinkedIn, Facebook Pages and Bluesky — without leaving the editor.
Core features (free — everything in this plugin is fully functional):
- Write social copy with a live character counter (280-character X warning)
- Click post tags to insert as hashtags
- Post Now — fires immediately to all selected accounts
- Schedule — pick a date and time, WP Cron handles the rest
- Queue view — see all upcoming scheduled posts and cancel any
- Post history — the full, paginated log of everything sent, with errors
- Multiple accounts per platform — ideal for agencies and multi-brand publishers
- Brand hashtags — standing tags blended into every post
Pro features — supplied in a separate package; their implementation is not included in this WordPress.org build:
- Engagement statistics — likes, comments, shares and clicks on sent posts
- Campaigns — group posts, UTM-tag every link, PDF/GA4 client reports
- Automation — new-post suggestions, reposting and story boosts
- AI copy drafting — tone, goal and technique variants
- Branded images — platform-sized canvases with your logo and headline bar
- WP Job Manager support — post and schedule from job listings
- Author tagging — writers’ handles and hashtags suggested automatically, stored in BioBuilder-compatible fields so the two stay in sync
- Assisted posting — for places that will not accept a post from an app, LinkedIn and Facebook groups among them. SocialPromoter does not post to those on your behalf and neither does anything else: both platforms closed group posting to third-party apps. What it does instead is everything up to the send — writes the copy, prepares the image, holds it until the moment you chose, then reminds you and hands it over with one-click copy and a link straight to the destination. You paste; it records that you posted it
Supported platforms:
- X (Twitter) — OAuth 1.0a, posts via API v2
- LinkedIn — personal profiles and company pages
- Facebook — pages (requires Facebook developer app)
- Bluesky — app-password login, posts with clickable links
X and Facebook use your own developer app credentials. LinkedIn uses the shared PublisherKits relay app so company-page posting can use the approved LinkedIn Community Management API access.
More from PublisherKits
SocialPromoter is one of a small range of tools built for people who actually run publications. Each works on its own, and all are free on WordPress.org:
- PublisherKits BioBuilder – stop leaving author profiles blank. When a post is published, BioBuilder finds the author’s professional profile and fills in their bio, social handles, job title and employer.
- PublisherKits ExcerptBuilder – AI-powered excerpt generation using the WordPress AI Client. Write, rewrite or tidy excerpts on demand, or auto-draft them on publish for review.
- PublisherKits PluginTidy – works out which plugins your site actually uses, records every plugin change, and makes removing one safe.
External Services
This plugin connects to the following external APIs when you have configured credentials and connected accounts:
- X API (api.twitter.com and upload.twitter.com) — for OAuth authentication, posting tweets and uploading post images. Your post text, link and image are sent when you post; your app credentials are sent when authenticating. X Developer Terms of Service | X Privacy Policy
- Facebook Graph API (graph.facebook.com) — for OAuth authentication and posting to Facebook Pages. Your post text, link and image are sent when you post; your app credentials are sent when authenticating. Meta Platform Terms | Meta Privacy Policy
- LinkedIn API (api.linkedin.com) — for OAuth authentication and posting shares. Your post text, link and image are sent when you post. LinkedIn API Terms of Use | LinkedIn Privacy Policy
- Bluesky API (bsky.social) — for app-password authentication and posting. Your post text, link and image are sent when you post. Bluesky Terms of Service | Bluesky Privacy Policy
-
PublisherKits LinkedIn connect relay (pkits.org) — LinkedIn connections are authorised through a shared PublisherKits developer app, so you do not need your own LinkedIn developer app. The relay is operated by us (PublisherKits, Black and White Trading Ltd) and is contacted in two situations. During the connect step: when you click Connect, your browser is sent to LinkedIn to sign in, and your site then posts a one-time ticket, a nonce and a signature to the relay to complete the OAuth handshake and receive the LinkedIn access token, which is stored encrypted on your own site. And to renew access: LinkedIn access expires after about 60 days, so up to once a day (and when a post finds access already expired) your site posts the connection’s stored LinkedIn refresh token and your site’s host name to the relay, which exchanges it with LinkedIn for a new access token and returns it; the relay does not store or log either token. No post content, personal data or analytics is ever sent to the relay; posts go directly from your site to api.linkedin.com. PublisherKits Terms of Service | PublisherKits Privacy Policy
-
PublisherKits Support Copilot service (bwtlsupport.com) — optional in-plugin support assistant, the Help button on SocialPromoter admin screens. When you use it, your question and recent chat history are sent, together with your site address and (where available) its licence installation identifier used to authorise the request and apply fair-use limits, the plugin version and those of other installed PublisherKits plugins, the admin screen name, and a short whitelist of non-sensitive settings and counts (which social platforms have a connected account, how many accounts and how many queued, sent and failed posts exist, and five on/off settings covering reminders, queue auto-cancel, debug logging and uninstall clean-up). No account names or handles, access tokens, API keys, post copy or scheduled-post content are ever sent, and the assistant is read-only — it cannot change anything on your site. Nothing is sent until a user who can manage this plugin’s settings accepts the in-widget privacy notice; consent can be withdrawn on the Support screen. Ordinary questions are not retained after they are answered. Only if you open the ticket form (“Send to support” or “Still need to raise a ticket?”) and click “Create ticket” does the plugin send the conversation (up to its 20 most recent messages), the site details, settings and counts above, the question category, the contact email address you enter (pre-filled with your WordPress account email) and the first and last name from your WordPress user profile; these are kept, to become a support ticket. PublisherKits Terms of Service | PublisherKits Privacy Policy
No data is sent to these services until you have configured app credentials and connected accounts. Posting only occurs when you explicitly click Post Now or approve a scheduled post. The Support Copilot sends nothing until its privacy notice is accepted.
This plugin also uses the Freemius SDK (freemius.com) for licensing, updates and optional usage diagnostics. No data is sent to Freemius unless you explicitly opt in on the activation screen — skipping the opt-in keeps the plugin fully functional. Freemius Terms of Service | Freemius Privacy Policy
This free plugin makes no AI requests: AI copy drafting belongs to the separately distributed Pro version, which uses the AI provider the site configures in WordPress core’s Settings > Connectors, under that provider’s own terms and privacy policy.
Screenshots




Installation
- Upload the plugin folder to
/wp-content/plugins/ - Activate via Plugins in the WordPress admin
- Go to PublisherKits > SocialPromoter to configure your platform credentials
- Add the callback URL shown on the Accounts page to your developer app settings on each platform
- Click Save & Connect to authorise posting
FAQ
-
Do I need developer accounts for each platform?
-
You register developer apps for X and Facebook. LinkedIn uses the shared PublisherKits relay app, so no local LinkedIn developer credentials are required in the plugin.
-
What is the callback URL?
-
It is shown at the top of the Accounts page. Add it to the Redirect URIs / Callback URLs in each platform’s developer portal before connecting.
-
Yes. Scheduled posts use WP Cron, which works on cPanel shared hosting. Posting runs as soon as WP Cron fires after the scheduled time, typically within a few minutes of a site visit.
-
Can I connect multiple X accounts?
-
Yes — you can connect multiple accounts per platform (e.g. separate X accounts for each of your brands).
Reviews
There are no reviews for this plugin.
Contributors & Developers
“PublisherKits SocialPromoter” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “PublisherKits SocialPromoter” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.58.0
- Maintenance: updated the shared PublisherKits library this plugin bundles (PK Core 0.9.25). No change to how SocialPromoter posts, schedules or connects.
- The shared Site Profile screen is easier to use: the “Where do you want to get to” section repeated almost every question above it, which made one long page out of two. It is now a single line you can open, and it opens by itself when you have set a target there.
- The Site Profile now asks where your readers are and which spelling you publish in, as two separate questions, because WordPress assumes US English even on a UK site and the two answers are not always the same. You can also record a second market.
- A profile question added by another PublisherKits plugin now says which plugin uses it, instead of reporting that no plugin does.
1.57.0
- Fix: Scheduled posts can no longer get stuck in “sending” for ever. If the server stopped a send part-way – common on busy shared hosting, where WordPress runs scheduled tasks inside page visits – the post stayed “sending” indefinitely and was never posted; one site had 1,289 such posts. A recovery task now runs every 15 minutes: a post stuck for more than 15 minutes is retried, up to three attempts, then marked failed with the reason. A post more than 24 hours past its scheduled time is never sent late – it is marked “Expired” instead. A post whose send stopped while the platform was publishing it is not retried automatically, because it may already be live; it is marked failed and asks you to check.
- Fix: Each send now records the step it reached before every network call, so a failed or interrupted post shows where it stopped. The Activity screen now lists posts that are currently sending, with their attempt number and last step – previously they appeared nowhere.
- New: LinkedIn connections now renew themselves. LinkedIn access lasts about 60 days; the plugin now uses the renewal token LinkedIn already provides (via the PublisherKits relay) to renew access automatically 14 days before it expires, daily, and again at the moment of sending if access has already run out. LinkedIn’s yearly authorisation still needs a person to reconnect once a year: you are now warned 30, 14 and 3 days before it ends. The Platforms screen shows each LinkedIn connection’s renewal status and has a “Renew access now” button.
- New: SocialPromoter now tells you when WordPress is not running its scheduled tasks on time, on every SocialPromoter screen and by email, with exact instructions for adding a server cron job. The plugin cannot add a server cron job itself; the notice says so.
- New: Alert recipients setting (Settings > Advanced). Problems with scheduled posting – stuck or overdue posts, scheduled tasks not running, a connection that cannot post, a LinkedIn authorisation about to end – are emailed to the addresses you list, or to the site admin email if you leave it empty. The check now runs hourly, and while a problem lasts the email repeats once a day instead of being sent only once.
- New: A dashboard widget shows how many posts are stuck, overdue or failed, and whether scheduled tasks are running on time.
- Fix (Pro): The connection-health check now runs hourly instead of daily, and posts that failed because a send was interrupted no longer count against an account’s connection – a stopped server process says nothing about whether the account works.
- Fix (Pro): House campaigns, automation and reposting now count a post that is mid-send as posted. They counted only sent and scheduled posts, so a campaign whose posts were stuck sending kept queueing replacements.
- Note: The PublisherKits LinkedIn relay is now also contacted once a day to renew LinkedIn access, as described under External Services.
1.56.0
- New: Support Copilot can now answer Help questions using an AI provider you have already connected to this site, instead of our support service. It runs on the WordPress core AI Client and reads no licence, token or plugin data, so it works the same in the free and Pro builds. If a local answer fails it falls back to the support service, sending the question and recent chat history – the privacy notice and Answer mode text now say so plainly.
- Fix: The in-plugin support link now reaches the right place. The Freemius contact form was enabled and the support link hidden, which is the wrong way round: that form emails us but never raises a ticket, and a customer report went unanswered because of it. Paying customers now get the plugin support desk, free users the WordPress.org forum.
- Fix (Pro): Connecting LinkedIn no longer switches on posting for every company page you administer. The shared app returns every page you have rights to – thirteen on one of our own sites – and all of them used to become live posting targets from a single click. Only the page matching this site is pre-selected now; tick any others you want. Accounts you have already connected are not affected.
- Fix (Pro): Disconnecting an account no longer removes it from the list. It stays, greyed out, with a Reconnect button, and reconnecting restores the posting selection it had. Disconnect also asks for confirmation now, and points out that unticking Use for posting is what you want if you only mean to stop posting there.
- Fix (Pro): Reconnecting a platform keeps your posting selection instead of re-enabling every account on it.
- Fix: Each platform on the Platforms screen now explains its connected state rather than repeating the first-time setup instruction forever. LinkedIn in particular told you to click Connect even when company pages were already connected and listed underneath it.
- Fix: The Compose screen now explains each section, including which field prints on the image and which is the text of the post. Selecting a post fills the copy box with its title, so the two start out identical, and nothing said they were different.
- Fix (Pro): Saving an Image headline now updates an open preview immediately instead of asking you to close and reopen it.
- Fix: Selecting a second or subsequent account no longer scrolls the page down to the new panel.
1.55.2
- Fix: The Compose preview no longer cuts the headline and logo bands off the LinkedIn image. The preview box was still shaped to the old 1.91:1 image, so the taller 4:3 image introduced in 1.55.1 overflowed it and was trimmed top and bottom – exactly where the bands sit. The image itself was always correct; only the on-screen preview was cropping it, and anything you posted carried its full branding.
- Fix (Pro): The “Reconnect the account” button on the broken-connection warning now takes you to the platform that needs reconnecting, and highlights it. Previously it linked to the Platforms screen as a whole – so if the warning appeared while you were already on that screen, clicking it reloaded the page and appeared to do nothing at all.
1.55.1
- Fix (Pro): Images posted to LinkedIn are no longer surrounded by blurred grey bars. They were being built at 1.91:1, the ratio LinkedIn’s own documentation recommends, but the post tiles on your company page and on the page admin dashboard are fixed at 4:3 – so roughly a third of every tile was filler. Images are now built at 4:3 (1200×900), which fills those tiles and still renders edge to edge in the main feed. Applies to company Pages and personal profiles alike; X, Facebook and Bluesky are unchanged. Images already posted keep their old shape.
- Fix (Pro): Less of your featured image is now cropped away on LinkedIn. Because most featured images are squarer than 1.91:1, the old canvas had to discard a lot of height to fill the frame – a 1868×1443 chart lost 32% of its picture, taking the top and bottom off it. On the new 4:3 canvas the same image loses 3%.
- Fix (Pro): “Rewrite headlines to fit” no longer produces a truncated headline. The instruction to the AI set a character budget but nothing checked the reply, and a headline that came back over the budget was trimmed mid-word and then cached against that post – so it stayed wrong. The budget is now enforced: the AI gets one corrective attempt, and if it still overruns, your own headline is used instead. An over-length rewrite is never cached.
1.55.0
- New (Pro): SocialPromoter now tells you when a connection stops working. Until now a revoked token or a deleted developer app produced nothing but failed sends: on one site LinkedIn had been failing for a fortnight and X for seven weeks, 146 consecutive posts, with no warning anywhere. Repeated failures on the same account now raise a notice in the admin and send one email per incident, and an account that fails with an expired or revoked token is reported immediately rather than after several attempts. One message per incident, not one per failed post.
- Fix: The Platforms page no longer says “Connected” for an account that cannot post. The badge was based only on whether an account had ever been added, which stays true forever once you have connected once — so a broken connection read as healthy. It now reflects the last send attempt and shows “Not working” when every account on a platform is failing. If a platform you believed was connected now reads “Not working”, it was already broken; the page was not telling you.
- Fix: The Callback URL box now says what that URL is. It is one URL for the whole site, shared by every platform, and it was easy to read it as belonging to whichever platform you were looking at — or to hunt for a missing one on each card. It now says so, and splits the instruction: X and Facebook need it pasted into your own developer app before connecting, while LinkedIn and Bluesky do not use it at all.
- New: The Platforms page now links the setup guides for each platform, and points out the Help button in the bottom-right corner, which opens the support assistant. The page’s guidance panel has been rewritten around the things that actually stop a connection working — Facebook’s App domains field, X’s read-only default permission, and browsers autofilling an email address into the App ID box.
- New (Pro): The Health screen now shows a card for platform connections, with the state of each connected account.
- Update: Support Copilot 2.1.4. Its privacy notice now states exactly what the support ticket form sends, rather than describing it in general terms.
1.54.0
- Security: The Support Copilot now checks who is asking as well as where the request came from. Its admin requests were guarded by a single check that proves a request originated from a page the plugin rendered — which is not the same as proving the person sending it is allowed to make it. Those are now two separate checks, and both must pass. Nothing changes in normal use and no action is needed.
- New: An AI assistant can now read this site’s profile. If you use an assistant that speaks MCP, it can ask the site for the publication’s own context — what you cover and who you publish for — so it works from the same description SocialPromoter already uses when it writes copy. It is read-only, it is limited to users who could see that information in the admin anyway, and it needs WordPress 6.9 or later. On earlier WordPress nothing changes and nothing breaks.
- Fix: Clearing a field on the site profile now really clears it. Emptying the site context used to leave the previous wording behind in the older shared setting, and that copy kept feeding AI prompts — so a publication that had rewritten its description could find the old version still shaping generated posts. One safeguard is deliberately kept: an empty value cannot wipe a complete older profile on a site whose profile has never held that field.
- New: Generated copy is now framed by the publication’s highest-value audience where the site profile records one, so posts are pitched at the readers that matter most rather than at a general audience.
- Fix: Longer site profile notes are no longer flattened onto a single line each time they are saved.
- Fix: The shared profile no longer carries a site name it did not need, and is de-identified before it is passed between plugins.
- Update: Bundles PublisherKits Core 0.8.4 to 0.9.16. The shared Site Profile is mirrored onto the older shared options, so other PublisherKits plugins that have not moved to the core profile keep reading the same values. On a site running SocialPromoter alongside another PublisherKits plugin, this becomes the active core for both.
1.53.1
- Fix (Pro): The Assisted posts screen now uses SocialPromoter’s own styling rather than plain WordPress form styling, so it matches the rest of the plugin.
- Fix (Pro): On the Assisted posts screen, the destination’s name field was labelled only “Name”, which could be read as asking for the post’s title. It now says what it wants: the name of the group or community you are posting to. The other fields on that form gained short explanations too.
- Fix (Pro): The composer now shows the assisted destinations card even before you have added any, with a link to add one. Previously the card was hidden entirely until a destination existed, so the screen where you decide where a post goes never mentioned that assisted destinations were an option.
1.53.0
- New (Pro): Assisted posting, for the places a plugin is not allowed to post to. LinkedIn closed its groups API to third parties, and Meta removed group posting from every version of its API in April 2024, so no plugin can post to a LinkedIn or Facebook group for you — ours included. Assisted posting does everything else: add the group as a destination, schedule to it from the composer exactly as you would to a connected account, and SocialPromoter prepares the copy and the image and holds it until the moment you chose. Then it tells you it is ready, gives you the text on one click and a link straight to the group, and records that you posted it by hand. It can also suggest recent posts you have not offered to a group yet, and you can wave away one suggestion or all of them. Your history says a person posted it, never that SocialPromoter did, and there are no engagement figures for these — no API returns them, so any number would be invented.
- Fix: The Social panel in the post editor could show a blank status line, and hide a real one. A group of sends with nothing left to report — after cancelling a scheduled post, for instance — was still treated as the most recent activity, so it displaced the “Posted to X, LinkedIn” line for a post that really had gone out. Sends with nothing to report are now skipped, and a post with no reportable activity says so plainly.
- Fix (Pro): Campaign objective progress no longer counts posts that never went out. The channel report worked out which posts belonged to which campaign objective by looking for a send timestamp, but that timestamp is written whenever a post reaches its final state – including when a send fails – so posts that never reached the platform were being counted towards the objective as though they had. Skipped assisted posts would have counted the same way. Only posts that actually sent are counted now. Existing campaigns may show a lower figure than before, and in some cases noticeably lower. Nothing has been lost and no data has changed: the earlier number was overstating what went out, and the new one is the true count.
- Fix: Two SocialPromoter screens were rendering without the plugin’s own styling. Admin styles and scripts were loaded from a hand-maintained list of screens that had to be edited whenever a screen was added, and twice it was not — the Support screen (added in 1.52.0) and the Pro Channel report have both been showing default WordPress form styling rather than SocialPromoter’s, with the SP badge in the heading collapsing to plain text. The list is gone; the plugin now works out its own screens automatically, so this cannot happen again as screens are added.
- Fix: The “Show to user roles” setting under Settings now does what it says. It has always been saved, but nothing read it, so the promote-this-post reminder and the amber unpromoted banner appeared for every user who could edit the post regardless of which roles were ticked. Sites that never changed the setting are unaffected: the default is still administrators and editors.
1.52.2
- Fix: SocialPromoter could clear the site’s primary goal or audience description held in the shared PublisherKits site profile. Saving SocialPromoter’s settings sent both values even when the form only carried one, so whichever field was absent was blanked – overwriting a value set in another PublisherKits plugin. SocialPromoter now sends only the fields the form actually carried, and will no longer clear a value that is already set. Clearing a goal or audience is done where it is edited.
1.52.1
- Security: the Support Copilot now sends its requests through WordPress’s protected HTTP function, which validates the destination and refuses private, loopback and link-local addresses — including on redirects. The support endpoint is an administrator-editable setting, so this closes off the possibility of it being pointed at internal infrastructure. Recommended for all users.
- Security (Pro): Google Analytics credentials — the service account JSON, and the OAuth client secret and refresh token where they are used — are now encrypted before they are stored, so they no longer sit in plain text in database exports and backups. Existing connections keep working: the stored values are re-encrypted automatically the first time they are read, and nothing needs to be re-entered or reconnected.
1.52.0
- New: Support Copilot — a Help button on SocialPromoter admin screens that answers usage and setup questions in a popup chat, grounded in documentation matched to your installed version. It is read-only: it can explain, but it can never change anything on your site. Manage it under SocialPromoter > Support. Nothing is sent to the support service until a user who can manage this plugin’s settings accepts the in-widget privacy notice, and consent can be withdrawn at any time. Your connected account names and handles, access tokens, post copy and scheduled posts are never sent. See the External Services section for the full disclosure.
1.51.13
- Automated posting now spreads posts published close together across your posting window, instead of sending them all at once. The minimum gap was previously measured only from the last post that had actually been sent, so several articles published within a few minutes of each other could each be given the same slot and go out together.
1.51.12
- Facebook: image posts are now published explicitly as Page feed posts — the image is uploaded first, then attached to a feed post. This is a clearer publishing path and returns a proper post ID for engagement statistics.
- Branded images (Pro): the automatic crop now keeps faces in frame, anchoring to the head with headroom above it so crowns are no longer clipped on portrait photos.
1.51.11
- Fixed the History screen capability so it and its manage actions require the same permission (administrator), instead of appearing for editors who would then be refused.
- Hardened the Compose screen’s JavaScript: AJAX result text and all preview image URLs are now inserted as text/attributes rather than built into HTML strings.
- Removed the last vestigial licence-flag branches and comments from the free build; upgrade notices render through a small, clearly-named helper.
- Tidied several stale comments and one External Services wording detail.
1.51.10
- Post history is now a full, paginated free feature: a dedicated History screen lists every sent post and any failures, grouped by send, with per-send error messages and delete/clear-all. Engagement statistics on that screen remain a Pro feature. (Previously the free build showed only the most recent sends.)
- Removed the Pro licence flag from the free package entirely (it was already unused there); the upgrade notices simply always show, since this is the free tier.
- Removed the remaining branded-image preview fields and hooks from the free Compose screen; an add-on now enhances the preview through a neutral event.
- Minor: readme description and the accounts screen no longer mention Pro-only surfaces; tidied a few stale comments.
1.51.9
- Review-hardening: the bundled PublisherKits core library’s admin strings now use this plugin’s text domain in the shipped build; the plugin’s own Freemius bootstrap helpers and admin script globals were standardised to the plugin’s pkits_sp / pkitsSp prefix; and the free build no longer references the Pro licence flag at all (upgrade notices show unconditionally, since this package is the free tier).
- Compose: added a native Bluesky post preview (300-character layout) instead of falling back to the X preview; moved the last branded-image preview labels into the premium package.
1.51.8
- Fixed a fatal JavaScript syntax error in the free admin script left by the previous build’s code separation; every queue and posting behaviour it carries works again, verified by parser check on the shipped file.
- Fixed a Compose script error when clearing a selected post (a variable owned by the premium author-tagging module leaked into the free script).
- Completed the free/Pro separation the previous passes missed: the History screen’s row-management script, the signposting content-class subsystem and its term-search endpoint, the topic-balance scorer, the AI prompt-framing helper, the queue-item delete endpoint (premium History is its only caller), the branded-image font, and the Pro campaign-editor media screens now all live only in the premium package.
- Brand hashtags’ Fallback mode is now honoured on the free send path (skips posts already carrying two or more of their own hashtags).
- External Services now discloses upload.twitter.com (X image uploads); Bluesky wording corrected to “posts with clickable links”; settings copy no longer describes AI behaviour the free build does not have; the LinkedIn relay URL is written plainly in code.
1.51.7
- WordPress.org review compliance, final pass: the Compose screen’s remaining Pro scaffolding (author-tags container, image-headline editor script, branded-image fit notes, campaign field wiring) and the Pro admin script behaviours (engagement-stat refresh, clear-all-history, author-tag insertion) now live in separate premium-only files; the free package’s JavaScript references only AJAX actions the free package registers.
- Removed the Pro campaign link and page scaffolding from the free Accounts screen and admin loader.
- Security: publishing from Compose now requires the publish_posts capability plus per-post edit permission, and the publish-reminder status endpoint now checks per-post edit permission.
- Fixed: “Delete all failed” on the queue screen was rejected by its own handler; the delete-all sentinel now works.
- Renamed the private crypto class to the plugin prefix (PKITS_SP_Crypto) and removed its class_exists wrapper.
1.51.6
- WordPress.org review compliance, third pass — the free/Pro boundary is now implementation-level, not gate-level. Removed from the free build: the per-platform engagement-stat fetchers inside each connector (and the Facebook read_insights opt-in and OAuth scope), the “Boost this story” metabox controls and save handling, the reporting/GA4 configuration store, the analytics read API, the campaign/stats/campaign-link database tables and their migrations, automation-suggestion storage and approval surfaces, the full-history links and clear-history action, and the Compose screen’s AI drafting, campaign and author-tagging scaffolding (now separate premium files).
- The free build’s licence flag is now a plain false constant: nothing is consulted and nothing can be unlocked, because no premium implementation exists in the package.
- Brand hashtags now genuinely blend on the free build’s sends (previously the blending only ran in Pro); modes and per-platform caps are honoured (‘fallback’ applies when a post carries fewer than two of its own hashtags).
- The plugin description and platform list now describe the free plugin only, and include Bluesky.
1.51.5
- WordPress.org review compliance, second pass: every Pro feature is now delivered as separate premium-only code that is physically absent from the free build — engagement statistics (class, scheduled refresh, queue display and refresh actions), WP Job Manager support (now a Pro integration module the free code exposes filters for), AI copy drafting (client, prompt library, settings and defaults), the GA4 connection, channel-report and PDF/UTM settings and their save handling, and the metabox author-tagging helpers. The free build no longer contains any licence-gated functionality, and the licence flag no longer carries a force override there.
- Multiple accounts per platform is now correctly listed as a free feature (the code never limited it), and brand hashtags are listed free too. Engagement statistics move to the Pro list, matching the code.
- Removed the remote Google Fonts stylesheet from admin screens; the UI now uses bundled system font stacks (no external requests).
- Fixed a Compose-screen script error: a PHP constant leaked into JavaScript as an undefined name when a post was selected.
- WordPress.org review compliance: the Pro branded-image pipeline (resizing to platform canvases, logo watermark, headline bars) no longer ships in the free build in any form. The image code is split into a free handler (fetch, validate, clean up – free posting is unchanged and posts images exactly as supplied) and a separate Pro-only brander that is physically removed from the free build, along with its settings panel, live preview, save handling and Compose headline editor.
- Fixed: the Compose screen could fatal on the free build (an unguarded reference to the Pro AI copy class).
- Fixed: the Brand hashtags settings (a free feature) were only saved when Pro was active; they now save on the free build too.
- The AI connector diagnostic no longer reads any core AI credential option; it only reports whether a connector’s provider plugin is active.
- External Services: the PublisherKits LinkedIn connect relay entry now spells out exactly what is sent (a one-time ticket, nonce and signature during the connect step – never post content or personal data) with terms and privacy policy links, and every platform API entry now carries both terms and privacy links.
- Escaping: admin-ajax URLs printed into inline scripts now use esc_url (output escaping) rather than esc_url_raw.
1.51.4
- Facebook: new optional “Show link-click counts” setting on the Platforms page. Tick it (after adding the read_insights permission to your own Facebook app – available at Standard Access for Pages you administer, no App Review) and reconnect the Page to see link clicks on sent posts, alongside likes and comments.
- Facebook: post impressions and reach are no longer requested – Facebook removed those metrics from its API for all apps, so they cannot be shown. Requesting them alongside the working metrics was also occasionally stopping likes, comments and clicks from appearing; that is fixed.
- Updated the on-screen stats notes so they describe what each platform actually provides today.
1.51.3
- Fixed: campaign report PDFs could fail on sites running another PDF-generating plugin. The bundled PDF library now ships its complete font set, always uses its own fonts, and a PDF failure now shows a clear error instead of a broken page. The PDF library is no longer included in the free build (campaign reports are a Pro feature).
1.51.2
- Fixed: two features had silently never worked – the author tagger’s curated-topic candidates and the channel report’s topic axis both called a Classifier method that never existed, so they always fell back to tags/taxonomy. Both now read the shared PublisherKits topic framework, so they work on every site with topics set up (deterministic everywhere, AI where the Classifier runs).
1.51.1
- The “Brand voice / extra context” setting is now the shared PublisherKits Site Profile context: one value, editable here, on the Classifier’s Configuration screen, or under PublisherKits > Site Profile – used by every PublisherKits plugin. AI copy reads the shared profile first (older storage remains as a fallback), and the publication context now appears exactly once per AI prompt.
- SEO keywords: when none are set here, AI copy falls back to the shared Site Profile’s keywords.
1.51.0
- New: SocialPromoter now bundles the PublisherKits Core Library — the shared site profile and topic framework used across the PublisherKits suite. Fill in the Site Profile and Topics once (Site Profile menu) and every PublisherKits plugin, including SocialPromoter, uses the same answers.
- New: automated reposting now balances topics. The repost picker gently prefers posts from topics your social channels have under-served recently, so the auto-queue stops fixating on one corner of your site. Requires the site topic framework to be set up; behaviour is unchanged without it.
- Improved: AI copy drafting is grounded in the shared Site Profile when populated (sector, house style, publication context), in addition to the audience and goals framing it already used.
1.50.1
- Compatibility: admin CSS and JavaScript are now registered through the standard WordPress enqueue functions.
- Housekeeping: removed the redundant text-domain loader (WordPress loads translations automatically) and tidied the plugin for the WordPress.org directory.
1.50.0
- Security: posting and scheduling to your social accounts now require publish-level permission (Author and above) plus edit access to the specific post, and cancelling/deleting queued or failed sends now requires administrator permission. Previously a Contributor-level user could post as …
