Publishing & Moderation
After creating your service, it enters the publishing workflow. This guide covers service statuses, moderation, and post-publication management.
Service Statuses
WordPress and the plugin track service state through post statuses and moderation meta.
Post Statuses
Only 3 WordPress post statuses are used:
| Status | Visibility | Description |
|---|---|---|
draft | Private (author only) | Service saved but not submitted |
pending | Private (author + admins) | Submitted for admin review |
publish | Public (all buyers) | Live on marketplace |
Note: “Paused” and “Archived” are NOT registered post statuses. They do not exist in the codebase.
Moderation Statuses
Stored in wpssmoderation_status meta:
| Status Constant | Meta Value | Description |
|---|---|---|
ModerationService::STATUS_PENDING | pending | Awaiting admin review |
ModerationService::STATUS_APPROVED | approved | Admin approved |
ModerationService::STATUS_REJECTED | rejected | Admin rejected |
Note: Only these 3 moderation statuses exist. There is no “request changes” or “paused” moderation status.
Publishing Workflow

When Moderation is Enabled
Admin setting: wpssvendor['requireservice_moderation']
Flow:
Create Service → Submit → post_status: 'pending'
→ moderation_status: 'pending'
→ Admin receives email
→ Admin reviews
→ Approve OR Reject
If Approved:
post_status→publishwpssmoderation_status→approvedwpssmoderated_at→ Current timestampwpssmoderator_id→ Admin user ID- Vendor receives approval email and notification
- Service appears on marketplace
- Syncs to WooCommerce product (if WooCommerce active)
If Rejected:
post_status→draftwpssmoderation_status→rejectedwpssrejection_reason→ Admin’s reason textwpssmoderation_notes→ Same as rejection reason- Vendor receives rejection email with reason
- Service remains private, can be edited and resubmitted
When Moderation is Disabled
Flow:
Create Service → Submit → post_status: 'publish' (immediate)
→ Service live immediately
→ Syncs to WooCommerce
No moderation meta is set. Service goes live without admin review.
Moderation Queue

