Make WordPress Core

Ticket #16687: non-verbose-003.php

File non-verbose-003.php, 2.2 KB (added by greuben, 15 years ago)
Line 
1<?php
2
3class CWS_Non_Verbose_Page_Rules {
4 function __construct() {
5 add_action( 'init', array( $this, 'init' ) );
6 }
7
8 function init() {
9 add_filter( 'post_rewrite_rules', array( $this, 'post_rewrite_rules' ) );
10 add_filter( 'query_vars', array( $this, 'query_vars' ) );
11 add_filter( 'request', array( $this, 'request' ) );
12 }
13
14 function query_vars( $vars ) {
15 $vars[] = 'post_or_page';
16 return $vars;
17 }
18
19 function request( $request ) {
20 if( ! isset( $request['post_or_page'] ) || ! $request['post_or_page'] )
21 return $request;
22
23 $pagename = end( preg_split( '/\//', $request['post_or_page'] ) );
24 $type = 'post';
25
26 $post_or_page = $this->get_post_or_page( $pagename );
27 if( $post_or_page ) {
28 $type = $post_or_page[0]->post_type;
29
30 if( 'page' == $type || 'attachment' == $type ) {
31 while( '0' != $post_or_page[0]->post_parent ) {
32 $post_or_page = $this->get_post_or_page( $post_or_page[0]->post_parent, 'ID' );
33 if( ! $post_or_page )
34 break;
35 $pagename = $post_or_page[0]->post_name . '/' . $pagename;
36 }
37 }
38 }
39
40 if( 'page' == $type ) {
41 $request['pagename'] = $pagename;
42 } else if( 'post' == $type ) {
43 $request['name'] = $pagename;
44 } else {
45 $request['attachment'] = $pagename;
46 }
47
48 unset( $request['post_or_page'] );
49
50 return $request;
51 }
52
53 function get_post_or_page( $name, $field = 'post_name' ) {
54 global $wpdb;
55 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 ) );
56 }
57
58 function page_rewrite_rules( $rules ) {
59 foreach( $rules as $k => $v ) {
60 $rules[$k] = str_replace( 'pagename=', 'post_or_page=', $v );
61 $rules[$k] = str_replace( 'attachment=', 'post_or_page=', $rules[$k] );
62 }
63
64 return $rules;
65 }
66
67 function post_rewrite_rules( $rules ) {
68 global $wp_rewrite;
69 if( $wp_rewrite->use_verbose_page_rules ) {
70 $wp_rewrite->use_verbose_page_rules = false;
71 add_filter( 'page_rewrite_rules', array( $this, 'page_rewrite_rules' ) );
72 foreach( $rules as $k => $v ) {
73 $rules[$k] = str_replace( 'name=', 'post_or_page=', $v );
74 $rules[$k] = str_replace( 'attachment=', 'post_or_page=', $rules[$k] );
75 }
76 }
77
78 return $rules;
79 }
80}
81
82new CWS_Non_Verbose_Page_Rules;