learndash/manage-course creates a new course or updates an existing one. Post fields and LearnDash settings can both be set in the same call.
Settings are written through LearnDash’s own accessor, so the meta LearnDash mirrors internally stays consistent. Writing the meta directly leaves the two copies disagreeing, and LearnDash reads whichever one it happens to read.
At a glance
| Ability | learndash/manage-course |
| Toolset | LearnDash — toolset/learndash |
| Group | LearnDash › Courses |
| Requires | AcrossAI Pro, plus LearnDash LMS active on the site |
| Capability | manage_options |
| Safety | Writes data |
| Repeatable | Idempotent — running it twice leaves the same result |
| Ships in | AcrossAI Pro 0.9.16 and later |
How it works
That accessor detail is the reason to use this rather than a generic post write. LearnDash keeps several settings in more than one place, and a direct meta write updates one copy — producing a course whose price shows correctly in the admin and is ignored at checkout.
The settings worth knowing are the access ones. course_price_type takes open, free, paynow, subscribe or closed, and course_price goes with the paid ones.
course_prerequisite_enabled gates the course behind another, and course_disable_lesson_progression lets learners move freely instead of in order.
certificate names the template issued on completion — assign a template built with learndash/manage-certificate-template here.
Read the course first. The settings object is large and partial knowledge of it is how a write ends up changing something nobody mentioned.
Idempotent.
Input
| Name | Type | Required | What it is |
|---|---|---|---|
action | string | Yes | create or update. |
course_id | integer | For update | Which course. |
title | string | For create | The course title. |
content | string | No | The course description. |
status | string | No | Post status. |
author | integer | No | Course owner. |
settings | object | No | LearnDash settings keys. |
What comes back
| Name | Type | What it is |
|---|---|---|
course | object | The course after the write. |
success | boolean | Whether the call completed. |
message | string | A one-line summary of what happened, suitable for showing a human. |
error_code | string | Present only on failure — a stable machine-readable reason, such as a missing field, a wrong field type or an unmet confirmation. |
Example
Ask your assistant:
Make this course free to enrolled members.
It resolves to one call:
{
"ability": "learndash/manage-course",
"parameters": {
"action": "update",
"course_id": 412,
"settings": { "course_price_type": "free" }
}
}Worth knowing
- Written through LearnDash’s accessor, so mirrored meta stays in step.
- A direct meta write produces a course that behaves differently from how it displays.
- Read the current settings first — the object is large.
- Idempotent.
Related abilities
- LearnDash Get Course — read the settings first
- LearnDash Attach Step — put content in it
- LearnDash Manage Certificate Template — the certificate it can issue
Get the plugins:
AcrossAI Abilities Manager · AcrossAI MCP Manager
Browse the rest: Every ability, by category