# Create Article

<!-- meta: type=create-article; location=Articles; category=Step (action); platforms=Joomla and WordPress (where applicable) -->

## Overview

Creates a new Joomla article with title, intro/full text, category, publishing options, SEO meta, images, tags, and author.

When the flow reaches this step, JOrchestrator executes **Create Article** against your linked site or an external integration, using the field values you set on **General** and **Design**. Downstream steps can read the output payload fields defined for this node.

## Why use this node

Create Article is a **action step** in the **Articles** group. Action steps run in the middle or end of a flow. They perform work on your CMS, call external services, or transform data for the next step.

Typical reasons teams add **Create Article** to a flow:

- Create Article on your linked Joomla site when the flow reaches this step
- Create article based on webhook, schedule, or CMS event data
- Integrate Articles operations with messaging, AI, or database steps in one canvas

## Example workflows

Common patterns on the canvas:

1. **Trigger or Webhook** → upstream steps → **Create Article** → **Send Email** or CMS update
2. **Scheduled trigger** → **Create Article** → **Debug** (while testing) → production action

## How to set it up

General tab — title, category, state, tags, and metadata. Design tab — intro/full HTML, intro and full article images (path, URL, base64, or {{upload.path}}).

## Good to know

Image fields accept media paths under /images or placeholders from upstream AI/upload nodes.

## Properties panel

The designer shows these tabs for this node:

| Tab | Purpose |
|-----|---------|
| **Info** | Plain-language description and output payload fields for downstream steps |
| **General** | Canvas label and read-only node ID |
| **AI** | Optional assistant to help draft settings from plain language |
| **Design** | Node-specific configuration fields |

### System (automatic — not edited by the user)

These fields are managed by the designer or runtime — you do not type into them directly:

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `_nodeId` | Node ID | `node-id` | No | — | — |
| `_payloadFields` | Available Fields | `payload-panel` | No | — | — |

### User-configured — General tab

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `label` | Label | `text` | No | — | Node label |
| `title` | Article Title | `payload-text` | **Yes** | — | Title or drag a payload field here |
| `state` | State | `select` (`published` \| `unpublished` \| `archived`) | No | — | — |
| `tagLabels` | Tag labels from payload (optional) | `payload-text` | No | — | ["News","Fashion"] or {{node_id.tags}} Optional JSON array of tag **titles** after resolving `{{placeholders}}`, e.g. `["News","Fashion"]` or `{{node_id.tags}}`.

If a title does not exist in Joomla Tags, it is **created** when the flow runs (same defaults as Create Tag: under root, published). Requires permission to create tags. Values are **merged** with **Tags (existing)** above and deduplicated. Leave both empty to leave article tags unchanged on update. |
| `alias` | Alias (optional) | `payload-text` | No | — | URL segment; auto from title if empty |
| `access` | Access | `select` (`1` \| `2` \| `3` \| `4` \| `5` \| `6` \| `7` \| `8`; default: `1`) | No | — | — |
| `featured` | Featured | `toggle` (default: `false`) | No | — | — |
| `note` | Note (optional) | `text` | No | — | Internal note |
| `publish_up` | Start publishing | `datetime` | No | — | Optional |
| `publish_down` | Finish publishing | `datetime` | No | — | Optional |
| `createdByAlias` | Author alias (optional) | `text` | No | — | Displayed author name override |
| `metadesc` | Meta description | `textarea` | No | — | SEO description (optional) |
| `metakey` | Meta keywords | `payload-text` | No | — | Comma-separated keywords (optional) |