Admins access pending services via Admin → Services → Moderation.
What Admins Review
The ModerationService class provides methods:
getpendingservices()– Retrieves services withpoststatus='pending'andmoderationstatus='pending'getpendingcount()– Count of pending services (used for admin menu badge)approve($service_id, $notes)– Approve servicereject($service_id, $reason)– Reject service with reason
Approval Process
PHP Code Flow:
$moderation = new ModerationService();
$result = $moderation->approve( $service_id, $admin_notes );
Actions:
- Updates
post_statustopublish - Sets
wpssmoderation_statustoapproved - Records moderator ID and timestamp
- Fires
wpssserviceapprovedaction hook - Sends email to vendor if
moderation_approvedemail type is enabled - Creates platform notification
Rejection Process
PHP Code Flow:
$moderation = new ModerationService();
$result = $moderation->reject( $service_id, $rejection_reason );
Actions:
- Updates
post_statustodraft - Sets
wpssmoderation_statustorejected - Stores reason in both
wpssrejectionreasonandwpssmoderationnotes - Records moderator ID and timestamp
- Fires
wpssservicerejectedaction hook - Sends rejection email to vendor if
moderation_rejectedemail type is enabled - Creates platform notification with edit link
Rejection Reasons
Common reasons (not enforced by code, admin free-text):
- Misleading title or description
- Low-quality images
- Policy violations
- Incomplete information
- Unrealistic delivery times
- Inappropriate content
Vendor can edit and resubmit by clicking “Publish” again in wizard.
Email Notifications
Three email types handled by EmailService:
| Email Type | Trigger | Recipient |
|---|---|---|
moderation_pending | Service submitted | Admin email |
moderation_approved | Service approved | Vendor |
moderation_rejected | Service rejected | Vendor |
Each email type can be enabled/disabled in settings.
Moderation Data Structure
Meta Keys:
_wpss_moderation_status // 'pending', 'approved', or 'rejected'
_wpss_moderation_notes // Admin notes (approval or rejection)
_wpss_rejection_reason // Rejection reason (same as notes for rejected)
_wpss_moderated_at // MySQL datetime of moderation action
_wpss_moderator_id // User ID of admin who moderated
Retrieval:
$data = $moderation->get_moderation_data( $service_id );
// Returns array with status, notes, moderated_at, moderator_id
Editing Published Services
Vendors can edit published services via the wizard shortcode:
[wpss_service_wizard id="123"]
Edit Restrictions
Can Edit If:
- User is service author OR current user has
manage_optionscapability - No specific permission checks on post status
Cannot Edit:
- If vendor account status is not “Active” (pending or suspended vendors blocked)
- During active moderation review (post_status=’pending’)
Edit Workflow
- Vendor edits service in wizard
- Clicks “Save Draft” → Updates
post_status='draft', keeps existing data - Clicks “Publish Service” → Re-triggers moderation flow (if enabled)
If moderation enabled:
- Service goes back to
post_status='pending' - Admin must re-approve
- Service temporarily hidden from marketplace during review
If moderation disabled:
- Changes go live immediately
post_status='publish'maintained
What Happens to Active Orders
Active orders continue with original service configuration. Edits only affect new orders.
Package data is stored per-order in wpss_orders table, so order details remain unchanged.
Service Visibility
Services are visible to buyers when:
post_status='publish'ANDwpssmoderation_status='approved'(if moderation enabled)
Services are hidden if:
post_statusisdraftorpendingwpssmoderation_statusispendingorrejected
There is no “pause” feature in the codebase. To hide a service, vendor must set it to draft.
Deleting Services
Vendors can delete services using WordPress standard deletion:
Restrictions:
- Active orders may prevent deletion (implementation dependent on admin settings)
- WordPress soft-delete (trash) is used
- Complete deletion moves to trash, can be permanently deleted by admin
What Happens:
- Service post moved to trash
- Meta data preserved
- Orders remain in database (not deleted)
- Reviews may remain (implementation dependent)
WooCommerce Sync
If WooCommerce is active, approved services sync to WooCommerce products:
Sync Trigger:
// In ServiceWizard::ajax_publish_service()
if ( class_exists( 'WooCommerce' ) && 'publish' === $post_status ) {
$wc_provider = new \WPSellServices\Integrations\WooCommerce\WCProductProvider();
$wc_product_id = $wc_provider->sync_service_to_product( $service_id );
}
Sync Behavior:
- Creates WooCommerce product linked to service
- Syncs title, description, price (from Basic package)
- Updates existing product if already synced
- Logs sync result via
wpss_log()function
REST API Endpoints
Services are accessible via REST API for mobile apps:
Endpoints:
GET /wpss/v1/services– List servicesGET /wpss/v1/services/{id}– Get single servicePOST /wpss/v1/services– Create servicePUT /wpss/v1/services/{id}– Update serviceDELETE /wpss/v1/services/{id}– Delete service
Moderation Actions:
POST /wpss/v1/moderation/{service_id}/approve– Approve service (admin only)POST /wpss/v1/moderation/{service_id}/reject– Reject service (admin only)
Common Issues
Service Stuck in Pending
Causes:
- Moderation enabled but admin hasn’t reviewed
- Email notifications disabled, admin unaware
- Moderation queue backlog
Fix:
- Check admin notification email settings
- Contact site administrator
- Wait for admin review (typically 24-48 hours)
Changes Not Appearing
Causes:
- Clicked “Save Draft” instead of “Publish”
- Moderation enabled, awaiting re-approval
- Browser cache showing old version
Fix:
- Check service status in dashboard
- Click “Publish Service” to trigger moderation
- Clear browser cache (Ctrl+F5)
- Wait for admin re-approval if moderation enabled
Service Not Syncing to WooCommerce
Causes:
- WooCommerce not active
- Service status not
publish - WooCommerce sync failed silently
Fix:
- Verify WooCommerce is active
- Check service post status is
publish - Check error logs at
wp-content/debug.log - Re-save service to trigger sync
Technical Details
Moderation Service Class
Location: src/Services/ModerationService.php
Key Methods:
ModerationService::is_enabled() // Check if moderation required
ModerationService::get_pending_services() // Get pending services
ModerationService::get_pending_count() // Count pending
ModerationService::approve( $id, $notes ) // Approve service
ModerationService::reject( $id, $reason ) // Reject service
ModerationService::set_pending( $id ) // Mark as pending
ModerationService::get_moderation_data( $id ) // Get moderation meta
ModerationService::get_statuses() // Get all status labels
Action Hooks
do_action( 'wpss_service_pending_moderation', $service_id );
do_action( 'wpss_service_approved', $service_id, $notes );
do_action( 'wpss_service_rejected', $service_id, $reason );
Filter Hooks
None specific to moderation. Publishing behavior controlled by admin settings.
Best Practices
Before Submitting
- Complete all wizard steps fully
- Upload high-quality images (5MB max, WebP supported)
- Write clear, detailed descriptions (5000 char max)
- Set realistic delivery times
- Price competitively
After Rejection
- Read rejection reason carefully
- Fix ALL mentioned issues
- Don’t just resubmit without changes
- Consider improving beyond minimum requirements
- Add note in description explaining improvements
While Published
- Monitor service performance
- Update content quarterly
- Respond to buyer questions promptly
- Adjust pricing based on demand
- Keep gallery images current
Related Documentation
- Service Creation Wizard – Creating services
- Pricing & Packages – Package configuration
- Service Media – Images and videos
- Requirements & FAQs – Buyer requirements
- Service Add-ons – Add-on configuration
