slogan3

Ontwikkel een geavanceerd content schedule systeem in Craft CMS

description

Met deze prompt kun je een efficiënt en betrouwbaar systeem opzetten voor het automatisch publiceren en archiveren van content in Craft CMS. Dit bespaart tijd, vermindert handmatige fouten, en maakt contentbeheer schaalbaar en consistent, wat beter is dan handmatige planning of eenvoudige plugins zonder maatwerk.

prompt

Help me een geavanceerd content schedule systeem te ontwikkelen in mijn Craft CMS website. Ik wil content automatisch publiceren en archiveren volgens het volgende schema: <voer het publicatie- en ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze handleiding om een geavanceerd content schedule systeem in Craft CMS te ontwikkelen dat automatisch publiceert en archiveert volgens jouw schema: ### Stap 1: Voorbereiding – Zorg dat je Craft CMS correct is ingesteld - Zorg dat je Craft CMS versie up-to-date is. - Maak een sectie (bijvoorbeeld "Nieuws" of "Blog") waar de content wordt gepubliceerd. - Voeg velden toe voor publicatie- en archiveringsdata (optioneel, afhankelijk van je wensen). ### Stap 2: Gebruik van native cron jobs / taakplanner Craft CMS heeft geen ingebouwde cron, maar je kunt gebruik maken van externe tools zoals CRON op je server, of plugins zoals [Sprout Tasks](https://sprout.barrelstrengthdesign.com/docs/craft-3/tasks/overview) of [Free Cron](https://github.com/craftcms/console). #### Optie 1: Gebruik van server cron jobs - Maak een PHP-script dat je publicatie- en archiveringsacties uitvoert. - Plan via je server een cronjob die dit script maandelijks op de eerste dag om 09:00 draait. ### Stap 3: Schrijf een PHP script voor publicatie en archivering ```php <?php // publicatie_archief.php use craft\elements\Entry; use craft\elements\EntryQuery; use craft\elements\db\ElementQueryInterface; require_once '/path/to/craft/vendor/autoload.php'; $app = require_once '/path/to/craft/web/index.php'; $today = new DateTime('first day of this month 09:00:00'); $publicatieDatum = $today->format('Y-m-d H:i:s'); // 1. Publiceer nieuwe content (bijvoorbeeld op basis van een bepaalde status of veld) $entriesToPublish = Entry::find() ->section('jouwSectie') ->status(['pending']) // of een andere indicator dat het nog niet gepubliceerd is ->all(); foreach ($entriesToPublish as $entry) { // Stel de publicatie datum in en verander status naar 'live' $entry->postDate = new DateTime($publicatieDatum); $entry->enabled = true; // publiceer Craft::$app->elements->saveElement($entry); } // 2. Archiveer oude content (bijvoorbeeld content ouder dan 1 maand) $archiveDate = new DateTime('first day of -1 month 09:00:00'); $entriesToArchive = Entry::find() ->section('jouwSectie') ->postDate(['<', $archiveDate->format('Y-m-d H:i:s')]) ->status(['live']) // alleen live content ->all(); foreach ($entriesToArchive as $entry) { // Bijvoorbeeld, zet status op 'archived' of verwijder $entry->enabled = false; // archiveren Craft::$app->elements->saveElement($entry); } ?> ``` ### Stap 4: Plan je cronjob Maak een cronjob aan die maandelijks op de eerste dag om 09:00 draait: ```bash 0 9 1 * * /usr/bin/php /pad/naar/publicatie_archief.php ``` ### Stap 5: Tips voor betrouwbaarheid en schaalbaarheid - **Gebruik queues**: Voor grote aantallen entries, zet de publicatie/archivering in een queue om timeouts te voorkomen. - **Logging**: Voeg logging toe in je script om te controleren of alles correct is uitgevoerd. - **Backup**: Maak regelmatig backups voordat je automatische wijzigingen uitvoert. - **Plugin-opties**: Overweeg plugins zoals [Sprout Tasks](https://sprout.barrelstrengthdesign.com/docs/craft-3/tasks/overview) voor het plannen van taken binnen Craft zelf, zonder externe cron. ### Samenvatting - Gebruik een extern cron job voor regelmatige automatisering. - Schrijf een PHP script dat content publiceert en archiveert op basis van datums. - Test je script uitvoerig voor live gebruik. - Overweeg queue systemen en logging voor betrouwbaarheid. Wil je dat ik je help met het schrijven van een meer gedetailleerd of aangepast script?
provider: deepseek
model: deepseek-chat
Zeker! Ik help je bij het opzetten van een geavanceerd content schedule systeem in Craft CMS. Hier zijn stapsgewijze instructies: ## 1. Gebruik de native Scheduler (Aanbevolen) Craft CMS heeft een ingebouwde scheduler sinds versie 3.4. **config/app.php:** ```php return [ 'bootstrap' => ['my-scheduler'], 'components' => [ 'my-scheduler' => [ 'class' => \mynamespace\schedulers\MyScheduler::class, ], ], ]; ``` ## 2. Maak een Custom Scheduler Class **modules/schedulers/MyScheduler.php:** ```php <?php namespace mynamespace\schedulers; use Craft; use craft\elements\Entry; use craft\helpers\DateTimeHelper; use yii\base\Component; class MyScheduler extends Component { public function init() { parent::init(); // Plan de maandelijkse taak Craft::$app->onInit(function() { $this->scheduleMonthlyPublishing(); }); } private function scheduleMonthlyPublishing() { // Elke dag om 08:55 controleren (5 minuten voor publicatie) Craft::$app->getQueue()->delay(5 * 60)->push(new MonthlyPublishJob()); } } ``` ## 3. Maak een Queue Job **queue/jobs/MonthlyPublishJob.php:** ```php <?php namespace mynamespace\queue\jobs; use Craft; use craft\queue\BaseJob; use craft\elements\Entry; use DateTime; class MonthlyPublishJob extends BaseJob { public function execute($queue) { $currentDate = new DateTime(); $firstOfMonth = new DateTime('first day of this month 09:00:00'); // Alleen uitvoeren op de eerste dag van de maand na 09:00 if ($currentDate >= $firstOfMonth && $currentDate->format('H:i') >= '09:00') { $this->publishScheduledContent(); $this->archiveOldContent(); } } private function publishScheduledContent() { $entries = Entry::find() ->section('yourSectionHandle') ->status(Entry::STATUS_PENDING) ->postDate(['and', '<= ' . date('Y-m-d H:i:s')]) ->all(); foreach ($entries as $entry) { Craft::$app->getElements()->saveElement($entry); } } private function archiveOldContent() { $threeMonthsAgo = (new DateTime())->modify('-3 months'); $entries = Entry::find() ->section('yourSectionHandle') ->status(Entry::STATUS_LIVE) ->dateUpdated(['<', $threeMonthsAgo->format('Y-m-d H:i:s')]) ->all(); foreach ($entries as $entry) { $entry->enabled = false; Craft::$app->getElements()->saveElement($entry); } } public function getDescription() { return 'Maandelijkse content publicatie en archivering'; } } ``` ## 4. Configureer Cron Job **Voeg toe aan je server crontab:** ```bash # Elke 5 minuten uitvoeren */5 * * * * /usr/bin/php /path/to/your/craft/craft queue/run ``` ## 5. Alternatief met Plugin (Verduidelijk) **Gebruik de EE Scheduler plugin:** ```twig {# In je template of via plugin config #} {% set schedule = craft.scheduler.schedule() .job('\\mynamespace\\queue\\jobs\\MonthlyPublishJob') .cron('0 9 1 * *') .withoutOverlapping() .description('Maandelijkse publicatie om 09:00 op de 1e') %} ``` ## 6. Geavanceerde Monitoring **Monitoring class toevoegen:** ```php class ContentMonitor { public static function logSchedulerActivity() { $logEntry = new LogEntry(); $logEntry->message = 'Scheduler uitgevoerd: ' . date('Y-m-d H:00:00'); $logEntry->save(); // Stuur notificatie bij fouten if (/* error condition */) { Craft::$app->getMailer()->compose() ->setTo('admin@example.com') ->setSubject('Scheduler Fout') ->setTextBody('Er is een fout opgetreden in de maandelijkse scheduler') ->send(); } } } ``` ## 7. Tips voor Betrouwbaarheid 1. **Gebruik database locks** om overlapping te voorkomen 2. **Implementeer retry logic** voor failed jobs 3. **Log alles** voor monitoring en debugging 4. **Test grondig** in development omgeving 5. **Gebruik queue priorities** voor kritieke taken ## 8. Schaalbaarheidsmaatregelen ```php // Chunk processing voor grote datasets $query = Entry::find()->status(Entry::STATUS_PENDING); Craft::$app->getElements()->inBatches($query, 100, function($entries) { foreach ($entries as $entry) { // Verwerk entries in batches } }); ``` Dit systeem is schaalbaar, betrouwbaar en maakt gebruik van Craft's native queue system. Zorg ervoor dat je server cron correct is ingesteld en test de configuratie grondig voordat je naar production gaat.