### User-configured — Design tab

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `introtext` | Intro Text | `wysiwyg` | No | — | Article intro |
| `fulltext` | Full Text | `wysiwyg` | No | — | Article content |
| `imageIntro` | Intro image | `article-image-source` | No | — | {{ai_node.image}} or images/… or data:image/png;base64,… Drag {{node.image}}, {{node.path}}, or {{node.url}} from a prior step, paste data:image/…;base64,…, pick from Joomla media below, or enter images/… path. When the resolved value is image bytes (data URI, raw base64, or https URL), it is saved under /images using the save options below (same rules as Upload Media). |
| `imageIntroUseRandomName` | Intro image: random file name when saving bytes | `toggle` (default: `true`) | No | — | On: auto name under folder. Off: use path below as full images/… path. |
| `imageIntroFolder` | Intro image: folder under /images | `payload-text` | No | — | e.g. articles/2025 — optional when saving bytes from {{placeholders}} |
| `imageIntroSavePath` | Intro image: path under folder | `payload-text` | No | — | Random name ON: subfolders only (e.g. hero). OFF: full path + filename (e.g. hero/cover.jpg). |
| `imageIntroRandomSalt` | Intro image: name prefix (optional) | `random-name-salt` | No | `imageIntroUseRandomName === true` | — |
| `imageIntroAlt` | Intro image alt text | `payload-text` | No | — | Optional |
| `imageIntroCaption` | Intro image caption | `payload-text` | No | — | Optional |
| `imageFulltext` | Full article image | `article-image-source` | No | — | {{ai_node.image}} or images/… or data:image/png;base64,… Drag {{node.image}}, {{node.path}}, or {{node.url}} from a prior step, paste data:image/…;base64,…, pick from Joomla media below, or enter images/… path. When the resolved value is image bytes (data URI, raw base64, or https URL), it is saved under /images using the save options below (same rules as Upload Media). |
| `imageFulltextUseRandomName` | Full article image: random file name when saving bytes | `toggle` (default: `true`) | No | — | On: auto name under folder. Off: use path below as full images/… path. |
| `imageFulltextFolder` | Full article image: folder under /images | `payload-text` | No | — | e.g. articles/2025 — optional when saving bytes from {{placeholders}} |
| `imageFulltextSavePath` | Full article image: path under folder | `payload-text` | No | — | Random name ON: subfolders only (e.g. hero). OFF: full path + filename (e.g. hero/cover.jpg). |
| `imageFulltextRandomSalt` | Full article image: name prefix (optional) | `random-name-salt` | No | `imageFulltextUseRandomName === true` | — |
| `imageFulltextAlt` | Full article image alt text | `payload-text` | No | — | Optional |
| `imageFulltextCaption` | Full article image caption | `payload-text` | No | — | Optional |

### CMS-backed or hybrid (loaded from the linked site at design time)

These fields can pull live options or values from the Joomla/WordPress site linked to the flow:

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `createdBy` | Author | `email-recipient` | No | — | User ID, {{placeholder}}, or select Joomla user… Value kind: `userId` |

### CMS-backed (options from the linked site)

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `catid` | Category | `category-select` | **Yes** | — | Select category |
| `tagIds` | Tags (existing) | `tags-multi` | No | — | Select one or more Joomla tags |
| `language` | Language | `content-language-select` | No | — | Select language (* = all) |

### CMS site configuration (not on this node's properties panel)

Credentials, API keys, mailers, SMTP, and integration defaults are configured in the CMS plugin under **Node Configuration**, not per step on this node. Link the flow to a domain before testing CMS-backed fields.

## Output payload fields

After this step runs, later nodes can reference these fields using placeholders such as
`{{create_article.id}}`.

| Field key | Type | Description |
|-----------|------|-------------|
| `id` | string | Primary record identifier. |
| `title` | string | Title text for the created or updated record. |
| `url` | string | Public HTTP URL to a resource on the site. |
| `link` | string | Canonical link URL for the record. |
| `alias` | string | URL-safe alias / slug. |
| `catid` | string | Category ID. |
| `state` | number | Published state (0 = unpublished, 1 = published). |
| `created_by` | number | Numeric value from this node's output. |
| `introtext` | string | Article introduction / teaser HTML. |
| `fulltext` | string | Article main body HTML. |
| `imageIntro` | string | Intro image URL on the article. |
| `imageFulltext` | string | Fulltext image URL on the article. |
| `tag_ids` | object | Tag IDs attached to the article. |

## Validation rules

- **Article Title** (`title`) must be filled before the flow can be saved.

## Related nodes

Other steps in the same area of the palette:

- **Delete Article** (`delete-article`) — Articles
- **Publish Article** (`publish-article`) — Articles
- **Unpublish Article** (`unpublish-article`) — Articles
- **Update Article** (`update-article`) — Articles
