add_rewrite_rule can help you sniff the request and let you handle it however you want.
if( ! class_exists('PropertiesEndpoint')):
class PropertiesEndpoint {
// WordPress hooks
public function init() {
add_filter('query_vars', array($this, 'add_query_vars'), 0);
add_action('parse_request', array($this, 'sniff_requests'), 0);
add_action('init', array($this, 'add_endpoint'), 0);
}
// Add public query vars
public function add_query_vars($vars) {
$vars[] = '__properties';
$vars[] = 'city';
$vars[] = 'id';
return $vars;
}
// Add API Endpoint
public function add_endpoint() {
add_rewrite_rule('^properties/([^/]*)/([^/]*)/?', 'index.php?__properties=1&city=$matches[1]&id=$matches[2]', 'top');
add_rewrite_rule('^properties/?', 'index.php?__properties=1', 'top');
flush_rewrite_rules(false); //// <---------- REMOVE THIS WHEN DONE
}
// Sniff Requests
public function sniff_requests($wp_query) {
global $wp;
if(isset($wp->query_vars[ '__properties' ])) {
if(isset($wp->query_vars[ 'city' ]) && isset($wp->query_vars[ 'id' ])) {
$this->handle_request__properties_home_for_sale();
die(); // stop default WP behavior
}
else if( isset($wp->query_vars[ 'city' ]) ) {
// handle in separate file
require_once get_template_directory() . '/single-properties-in-city.php';
die(); // stop default WP behavior
}
$this->handle_request__properties();
// continue default WP behavior
}
}
// Handle Requests
protected function handle_request__properties_home_for_sale() {
global $wp;
$city = $wp->query_vars[ 'city' ];
$id = $wp->query_vars[ 'id' ];
?>SHOW PROPERTY IN <?php echo $city . ' - ' . $id;
}
protected function handle_request__properties() {
// Control the template used
add_filter('template_include', function ($original_template) {
// change the default template to a google map template
return get_template_directory() . '/single-properties-google-map.php';
});
}
}
$propEPT = new PropertiesEndpoint();
$propEPT->init();
endif; // PropertiesEndpoint
Monkeyman Rewrite Analyzer can help you make sure your endpoints are functioning properly.
UPDATE
I’ve added a couple of ways to handle the request. You can ignore default WP behavior by killing the process with die()
after you handle it. Or adjust the template and continue default behavior with the template_include filter.