[
'name' => 'Porta Potty Rentals',
'template' => 'template-sub-porta-potty-rentals.html'
],
];
private static $template_cache = [];
private static $instance = null;
const MAX_URLS_PER_SITEMAP = 15000;
public function __construct() {
self::$instance = $this;
add_action('init', [$this, 'load_cities'], 5);
add_action('init', [$this, 'add_rewrite_rules'], 20);
add_action('init', [$this, 'add_sitemap_rewrites']);
add_filter('query_vars', [$this, 'add_query_vars']);
add_action('template_redirect', [$this, 'handle_template_redirect']);
}
public static function get_instance() {
return self::$instance;
}
public function load_cities() {
$file_path = plugin_dir_path(__FILE__) . $this->cities_file;
if (file_exists($file_path)) {
$json = file_get_contents($file_path);
$data = json_decode($json, true);
if (is_array($data)) {
foreach ($data as $city) {
if (isset($city['slug'], $city['name'], $city['state'])) {
$slug = strtolower($city['slug']);
$this->cities[$slug] = [
'name' => $city['name'],
'state' => strtoupper($city['state']),
'full' => $city['name'] . ', ' . strtoupper($city['state'])
];
}
}
}
}
}
public function add_rewrite_rules() {
// City home → dumpster-rentals-los-angeles/
add_rewrite_rule(
'^dumpster-rentals-([^/]+)/?$',
'index.php?dumpster_city=$matches[1]',
'top'
);
// Sub-service → porta-potty-rentals-los-angeles/ etc.
$sub_slugs = array_keys($this->sub_services);
$escaped = array_map('preg_quote', $sub_slugs);
$pattern = '^(' . implode('|', $escaped) . ')-([^/]+)/?$';
add_rewrite_rule(
$pattern,
'index.php?dumpster_sub_service=$matches[1]&dumpster_city=$matches[2]',
'top'
);
}
public function add_sitemap_rewrites() {
add_rewrite_rule('^sitemap-dumpster-index\.xml$', 'index.php?dumpster_sitemap=index', 'top');
add_rewrite_rule('^sitemap-dumpster-([0-9]+)\.xml$', 'index.php?dumpster_sitemap=$matches[1]', 'top');
}
public function add_query_vars($vars) {
$vars[] = 'dumpster_city';
$vars[] = 'dumpster_sub_service';
$vars[] = 'dumpster_sitemap';
return $vars;
}
public function handle_template_redirect() {
$sitemap = get_query_var('dumpster_sitemap');
if ($sitemap !== '') {
if ($sitemap === 'index') {
$this->render_sitemap_index();
} else {
$page = intval($sitemap);
if ($page > 0) $this->render_sitemap_page($page);
}
exit;
}
$city_slug = get_query_var('dumpster_city');
$sub_slug = get_query_var('dumpster_sub_service');
$city_slug = strtolower($city_slug);
if ($city_slug && isset($this->cities[$city_slug])) {
if ($sub_slug && array_key_exists($sub_slug, $this->sub_services)) {
$this->render_sub_service_page($city_slug, $sub_slug);
} elseif (!$sub_slug) {
$this->render_city_home_page($city_slug);
} else {
$this->set_404();
}
exit;
}
}
private function set_404() {
global $wp_query;
$wp_query->set_404();
status_header(404);
include get_404_template();
exit;
}
private function render_city_home_page($city_lower) {
$city = $this->cities[$city_lower];
$city_full = $city['full'];
$templates = ['template-city1.html', 'template-city2.html', 'template-city3.html', 'template-city4.html'];
$chosen = $templates[array_rand($templates)];
$content = $this->load_template($chosen);
$content = str_replace(
['Advance, MO', 'Advance', 'MO'],
[esc_html($city_full), esc_html($city['name']), esc_html($city['state'])],
$content
);
$content = str_replace('Porta Potty Rentals', 'Dumpster Rentals', $content);
$content .= $this->get_sub_services_list($city_lower);
$content .= $this->get_random_cities_footer();
echo $content;
}
private function render_sub_service_page($city_lower, $sub_slug) {
$city = $this->cities[$city_lower];
$city_full = $city['full'];
$service = $this->sub_services[$sub_slug];
$content = $this->load_template($service['template']);
$content = str_replace(
['Advance, MO', 'Advance', 'MO', '#ServiceName'],
[esc_html($city_full), esc_html($city['name']), esc_html($city['state']), esc_html($service['name'])],
$content
);
$content .= $this->get_sub_services_list($city_lower);
$content .= $this->get_random_cities_footer();
echo $content;
}
private function load_template($filename) {
if (!isset(self::$template_cache[$filename])) {
$file_path = plugin_dir_path(__FILE__) . $filename;
if (!file_exists($file_path)) {
wp_die("Template missing: $filename");
}
self::$template_cache[$filename] = file_get_contents($file_path);
}
return self::$template_cache[$filename];
}
private function get_sub_services_list($city_lower) {
$list = '
Our Waste Management Services in ' . esc_html($this->cities[$city_lower]['full']) . '
';
return $list;
}
private function get_random_cities_footer() {
$all_slugs = array_keys($this->cities);
shuffle($all_slugs);
$selected = array_slice($all_slugs, 0, 50);
$footer = '';
return $footer;
}
private function render_sitemap_index() {
header('Content-Type: application/xml; charset=UTF-8');
echo '';
echo '';
$total_urls = count($this->cities) * (1 + count($this->sub_services));
$pages = ceil($total_urls / self::MAX_URLS_PER_SITEMAP);
for ($i = 1; $i <= $pages; $i++) {
echo '' . esc_url(home_url("/sitemap-dumpster-{$i}.xml")) . '' . current_time('c') . '';
}
echo '';
exit;
}
private function render_sitemap_page($page) {
header('Content-Type: application/xml; charset=UTF-8');
echo '';
echo '';
$cities = array_keys($this->cities);
$sub_services = array_keys($this->sub_services);
$start = ($page - 1) * self::MAX_URLS_PER_SITEMAP;
$end = $start + self::MAX_URLS_PER_SITEMAP;
$current = 0;
// City pages first
foreach ($cities as $city_slug) {
if ($current >= $end) break;
if ($current >= $start) {
echo '' . esc_url(home_url("/dumpster-rentals-{$city_slug}/")) . '' . current_time('c') . 'weekly0.8';
}
$current++;
}
// Sub-service pages
foreach ($cities as $city_slug) {
foreach ($sub_services as $sub_slug) {
if ($current >= $end) break 2;
if ($current >= $start) {
echo '' . esc_url(home_url("/{$sub_slug}-{$city_slug}/")) . '' . current_time('c') . 'weekly0.6';
}
$current++;
}
}
echo '';
exit;
}
public function get_random_links($count = 300) {
$count = min(intval($count), 1000);
$slugs = array_keys($this->cities);
$sub_slugs = array_keys($this->sub_services);
if (empty($slugs)) return '';
$output = '';
$used = [];
for ($i = 0; $i < $count; $i++) {
if (mt_rand(0, 3) === 0) { // ~25% main page
$city_slug = $slugs[array_rand($slugs)];
$url = home_url("/dumpster-rentals-{$city_slug}/");
$text = "Dumpster Rentals " . $this->cities[$city_slug]['full'];
} else {
$city_slug = $slugs[array_rand($slugs)];
$sub_slug = $sub_slugs[array_rand($sub_slugs)];
$url = home_url("/{$sub_slug}-{$city_slug}/");
$text = $this->sub_services[$sub_slug]['name'] . " " . $this->cities[$city_slug]['full'];
}
if (in_array($url, $used)) { $i--; continue; }
$used[] = $url;
$output .= '
' . esc_html($text) . '';
}
$output .= '
';
return $output;
}
}
// Shortcode
add_shortcode('random_dumpster_links', function($atts) {
$atts = shortcode_atts(['count' => 300], $atts);
$instance = DumpsterRentalsDynamicPages::get_instance();
return $instance ? $instance->get_random_links($atts['count']) : '';
});
new DumpsterRentalsDynamicPages();
register_activation_hook(__FILE__, 'flush_rewrite_rules');
register_deactivation_hook(__FILE__, 'flush_rewrite_rules');
Our Waste Management Services in Advance, MO
We Serve These Areas
Porta Potty Rentals Aragon, GAPorta Potty Rentals Mountain Top, PAPorta Potty Rentals Oakland Park, FLPorta Potty Rentals Hamshire, TXPorta Potty Rentals Corinth, MSPorta Potty Rentals Stony Brook, NYPorta Potty Rentals Port Allegany, PAPorta Potty Rentals Dorothy, NJPorta Potty Rentals Orange, OHPorta Potty Rentals Garden City South, NYPorta Potty Rentals Hazel Green, ALPorta Potty Rentals Gallitzin, PAPorta Potty Rentals Manistee, MIPorta Potty Rentals Rose Hills, CAPorta Potty Rentals Greensburg, KYPorta Potty Rentals Freedom, CAPorta Potty Rentals Primera, TXPorta Potty Rentals Granger, INPorta Potty Rentals Rodney Village, DEPorta Potty Rentals Cornelia, GAPorta Potty Rentals Bloomfield, MOPorta Potty Rentals Reserve, LAPorta Potty Rentals Versailles, MOPorta Potty Rentals Camanche Village, CAPorta Potty Rentals Mendota, ILPorta Potty Rentals Winfield, IAPorta Potty Rentals Wappingers Falls, NYPorta Potty Rentals Patterson, CAPorta Potty Rentals Berkshire Lakes, FLPorta Potty Rentals Paris, KYPorta Potty Rentals Perry, GAPorta Potty Rentals Penrose, COPorta Potty Rentals Olney, TXPorta Potty Rentals Bolinas, CAPorta Potty Rentals Edwards Afb, CAPorta Potty Rentals Saranap, CAPorta Potty Rentals Stonecrest, GAPorta Potty Rentals Ivanhoe, TXPorta Potty Rentals Licking, MOPorta Potty Rentals Baldwin, MIPorta Potty Rentals Pratt, KSPorta Potty Rentals Lake Camelot, ILPorta Potty Rentals La Marque, TXPorta Potty Rentals Deerwood, TXPorta Potty Rentals Spinnerstown, PAPorta Potty Rentals Interlaken, CAPorta Potty Rentals Coal Valley, ILPorta Potty Rentals Tunnel Hill, GAPorta Potty Rentals Wendover, UTPorta Potty Rentals Henning, TN