PmWiki has the capability to stage draft versions of a page prior to them becoming "official". All of the draft pages end in "-Draft" by default (this can be changed by setting $DraftSuffix). Multiple interim edits to a page can be temporarily saved in a "-Draft" copy of a page until the draft is ready to be published to the original.

Configuration and usage

When the site administrator sets $EnableDrafts in a local customization file, the "Save" button on the edit page is split into separate "Publish" and "Save draft" buttons.

The "Save draft" button causes any edits to be saved to a "-Draft" copy of the original page, leaving the original page intact. Subsequent requests to edit the page (either the original or -Draft) bring up the draft copy for further editing.

The "Publish" button saves back to the original non-Draft copy of the page, removing any -Draft page that may have been created.

By default, saving drafts and publishing are available to anyone with 'edit' permissions (see Passwords). However, the site administrator can also set the $EnablePublishAttr configuration variable, which provides a separate 'publish' permission that is required to publish to the original page.

When "publishing", how the page's history is handled depends on whether the administrator has set the $EnableDraftAtomicDiff variable.

Drafts and (All)RecentChanges

By default, using the "Save draft" or "Save draft and edit" button will be recorded to both Site.AllRecentChanges and Group.RecentChanges. Also after "publishing" a draft version an orphaned link to the "-Draft" page will remain.

To disable on both Site.AllRecentChanges and Group.RecentChanges:

$DraftRecentChangesFmt = array();

or alternatively:

if ( @$EnableDrafts && @$_POST['postedit']>'' || @$_POST['postdraft']>'' )

To only disable one of these, unset it individually:

if ( @$EnableDrafts && @$_POST['postedit']>'' || @$_POST['postdraft']>'' ) {
  unset($RecentChangesFmt['$Group.RecentChanges']); # -and/or-

If a $DraftRecentChangesFmt array is defined, it will be used instead of $RecentChangesFmt when saving a Draft version. For example, to have all draft versions only appear on a page Site.DraftRecentChanges, you could add to config.php:

  = '* [[{$Group}.{$Name}]]  . . . $CurrentTime $[by] $AuthorLink: [=$ChangeSummary=]';

See also $RecentChangesFmt and $DraftRecentChangesFmt.

Drafts with searches, pagelists, and RSS

The drafts module also sets pagelists and searches (and thus RSS feeds) to ignore "-Draft" pages by default; one has to do list=all or similar in order to have draft pages included in a pagelist or RSS feed.

How do I moderate all postings?

Start by enabling drafts to change the "Save" button into separate "Publish" and "Save draft" buttons. Then set $EnablePublishAttr. This adds a "publish" authorization level to distinguish editing of page drafts from publishing.

This page may have a more recent version on pmwiki.org: PmWiki:Drafts, and a talk page: PmWiki:Drafts-Talk.