- Current Phase: Initial Development
- Plugin Name: SourceHub (Hub & Spoke Publisher)
- Target: WordPress 5.0+ with Yoast SEO integration
sourcehub/
├── sourcehub.php (main plugin file)
├── includes/
│ ├── class-sourcehub.php (main plugin class)
│ ├── class-hub-manager.php (hub functionality)
│ ├── class-spoke-manager.php (spoke functionality)
│ ├── class-api-handler.php (REST API endpoints)
│ ├── class-yoast-integration.php (SEO metadata handling)
│ └── class-ai-rewriter.php (optional AI features)
├── admin/
│ ├── class-admin.php (admin interface)
│ ├── partials/ (admin templates)
│ └── js/ & css/ (admin assets)
└── public/
├── class-public.php (frontend functionality)
└── js/ & css/ (public assets)
init- Register REST API endpointsadd_meta_boxes- Add hub post editor meta boxsave_post- Trigger content syndicationadmin_menu- Add admin pageswp_enqueue_scripts- Load assets
register_rest_route()- Create spoke API endpointsupdate_post_meta()- Store Yoast SEO datawp_remote_post()- Send data from hub to spokeswp_insert_post()- Create posts on spoke sitesadd_settings_section()- Plugin configuration
- Generate unique API keys per spoke connection
- Use WordPress nonces for form submissions
- Validate and sanitize all incoming data
- Rate limiting on API endpoints
// Example validation pattern
$post_data = array(
'title' => sanitize_text_field($_POST['title']),
'content' => wp_kses_post($_POST['content']),
'hub_id' => absint($_POST['hub_id'])
);wp_sourcehub_connections- Store spoke connectionswp_sourcehub_logs- Syndication activity logswp_sourcehub_queue- Failed/retry queue
_sourcehub_hub_id- Original hub post ID_sourcehub_origin_url- Hub site URL_sourcehub_last_sync- Last sync timestamp_sourcehub_canonical_override- Custom canonical URL
_yoast_wpseo_title- SEO title_yoast_wpseo_metadesc- Meta description_yoast_wpseo_focuskw- Focus keyword_yoast_wpseo_canonical- Canonical URL_yoast_wpseo_twitter-title- Twitter title_yoast_wpseo_twitter-description- Twitter description_yoast_wpseo_opengraph-title- OpenGraph title_yoast_wpseo_opengraph-description- OpenGraph description
// Hub: Collect Yoast data
$yoast_data = array();
foreach ($yoast_fields as $field) {
$yoast_data[$field] = get_post_meta($post_id, $field, true);
}
// Spoke: Apply Yoast data
foreach ($yoast_data as $field => $value) {
update_post_meta($new_post_id, $field, $value);
}POST /wp-json/sourcehub/v1/receive-post- Receive new postPUT /wp-json/sourcehub/v1/update-post- Update existing postGET /wp-json/sourcehub/v1/status- Health check
- Admin AJAX endpoints for spoke management
- Settings API for configuration
- Store API keys securely (encrypted in database)
- Implement retry logic for API failures
- Add content length limits
- Cache rewritten content to avoid duplicate API calls
- Tone adjustments (formal, casual, regional)
- Length modifications (expand, condense)
- Localization (currency, dates, references)
SUCCESS- Successful syndicationERROR- Failed syndication attemptsWARNING- Partial failures or retriesINFO- General activity
- Queue failed requests for retry
- Exponential backoff strategy
- Maximum retry attempts (3-5)
- Admin notification for persistent failures
- Spoke Connections - Manage connected sites
- Syndication Logs - View push history
- Settings - Plugin configuration
- AI Settings - OpenAI configuration
- Connection Status - Hub connection info
- Received Content - Syndicated posts log
- Settings - Local configuration
- Plugin activation/deactivation
- Mode selection (Hub/Spoke)
- Basic post syndication
- REST API endpoints
- Yoast SEO integration
- Post syncing/updates
- Admin interface
- Logging system
- AI rewriting integration
- Advanced canonical management
- Bulk operations
- Analytics dashboard
- Always escape output:
esc_html(),esc_attr(),esc_url() - Sanitize input:
sanitize_text_field(),wp_kses_post() - Use WordPress coding standards
- Implement proper capability checks:
current_user_can() - Follow plugin header requirements
- Use WordPress transients for caching
- Implement proper uninstall hooks
Last Updated: 2025-06-19