<?php

class CWS_Non_Verbose_Page_Rules {
	function __construct() {
		add_action( 'init', array( $this, 'init' ) );
	}

	function init() {
		add_filter( 'post_rewrite_rules', array( $this, 'post_rewrite_rules' ) );
		add_filter( 'query_vars', array( $this, 'query_vars' ) );
		add_filter( 'request', array( $this, 'request' ) );
	}

	function query_vars( $vars ) {
		$vars[] = 'post_or_page';
		return $vars;
	}

	function request( $request ) {
		if( ! isset( $request['post_or_page'] ) || ! $request['post_or_page'] )
			return $request;

		$pagename = end( preg_split( '/\//', $request['post_or_page'] ) );
		$type = 'post';

		$post_or_page = $this->get_post_or_page( $pagename );
		if( $post_or_page ) {
			$type = $post_or_page[0]->post_type;

			if( 'page' == $type || 'attachment' == $type ) {
				while( '0' != $post_or_page[0]->post_parent ) {
					$post_or_page = $this->get_post_or_page( $post_or_page[0]->post_parent, 'ID' );
					if( ! $post_or_page )
						break;
					$pagename = $post_or_page[0]->post_name . '/' . $pagename;
				}
			}
		}

		if( 'page' == $type ) {
			$request['pagename'] = $pagename;
		} else if( 'post' == $type ) {
			$request['name'] = $pagename;
		} else {
			$request['attachment'] = $pagename;
		}

		unset( $request['post_or_page'] );

		return $request;
	}

	function get_post_or_page( $name, $field = 'post_name' ) {
		global $wpdb;
		return $wpdb->get_results( $wpdb->prepare( "SELECT post_type, post_name, post_parent FROM $wpdb->posts WHERE $field = %s AND post_type IN (  'page', 'post', 'attachment' ) LIMIT 1;", $name ) );
	}

	function page_rewrite_rules( $rules ) {
		foreach( $rules as $k => $v ) {
			$rules[$k] = str_replace( 'pagename=', 'post_or_page=', $v );
			$rules[$k] = str_replace( 'attachment=', 'post_or_page=', $rules[$k] );
		}

		return $rules;
	}

	function post_rewrite_rules( $rules ) {
		global $wp_rewrite;
		if( $wp_rewrite->use_verbose_page_rules ) {
			$wp_rewrite->use_verbose_page_rules = false;
			add_filter( 'page_rewrite_rules', array( $this, 'page_rewrite_rules' ) );
			foreach( $rules as $k => $v ) {
				$rules[$k] = str_replace( 'name=', 'post_or_page=', $v );
				$rules[$k] = str_replace( 'attachment=', 'post_or_page=', $rules[$k] );
			}
		}

		return $rules;
	}
}

new CWS_Non_Verbose_Page_Rules;
