Figured out a solution! This intercepts the query at parse_request
, checks if a page with a matching slug exists, and if so, changes the request to a page request.
/**
* Fix rewrite conflicts between "project_category" and "page"
*
* @param WP $query
* @return WP
*/
function prefix_parse_request_fix_rewrite_conflicts_project_category(WP $query): WP {
if (isset($query->query_vars["project_category"])) {
$path = preg_replace("/\//", "", $_SERVER["REQUEST_URI"]);
if (get_page_by_path($path, OBJECT, "page")) {
unset($query->query_vars["project_category"]);
$query->query_vars["pagename"] = $path;
}
}
return $query;
}
add_action("parse_request", "prefix_parse_request_fix_rewrite_conflicts_project_category");