WordPress.org

Make WordPress Core

Ticket #16687: non-verbose-003.php

File non-verbose-003.php, 2.2 KB (added by greuben, 9 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;