KNR PSEO GENERATOR is a WordPress plugin built for marketers, agencies, and SEO professionals who need to generate large volumes of location-based, service-based, or data-driven pages at scale — without touching code.
KNR PSEO GENERATOR
Programmatic SEO – Bulk Page Generator for WordPress
Generate thousands of SEO-optimised pages from CSV.
> Unlimited rows · Built-in Schema · Meta Tags · XML Sitemap · Auto-Sync · WP-CLI — 100% Free.
📋 Table of Contents
Overview
Features
Requirements
Installation
Quick Start
Data Sources
Template Syntax
Project Settings Reference
Schema Markup
Auto-Sync & Cron
XML Sitemap
WP-CLI Commands
Hooks & Filters
Database Tables
File Structure
Troubleshooting
FAQ
Changelog
Author
License
Overview
KNR PSEO GENERATOR is a WordPress plugin built for marketers, agencies, and SEO professionals who need to generate large volumes of location-based, service-based, or data-driven pages at scale — without touching code.
What is Programmatic SEO?
Programmatic SEO is the practice of creating hundreds or thousands of SEO-optimised pages from a structured dataset, where each page targets a specific keyword combination (e.g. “Plumbing in Bangalore”, “Plumbing in Mumbai”, “Electrician in Bangalore”).
Traditional approach: Create each page manually 500 rows = 500 hours of work
With PSEO – knr: Upload a 500-row CSV click Generate done in 30 seconds
Real-World Use Cases
Industry Page Type Scale
Home Services {service} in {city} 1,000+ pages
Real Estate Properties in {city}, {locality} 10,000+ pages
Jobs / Hiring {job_title} jobs in {city} 5,000+ pages
eCommerce {product} price in {city} 2,000+ pages
Education {course} colleges in {city} 3,000+ pages
Travel Hotels in {city}, {area} 8,000+ pages
SaaS / Directories {tool} alternatives / reviews 500+ pages
Finance {loan_type} in {city} 1,500+ pages
Features
Core Features
✅ Unlimited rows — no artificial page limits
✅ Unlimited projects — run multiple campaigns simultaneously
✅ 2 data sources — CSV via URL, CSV Upload (server path)
✅ Smart update engine — existing pages are updated, not duplicated
✅ Orphan detection — auto-delete pages removed from the data source
✅ Any post type — Pages, Posts, or any custom post type
Template Engine
✅ {{placeholder}} — column value substitution (HTML-escaped)
✅ {{raw:placeholder}} — unescaped HTML column output
✅ {Option A|Option B|Option C} — spintax for content variation
✅ [if:column=value]...[/if] — conditional blocks
✅ Supports =, !=, >, <, >=, <= conditional operators
SEO Features
✅ Custom title tag per page with placeholders
✅ Custom meta description per page with placeholders
✅ Robots meta control (index/noindex per project)
✅ Canonical URL auto-injected
✅ 6 Schema types — Article, LocalBusiness, Product, FAQPage, BreadcrumbList, JobPosting
✅ JSON-LD schema output in <head>
✅ Custom XML sitemap at /pseo-sitemap.xml
✅ Compatible with Yoast SEO & Rank Math
Automation
✅ Auto-sync — hourly, daily, weekly via WP Cron
✅ WP-CLI — generate/delete/list from terminal
✅ Scheduled cron runs independently of user action
Developer Features
✅ PSR-4 style class autoloader
✅ pseo_schema filter hook for custom schema
✅ Clean database with 3 custom tables
✅ Nonce-protected AJAX endpoints
✅ Full manage_options capability checks
✅ All $_POST inputs sanitized with wp_unslash() + sanitize_*() functions
✅ All outputs escaped with esc_attr() / esc_html() / esc_url()
✅ WordPress Plugin Check (PCP) compliant — 0 errors
Requirements
Requirement Minimum Recommended
WordPress 5.5+ 6.0+
PHP 7.4+ 8.1+
MySQL 5.6+ 8.0+
PHP Extensions json, mbstring —
Installation
Method 1 — Upload ZIP (Recommended)
Zip the pseo-bulk-generator/ folder
Go to WP Admin Plugins Add New Upload Plugin
Select zip Install Now Activate
Go to Settings Permalinks Save Changes (required)
Method 2 — Manual FTP
Upload pseo-bulk-generator/ to /wp-content/plugins/
Go to Plugins Installed Plugins Activate
Go to Settings Permalinks Save Changes
Method 3 — WP-CLI
`bash
wp plugin install /path/to/pseo-bulk-generator.zip –activate
wp rewrite flush
`
Quick Start
`
Step 1 Prepare CSV with column headers
Step 2 Upload CSV or provide a public CSV URL
Step 3 Create a template page with {{placeholders}}
Step 4 Prog SEO + New Project fill the form
Step 5 Click ⚡ Generate Pages Now
Step 6 Visit /your-url-pattern/ to see live pages
Step 7 Submit /pseo-sitemap.xml to Google Search Console
`
Data Sources
This plugin supports 2 data source types — CSV via URL and CSV Upload (server path).
1. CSV via URL
Source Type : CSV via URL
URL : https://yourdomain.com/data.csv
2. CSV Upload (Server Path)
Source Type : CSV Upload (server path)
Path : /var/www/html/wp-content/uploads/2026/02/data.csv
> Tip: Your CSV must be publicly accessible (for the URL option) and the first row must contain column headers that match your {{placeholders}}.
Template Syntax
Syntax Output
{{column}} HTML-escaped value
{{raw:column}} Unescaped raw HTML value
{A|B|C} Random option (spintax)
[if:col=val]text[/if] Conditional block
[if:col>0]text[/if] Numeric condition
[if:col!=val]text[/if] Not-equal condition
Project Settings Reference
URL Pattern Examples
{{service}}/{{city}} /plumbing/bangalore/
services/{{service}}-in-{{city}} /services/plumbing-in-bangalore/
{{state}}/{{city}}/{{service}} /karnataka/bangalore/plumbing/
jobs/{{job_title}}/{{city}} /jobs/developer/bangalore/
SEO Meta
Field Recommended
Title Tag Under 60 chars after substitution
Meta Description 120–160 chars after substitution
Robots index,follow for live pages
Schema Markup
Schema Type Required CSV Columns
Article (none — auto-populated)
LocalBusiness city, address, phone
Product product_name, price
FAQPage faq_q1, faq_a1, faq_q2, faq_a2
BreadcrumbList (none — auto-generated)
JobPosting job_title, company, city
Auto-Sync & Cron
WP Cron event pseo_cron_sync runs hourly and regenerates pages for all non-manual projects automatically.
In wp-config.php:
php
define( 'DISABLE_WP_CRON', true );
cPanel crontab (every 15 minutes):
`bash
*/15 * * * * wget -q -O – https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
`
XML Sitemap
URL: https://yourdomain.com/pseo-sitemap.xml
> If sitemap returns 404 Settings Permalinks Save Changes
WP-CLI Commands
`bash
wp pseo list
wp pseo list –format=json
wp pseo generate –id=1
wp pseo generate –id=1 –delete-orphans
wp pseo generate –all
wp pseo generate –all –delete-orphans
wp pseo delete-pages –id=1
`
Hooks & Filters
pseo_schema
`php
add_filter( ‘pseo_schema’, function( $schema, $type, $row, $post ) {
if ( $type === ‘LocalBusiness’ ) {
$schema[‘openingHours’] = ‘Mo-Su 09:00-21:00’;
$schema[‘image’] = get_the_post_thumbnail_url( $post->ID, ‘large’ );
}
return $schema;
}, 10, 4 );
`
Database Tables
Table Purpose
wp_pseo_projects Project configurations
wp_pseo_data_rows Fetched data snapshots with row hashes
wp_pseo_pages Map of generated post IDs to projects
File Structure
`
pseo-bulk-generator/
├── pseo-bulk-generator.php
├── debug-ajax-response.php
├── README.md
├── includes/
│ ├── class-pseo-database.php
│ ├── class-pseo-datasource.php
│ ├── class-pseo-template.php
│ ├── class-pseo-generator.php
│ ├── class-pseo-seometa.php
│ ├── class-pseo-schema.php
│ ├── class-pseo-sitemap.php
│ ├── class-pseo-ajax.php
│ ├── class-pseo-admin.php
│ └── class-pseo-cli.php
└── admin/
├── views/
│ ├── page-projects.php
│ ├── page-project-edit.php
│ └── page-settings.php
├── images/
│ └── icon.png
├── css/
│ └── pseo-admin.css
└── js/
└── pseo-admin.js
`
Troubleshooting
Problem Fix
No data returned Check CSV is public; use 👁 Preview Data to debug
Sitemap 404 Settings Permalinks Save Changes
{{city}} shows in page Column name in CSV header must match exactly
Pages duplicating URL pattern must produce unique slugs per row
Schema not detected Check required columns exist in CSV
Auto-sync not running Set up real server cron (see above)
Icon not showing Ensure icon.png is 20×20px in admin/images/
White screen on save Ensure plugin files are fully up to date; check PHP error log
Save button dead click Clear cache; confirm JS is loading on PSEO admin pages
Action buttons overflow Update to v2.2.0 — buttons now display in a 2×2 grid layout
FAQ
Q: Does it work with Elementor or Divi?
A: Yes. Set your Elementor/Divi-built page as the Content Template — placeholders inside it will be replaced.
Q: Will it conflict with Yoast SEO or Rank Math?
A: No. PSEO – knr’s meta tags fire at priority 1. Both can coexist.
Q: Can I edit generated pages manually?
A: Yes, but manual edits are overwritten on the next Generate run. Use the CSV and template instead.
Q: Is there a page limit?
A: No plugin limit. For 10,000+ pages use WP-CLI to avoid PHP timeouts.
Q: Can I use custom post types?
A: Yes. Any public post type appears in the “Generate as Post Type” dropdown.
Q: Why were JSON URL and REST API sources removed?
A: The plugin is now focused on CSV-based workflows only (URL and server path). This keeps the UI clean and reduces complexity for most users.