# Scheduled publication
This guide will explain how to create an article schedule system.
# Introduction
This guide will use this draft system guide. You should review it first to understand the draft/published status and the Article API that we will use in this guide.
What we want here is to be able to set a publication date for an article, and at this date, switch the draft
status to published
.
# Example
For this example, we will have to add a publish_at
attribute to the Article Content Type.
- Click on the Content Type Builder link in the left menu
- Select the Article Content Type
- Add another field
date
attribute namedpublish_at
withdatetime
type
And add some data with different dates and status to be able to see the publication happen.
Make sure to create some entries with a draft status
and a published_at
that is before the current date.
The goal will be to check every minute if there is draft
articles that have a publish_at
lower that the current date.
# Create a CRON task
To execute a function every minutes, we will use a CRON task.
Here is the full documentation of this feature.
Path — ./config/functions/cron.js
module.exports = {
'*/1 * * * *': () => {
console.log('1 minute later');
},
};
Make sure the enabled cron config is set to true in ./config/environments/**/server.json
file.
TIP
Please note that Strapi's built in CRON feature will not work if you plan to use pm2
or node based clustering. You will need to execute these CRON tasks outside of Strapi.
# Business logic
Now we can start writting the publishing logic. The code that will fetch all draft
Articles with a published_at
that is before the current date.
Then we will update the status
of all these articles to published
.
Path — ./config/functions/cron.js
module.exports = {
'*/1 * * * *': async () => {
// fetch articles to publish
const draftArticleToPublish = await strapi.api.article.services.article.find({
status: 'draft',
publish_at_lt: new Date(),
});
// update status of articles
draftArticleToPublish.forEach(async article => {
await strapi.api.article.services.article.update({ id: article.id }, { status: 'published' });
});
},
};
And tada!