=== saidweekly ===
Contributors: martinmillerco
Tags: editorial calendar, content, blogging, drafts, writing
Requires at least: 6.4
Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 1.1.2
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Plans an editorial calendar for your business, then writes researched articles and delivers them to WordPress on the days you choose.

== Description ==

saidweekly plans an editorial calendar for your business and turns it into finished articles, delivered to your WordPress site on the days you choose.

The calendar lives inside WordPress. Add and edit topics, lock the ones you want kept, import and export spreadsheets, and decide whether articles arrive as drafts or publish on their own. The research, planning, writing and featured images come from the saidweekly service.

**The free plan needs no account, card or license key.** Open Settings → saidweekly, click Start the free plan, and the site is enrolled. The free plan writes one article a calendar month. Each article ends with the line "Article provided by saidweekly", linking to saidweekly.com; a button under Settings → saidweekly removes it.

Paid plans (https://saidweekly.com/pricing) are annual, cover one website, and write one article a week, three a week, or one every day. Paste the license key into the same settings screen to activate.

= How the calendar is planned =

saidweekly researches your business, your area and what your site already covers, using live web search and a read of your own pages. It then proposes a topic for each open date in the next 90 days, each with its reasoning and sources. The calendar is extended every month. On paid plans the research is refreshed every quarter and the whole calendar can be regenerated twice a year; the free plan can regenerate once a year.

The calendar is yours to change. Edit or lock any topic, add your own, or import a list from a spreadsheet. Nothing you wrote, edited or locked is ever changed by the plugin.

= How articles arrive =

Pick the days your articles fall on. Seven days before each date, the saidweekly service writes the article, chooses a featured image and delivers it to your site as a draft. Each draft includes:

* The article body, written for your business from the details you enter under Branding
* An SEO title and meta description (the description also becomes the post excerpt)
* A featured image with a filename and alt text, stored as WebP unless you turn that off
* Your category and a short list of post tags
* A call to action linking wherever you choose
* The scheduled date from its topic, so clicking Publish schedules the post instead of publishing it immediately

= What you control =

* **Publishing.** Articles arrive as drafts. Automatic publishing stays off until you switch it on and confirm. It applies only to articles written after that, and never publishes anything past its date.
* **Topics.** Titles, keywords, categories and dates are yours to set, and any topic can be locked.
* **Pausing.** Pause the whole site at any time. An article whose topic changed after it was written is held for your review.
* **Status.** The calendar shows where every topic stands: Planned, Queued, Drafted, Scheduled, Published or Private.
* **Warnings.** If the calendar runs low, the site administrator is emailed.

= What leaves your site =

Nothing is sent anywhere until you start the free plan or activate a paid plan under Settings → saidweekly. After that, the plugin talks only to the saidweekly service and downloads featured images from Pexels. Exactly what is sent, and when, is listed under External services below.

The service writes with Anthropic's Claude models, researches with Anthropic's web search, and chooses images from Pexels. Your site never holds a key for any of these providers and never calls them directly. The service is operated by Martin Miller Software Consulting LLC under its terms of service (https://saidweekly.com/terms) and privacy policy (https://saidweekly.com/privacy).

= Requirements =

* PHP 8.0 or later
* A site reachable over HTTPS, so the saidweekly service can confirm it and deliver articles to it
* For a paid plan, a license key from saidweekly.com

== External services ==

This plugin is the WordPress half of a hosted service. On its own it provides the editorial calendar; everything else comes from the two external services described here. Neither is contacted until you start the free plan or activate a paid plan under Settings → saidweekly.

= The saidweekly service =

Operated by Martin Miller Software Consulting LLC, doing business as saidweekly. Terms of service: https://saidweekly.com/terms. Privacy policy: https://saidweekly.com/privacy.

The service researches your business, plans the editorial calendar, writes the articles and chooses the featured images. Data is sent at these times, and only these:

* **When you start the free plan:** this site's address, the address articles should be delivered to, and the email address and business name shown on that screen. If you tick the box asking for occasional news about saidweekly (unticked by default), that answer is sent too. It controls marketing email only, never service notices.
* **When you activate a paid plan:** your license key, the site address and the delivery address. The key is used once and never stored on your site.
* **Twice a day:** the service checks in and your site replies with the identifiers of the jobs that are due. Nothing else.
* **When an article is written:** the topic (title, keyword, notes, word count), your Branding details, the identifiers of recently used photographs, the stored research summary and your recent article titles. The service holds these in memory while it writes and keeps none of it afterwards.
* **When a calendar is planned:** your Branding details and the public addresses of your own pages, which the service reads. What it finds is stored on your site, with every source.
* **When the Settings page opens:** a request for your plan and credit balance.
* **Billing buttons** on the Settings page open the service's payment provider, Stripe, in your browser.

The service uses Anthropic's Claude models and web search to write and research, and the Pexels API to choose photographs. Your site never holds a key for these providers and never calls them directly. The service's privacy policy covers what it shares with them.

= Pexels =

Terms of service: https://www.pexels.com/terms-of-service/. Privacy policy: https://www.pexels.com/privacy-policy/. License: https://www.pexels.com/license/.

When the service delivers an article, it names a photograph on images.pexels.com that it has already chosen. Your site downloads that one file, once, into your media library as the featured image, the same way WordPress's own media sideloading works, and serves it from your site from then on. Nothing is hot-linked, and no page on your site loads anything from Pexels. The request carries no data about you or your site beyond an ordinary HTTP request for the file. If the download fails, the article still arrives, without a featured image.

== Installation ==

1. Install the plugin from the WordPress plugin directory under **Plugins → Add New**, or upload the zip from saidweekly.com under **Plugins → Add New → Upload Plugin**. Activate it.
2. Open **Settings → saidweekly** and click **Start the free plan**. Check the email address and business name shown, and the site is enrolled. No account, card or license key is needed. For a paid plan, choose one at https://saidweekly.com/pricing, paste the license key from your confirmation email into the same screen, and save. A site on the free plan upgrades the same way.
3. Open **Content Calendar → Branding** and fill it in. This is what makes the writing sound like your business; generation will not produce useful copy without it.
4. Fill the calendar: generate one under **Content Calendar → Generate Calendar**, add topics under **Content Calendar → Add New**, or import a list under **Content Calendar → Bulk Import**.
5. Under **Settings → saidweekly**, pick the days your articles fall on and whether they arrive as drafts or publish automatically. Your first article is written as soon as setup is complete.

A paid plan's license key is used only to activate the site. It is never stored in the database, so the field is empty afterwards; that is expected. The free plan has no key: if you reinstall the plugin, click Start the free plan again and the site picks up where it left off.

== Frequently Asked Questions ==

= How is the editorial calendar made? =

Once Branding is complete and the site is activated, open Content Calendar → Generate Calendar. saidweekly searches the web around your business and its area, reads your own site to see what is already covered, and stores what it finds on your site with every source. It then plans one topic for each open date in the next 90 days, each with a short explanation and the sources it rests on, shown on the topic itself.

Research never measures search rankings, search volumes or keyword difficulty, and never invents services, prices, qualifications or sources. Generating a calendar writes no article and spends no credits.

Paid plans can regenerate the whole calendar twice a subscription year. Only topics that saidweekly proposed, and that you have not edited, locked or had written, are replaced.

= Will it publish anything without me? =

Not unless you tell it to. Every article arrives as a draft. If you switch on automatic publishing under Settings → saidweekly and confirm, articles written after that go live on their scheduled date. Three kinds of article still wait for you: one whose date has passed, one whose topic changed after it was written, and one that arrived without a featured image.

= What does the plugin do without an account? =

Everything that lives on your site: the calendar, topics, locking, spreadsheet import and export, and the scheduling and publishing modes. Research, planning and writing are the service's work and need an enrolled site. You do not need an account for that either: the free plan starts from inside the plugin, with no sign-up, card or key.

= Starting the free plan or activating says my permalinks are not supported. What now? =

Go to Settings → Permalinks and choose anything other than "Plain"; the default "Day and name" is fine. Then try again. saidweekly addresses your site by URL path, and Plain permalinks put the address in a query string instead. Nothing was sent and no license key was used, so the same key will work once the setting is changed.

= Where do the featured images come from, and can I use them? =

From Pexels (https://www.pexels.com/license/). The Pexels License allows free commercial use with no attribution required, which is why it was chosen. The service picks the photograph; your site downloads that one file into your media library and serves it from there (see External services).

Two limits are worth knowing, and they apply to any free stock library:

* **No model or property releases.** Photographs of identifiable people, private property, logos or artwork may not be usable in ways that imply a person or brand endorses your business. This matters most for advertising and for sensitive subjects.
* **No indemnification.** Paid stock libraries will often defend you if someone brings a claim about an image. Free libraries do not. The risk is small, but it is yours.

If a delivered image shows a recognizable person and the article could read as an endorsement, or the subject is sensitive, replace the image before publishing. Swapping the featured image is an ordinary WordPress edit, and nothing in this plugin will change it back.

= Can I get my topics back out as a spreadsheet? =

Yes. **Content Calendar → Export** downloads every topic as a CSV with the same columns Bulk Import uses. Edit the file and upload it again to add more topics. Topics you already have are recognized by title and skipped, so re-uploading the whole file creates only the new rows.

= Why was my date rejected? =

A date like `03/04/2026` means 3 April in most of the world and 4 March in the United States. Rather than guess and schedule a post a month off, the importer asks which order your file uses, on the screen after upload. Dates written `YYYY-MM-DD`, or with the month spelled out such as `17 August 2026`, are never ambiguous and always work.

= My topic says Drafted, but I deleted the article. =

Moving a generated article to the trash leaves its topic as Drafted and keeps the link, because the trash is reversible. Deleting the article permanently returns the topic to Planned with no date, so it is not picked up again until you reschedule it.

= I copied the site to a staging server and it stopped working. =

That is deliberate. The plugin compares the site address with the one it was activated on, and a copy running with the original site's credentials is treated as unregistered. Activate the staging copy with its own license key, or leave it inactive. Do not tick "Move my subscription to this site" on a staging copy: that moves your live site's subscription to the copy, and the live site stops receiving articles.

= My site moved to a new address. Do I need a new license? =

No. Install the plugin on the new site, go to Settings → saidweekly, paste your existing license key and tick "Move my subscription to this site". Your credits and schedule move with it, and the old address stops receiving articles. A subscription can move three times a subscription year, and we email you each time. If you get that email and did not move your site, contact support straight away.

= What happens when I delete the plugin? =

Your topics, research, articles and settings stay in WordPress. Whether the site's enrollment with the service (its site identifier and signing secret) is removed too is a checkbox under Settings → saidweekly. The copy installed from the WordPress plugin directory removes it by default; the copy downloaded from saidweekly.com keeps it, so a reinstall picks up where it left off without a second license key. Either way, your account, plan and credits stay with the service until you cancel, and the service's records of the site are removed on the schedule in the privacy policy.

= Can I point the plugin at a different generation service? =

No. The service address is part of the product, not a site setting, so there is no field for it.

== Screenshots ==

1. Settings → saidweekly on a new install. Start the free plan with no account, card or license key, or paste a paid plan's key. The screen says what is sent before you click.
2. The Content Calendar: every topic with its date, keyword, category and status, from Planned to Published.
3. Generate Editorial Calendar: the research saidweekly gathered about the business, with every source, and the 90-day calendar planned from it.
4. A delivered article in the editor, scheduled for its date, with the passages saidweekly asks you to check before publishing.

== Changelog ==

= 1.1.2 =
* The Start the free plan screen has an unticked box for occasional news about saidweekly. Your answer is recorded with your account and controls marketing email only.

= 1.1.1 =
* Removing the "Article provided by saidweekly" line from delivered articles is now a button under Settings → saidweekly, available on any plan, rather than something that happened only when the service reported a paid plan.
* The "Hide this notice" link on the start notice hides it for good.
* Every script the plugin uses is enqueued; no screen prints a script tag or an inline event handler.
* The readme documents the two external services the plugin connects to, with terms and privacy links.

== Upgrade Notice ==

= 1.1.2 =
A marketing opt-in box on the Start the free plan screen. No action needed after upgrading.

= 1.1.1 =
Removing the saidweekly line from articles is a button under Settings → saidweekly. No action needed after upgrading.
