Professional WPF desktop application for managing and auditing multiple WordPress sites from a single interface. Built on .NET 6 with MVVM architecture, SQLite persistence, and OpenAI integration for content generation.
- Features
- System Requirements
- Installation
- Interface Overview
- Module 0 — Site Checker
- Module 1 — Post Manager
- Module 2 — Edit Post
- Module 4 — Create Post
- Module 5 — Mass Edit
- Module 6 — Article Generator
- Module 7 — Page Editor
- Module 8 — Site Manager
- Module 9 — Folders
- Module 3 — Settings
- Credential Input Formats
- Proxy Configuration
- Project Architecture
- License
- 3 validation methods: REST API, XML-RPC, and Direct Login — auto-detects the best method per site
- Multi-threaded: up to 100 concurrent threads with configurable timeout
- Role detection: identifies Admin, Editor, Author, Contributor, Subscriber
- Pause / Resume / Stop support during active scanning
- Retry logic: exponential backoff on transient failures
- Load, create, edit, delete posts across any validated site
- Edit page content (front page, home page, or any page) in bulk
- Add anchor links to posts and pages individually or in batch
- Download posts from multiple sites simultaneously
- Search & replace in titles and/or content (with case-sensitivity option)
- Strip HTML, reset edits, and batch-save changes
- Publish articles to multiple sites with configurable delay and thread count
- Generate multiple unique articles from a base template
- Spintax support:
{option1|option2|option3}for natural variation - Load articles from single files, multiple files, or entire folders
- Insert anchor links at start, middle, or end of content
- AI-powered generation via OpenAI API (any model available in your account)
- SQLite database (
wpsites.db) — persistent storage of all validated sites - Folder system — organize sites into hierarchical nested folders
- Merge external databases, export credentials, revalidate stored sites
- HTTP, HTTPS, SOCKS4, SOCKS5
- Authenticated proxies (
user:pass@host:port) - Automatic rotation and response-time tracking
- Built-in free proxy fetcher
| Requirement | Minimum |
|---|---|
| Operating System | Windows 10 / Windows 11 (x64) |
| Runtime | .NET 6.0 (bundled in release) |
| RAM | 4 GB |
| Disk Space | 200 MB |
| Network | Internet connection required |
- Go to the Releases page
- Download
WpManager-v1.0-windows-x64.zip - Extract to any folder
- Run
WpManager.exe
No installer required. The .NET 6 runtime is self-contained in the executable.
┌──────────────────────────────────────────────────────────────────┐
│ WpManager ─ □ ✕ │
├────┬─────────────────────────────────────────────────────────────┤
│ WP │ [Module content area] │
│ │ │
│ [0]│ ← Site Checker │
│ [1]│ ← Post Manager │
│ [2]│ ← Edit Post │
│ [4]│ ← Create Post │
│ [5]│ ← Mass Edit │
│ [6]│ ← Article Generator │
│ [7]│ ← Page Editor │
│ [8]│ ← Site Manager │
│ [9]│ ← Folders │
│ │ │
│ [3]│ ← Settings (bottom) │
└────┴─────────────────────────────────────────────────────────────┘
Window size: 1400×900 (minimum 1200×800). Custom dark theme with cyan/green accents.
Validates WordPress credentials from a list and identifies the access level for each site.
- Paste your credential list into the input box (or drag and drop a
.txtfile) - Set Thread count (1–100, default 10) and Timeout (5–60 s, default 15)
- Select Validation method: AutoDetect, REST API, XML-RPC, or Login
- Click Start
◉ 47%
─────────────────
Total: 500
Threads: 8 / 10
Elapsed: 00:01:23
Found: 47
| Column | Description |
|---|---|
| URL | WordPress site URL |
| Username | Login username |
| Password | Login password |
| Role | Admin / Editor / Author / Contributor / Subscriber |
| Post Count | Number of posts on the site |
| Can Upload | Whether the account can upload media |
| Status | Valid / Invalid / Error |
| Method | REST API / XML-RPC / Login |
Filter results by role: Admin · Editor · Author · Contributor · Subscriber · Unknown · All
- Export — save results to file
- Copy credentials — copy to clipboard in original format
- Open results folder — open the output directory
Browse posts from any validated site.
- Select a site from the dropdown
- Click Load posts
- DataGrid shows: ID, Title, Status, Author, Date, Link
- Click a post to view its URL — use Open URL to open in browser
Edit an existing post on any site.
- Select a site → click Load posts → select a post from the dropdown
- Edit Title, Content, and Status (publish / draft / pending / private / trash)
- Click Update to save changes
- Click Delete to permanently remove the post
- Click Generate AI content to rewrite or extend the post using OpenAI (API key required)
Publish a new post to any validated site.
- Select a site from the dropdown
- Enter Title, Content, and set Status (default:
publish) - Click Create Post
- The created post's ID and URL are shown on success
Download posts from multiple sites and batch-edit them.
- Select target sites from the checkbox grid
- Set Posts per site (1–500)
- Click Download
| Feature | Description |
|---|---|
| Search & Replace | Find text in titles and/or content with optional case sensitivity |
| Strip HTML | Remove all HTML tags from content |
| Reset | Restore original downloaded content |
| Add Anchor | Insert a hyperlink at start / middle / end of content |
| Save | Batch-save all modified posts back to their sites |
The DataGrid shows: Site URL, Post ID, Original Title, Modified Title, Status, Link.
Generate and publish unique articles across multiple sites.
| Option | Description |
|---|---|
| Manual entry | Type base title and content directly |
| Load from file | Import a single .txt article |
| Load multiple files | Import several files at once |
| Load folder | Import all .txt files in a directory |
| Generate with AI | Use OpenAI prompt to create articles automatically |
Use {variation1|variation2|variation3} in titles or content to generate unique versions:
{Hello|Hi|Greetings}, this is a {great|fantastic|excellent} article about {SEO|digital marketing|WordPress}.
| Setting | Description | Default |
|---|---|---|
| Anchor text | Link text to embed in content | — |
| Anchor URL | Target URL for the link | — |
| Anchor position | Start / Middle / End | End |
| Delay between posts | Milliseconds between each publish | 500 ms |
| Publish threads | Concurrent publishing operations | 20 |
- Select articles from the template list
- Click Publish unique articles
- Progress bar and per-site status are shown in real time
Find and edit WordPress pages across multiple sites.
| Button | Action |
|---|---|
| Search front pages | Finds the page set as front page |
| Search home pages | Finds the blog home page |
| Search all pages | Lists all pages on the site |
- Select a page from the DataGrid (Title, Type, Link, Editable)
- Edit Title and Content (HTML supported)
- Add anchor links individually or to all selected pages at once
- Click Save page content to update
Manage the persistent site database.
| Action | Description |
|---|---|
| Load from database | Display all stored validated sites |
| Export database | Export all sites to a credential file |
| Merge new base | Import an external database and merge into the current one |
| Revalidate | Re-check all stored sites against live WordPress installations |
| Delete selected | Remove selected sites from the database |
The DataGrid shows: URL, Username, Role, Post Count, Blog Name, Last Validated date.
Organize validated sites into hierarchical folders.
- Create root folders and nested subfolders
- Rename folders at any level
- Assign sites to a folder via the FolderSelectDialog
- Expand/collapse folder tree
- Each folder shows its contained sites in a list
| Setting | Description |
|---|---|
| API Key | Your OpenAI API key (stored encrypted in config.json) |
| Model | Select from models available in your account (fetched live) |
| Validate API key | Tests the key against the OpenAI API |
| Setting | Description |
|---|---|
| Use proxy | Enable/disable proxy routing |
| Proxy list | One proxy per line |
| Load from file | Import proxies from a .txt file |
| Test proxies | Validate all proxies and show working count |
| Fetch free proxies | Automatically fetch and test free public proxies |
| Setting | Default | Range |
|---|---|---|
| Thread count | 10 | 1–100 |
| Timeout (seconds) | 15 | 5–60 |
| Max retries | 3 | 1–10 |
| Random site selection count | 10 | — |
| Use random selection | Off | — |
The Site Checker accepts multiple credential formats automatically:
| Format | Example |
|---|---|
| Pipe-delimited | https://site.com|admin|password123 |
| Dash-delimited | https://site.com–admin–password123 |
| Hash/At format | https://site.com/wp-login.php#admin@password123 |
| Colon/ULP format | https://site.com:admin:password123 |
URL auto-cleaning: strips /wp-login.php, /wp-admin/, /xmlrpc.php suffixes and auto-adds https:// if missing.
# Host:port only
192.168.1.1:8080
# Protocol + host:port
http://proxy.example.com:3128
https://proxy.example.com:443
socks4://10.0.0.1:1080
socks5://10.0.0.1:1080
# Authenticated
http://user:pass@proxy.example.com:3128
socks5://user:pass@10.0.0.1:1080
# host:port:user:pass
proxy.example.com:3128:username:password
Built with MVVM pattern, dependency injection, and SQLite persistence on .NET 6 WPF.
WpManager/
├── Models/
│ ├── WpSite.cs # WordPress site entity + multi-format credential parser
│ ├── WpPost.cs # Post entity with status colors
│ ├── WpPage.cs # Page entity
│ ├── WpCategory.cs # Post category
│ ├── ArticleTemplate.cs # Article generation template with anchor support
│ ├── DownloadedPost.cs # Post downloaded for mass editing
│ ├── LoadedPostItem.cs # Post loaded from file for batch publishing
│ ├── Folder.cs # Hierarchical folder structure (self-referential)
│ ├── TreeItem.cs # Tree view item (Folder / Site / Post)
│ ├── UniquePublishResult.cs # Result of a publish operation
│ └── ProxyInfo.cs # Proxy with response time tracking
├── ViewModels/
│ ├── MainViewModel.cs # 800+ lines — all commands and observable properties
│ ├── ViewModelBase.cs # INotifyPropertyChanged base
│ └── RelayCommand.cs # Generic ICommand implementation
├── Services/
│ ├── WpValidationService.cs # REST / XML-RPC / Login validation with retry logic
│ ├── WpPostService.cs # Post CRUD via REST API and XML-RPC
│ ├── PageService.cs # WordPress page discovery and editing
│ ├── ArticleService.cs # Article generation, spintax, anchor insertion
│ ├── DatabaseService.cs # SQLite (wpsites.db) — Sites + Folders tables
│ ├── FileService.cs # File export, credential formatting
│ ├── FolderService.cs # Folder hierarchy CRUD
│ ├── SettingsService.cs # config.json serialization
│ ├── ProxyService.cs # Proxy parsing, testing, rotation
│ └── OpenAIService.cs # OpenAI API — model listing and content generation
├── Views/
│ ├── MainWindow.xaml # Main 1400×900 dark-theme window
│ └── FolderSelectDialog.xaml # Folder picker dialog with tree view
├── Converters/
│ └── ValueConverters.cs # 7 WPF value converters (roles, visibility, progress)
├── Themes/
│ └── DarkTheme.xaml # Global dark theme styles
└── App.xaml # Application root + theme registration
| Package | Version | Purpose |
|---|---|---|
| CommunityToolkit.Mvvm | 8.2.2 | MVVM base classes and ObservableObject |
| Microsoft.Data.Sqlite | 8.0.0 | SQLite database access |
| HtmlAgilityPack | 1.11.61 | HTML parsing and manipulation |
| System.Text.Json | 8.0.5 | JSON config serialization |
-- Sites table
CREATE TABLE Sites (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Url TEXT NOT NULL,
Username TEXT NOT NULL,
Password TEXT,
Role TEXT,
BlogName TEXT,
PostCount INTEGER,
CanUpload INTEGER,
ValidationMethod TEXT,
RestApiEnabled INTEGER,
XmlRpcEnabled INTEGER,
DateAdded TEXT,
LastValidated TEXT,
FolderId INTEGER REFERENCES Folders(Id),
UNIQUE(Url, Username)
);
-- Folders table (nested hierarchy)
CREATE TABLE Folders (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL,
ParentId INTEGER REFERENCES Folders(Id) ON DELETE CASCADE,
DateCreated TEXT
);MIT License — see LICENSE for full terms.
Legal Notice: This tool is intended for authorized security audits, administration of WordPress sites you own or manage, and legitimate content management workflows. Use only against installations you have explicit written permission to access. The authors assume no liability for unauthorized use.