Edit File by line
/home/zeestwma/redstone.../wp-inclu...
File: class-wp-rewrite.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* Rewrite API: WP_Rewrite class
[2] Fix | Delete
*
[3] Fix | Delete
* @package WordPress
[4] Fix | Delete
* @subpackage Rewrite
[5] Fix | Delete
* @since 1.5.0
[6] Fix | Delete
*/
[7] Fix | Delete
[8] Fix | Delete
/**
[9] Fix | Delete
* Core class used to implement a rewrite component API.
[10] Fix | Delete
*
[11] Fix | Delete
* The WordPress Rewrite class writes the rewrite module rules to the .htaccess
[12] Fix | Delete
* file. It also handles parsing the request to get the correct setup for the
[13] Fix | Delete
* WordPress Query class.
[14] Fix | Delete
*
[15] Fix | Delete
* The Rewrite along with WP class function as a front controller for WordPress.
[16] Fix | Delete
* You can add rules to trigger your page view and processing using this
[17] Fix | Delete
* component. The full functionality of a front controller does not exist,
[18] Fix | Delete
* meaning you can't define how the template files load based on the rewrite
[19] Fix | Delete
* rules.
[20] Fix | Delete
*
[21] Fix | Delete
* @since 1.5.0
[22] Fix | Delete
*/
[23] Fix | Delete
#[AllowDynamicProperties]
[24] Fix | Delete
class WP_Rewrite {
[25] Fix | Delete
/**
[26] Fix | Delete
* Permalink structure for posts.
[27] Fix | Delete
*
[28] Fix | Delete
* @since 1.5.0
[29] Fix | Delete
* @var string
[30] Fix | Delete
*/
[31] Fix | Delete
public $permalink_structure;
[32] Fix | Delete
[33] Fix | Delete
/**
[34] Fix | Delete
* Whether to add trailing slashes.
[35] Fix | Delete
*
[36] Fix | Delete
* @since 2.2.0
[37] Fix | Delete
* @var bool
[38] Fix | Delete
*/
[39] Fix | Delete
public $use_trailing_slashes;
[40] Fix | Delete
[41] Fix | Delete
/**
[42] Fix | Delete
* Base for the author permalink structure (example.com/$author_base/authorname).
[43] Fix | Delete
*
[44] Fix | Delete
* @since 1.5.0
[45] Fix | Delete
* @var string
[46] Fix | Delete
*/
[47] Fix | Delete
public $author_base = 'author';
[48] Fix | Delete
[49] Fix | Delete
/**
[50] Fix | Delete
* Permalink structure for author archives.
[51] Fix | Delete
*
[52] Fix | Delete
* @since 1.5.0
[53] Fix | Delete
* @var string
[54] Fix | Delete
*/
[55] Fix | Delete
public $author_structure;
[56] Fix | Delete
[57] Fix | Delete
/**
[58] Fix | Delete
* Permalink structure for date archives.
[59] Fix | Delete
*
[60] Fix | Delete
* @since 1.5.0
[61] Fix | Delete
* @var string
[62] Fix | Delete
*/
[63] Fix | Delete
public $date_structure;
[64] Fix | Delete
[65] Fix | Delete
/**
[66] Fix | Delete
* Permalink structure for pages.
[67] Fix | Delete
*
[68] Fix | Delete
* @since 1.5.0
[69] Fix | Delete
* @var string
[70] Fix | Delete
*/
[71] Fix | Delete
public $page_structure;
[72] Fix | Delete
[73] Fix | Delete
/**
[74] Fix | Delete
* Base of the search permalink structure (example.com/$search_base/query).
[75] Fix | Delete
*
[76] Fix | Delete
* @since 1.5.0
[77] Fix | Delete
* @var string
[78] Fix | Delete
*/
[79] Fix | Delete
public $search_base = 'search';
[80] Fix | Delete
[81] Fix | Delete
/**
[82] Fix | Delete
* Permalink structure for searches.
[83] Fix | Delete
*
[84] Fix | Delete
* @since 1.5.0
[85] Fix | Delete
* @var string
[86] Fix | Delete
*/
[87] Fix | Delete
public $search_structure;
[88] Fix | Delete
[89] Fix | Delete
/**
[90] Fix | Delete
* Comments permalink base.
[91] Fix | Delete
*
[92] Fix | Delete
* @since 1.5.0
[93] Fix | Delete
* @var string
[94] Fix | Delete
*/
[95] Fix | Delete
public $comments_base = 'comments';
[96] Fix | Delete
[97] Fix | Delete
/**
[98] Fix | Delete
* Pagination permalink base.
[99] Fix | Delete
*
[100] Fix | Delete
* @since 3.1.0
[101] Fix | Delete
* @var string
[102] Fix | Delete
*/
[103] Fix | Delete
public $pagination_base = 'page';
[104] Fix | Delete
[105] Fix | Delete
/**
[106] Fix | Delete
* Comments pagination permalink base.
[107] Fix | Delete
*
[108] Fix | Delete
* @since 4.2.0
[109] Fix | Delete
* @var string
[110] Fix | Delete
*/
[111] Fix | Delete
public $comments_pagination_base = 'comment-page';
[112] Fix | Delete
[113] Fix | Delete
/**
[114] Fix | Delete
* Feed permalink base.
[115] Fix | Delete
*
[116] Fix | Delete
* @since 1.5.0
[117] Fix | Delete
* @var string
[118] Fix | Delete
*/
[119] Fix | Delete
public $feed_base = 'feed';
[120] Fix | Delete
[121] Fix | Delete
/**
[122] Fix | Delete
* Comments feed permalink structure.
[123] Fix | Delete
*
[124] Fix | Delete
* @since 1.5.0
[125] Fix | Delete
* @var string
[126] Fix | Delete
*/
[127] Fix | Delete
public $comment_feed_structure;
[128] Fix | Delete
[129] Fix | Delete
/**
[130] Fix | Delete
* Feed request permalink structure.
[131] Fix | Delete
*
[132] Fix | Delete
* @since 1.5.0
[133] Fix | Delete
* @var string
[134] Fix | Delete
*/
[135] Fix | Delete
public $feed_structure;
[136] Fix | Delete
[137] Fix | Delete
/**
[138] Fix | Delete
* The static portion of the post permalink structure.
[139] Fix | Delete
*
[140] Fix | Delete
* If the permalink structure is "/archive/%post_id%" then the front
[141] Fix | Delete
* is "/archive/". If the permalink structure is "/%year%/%postname%/"
[142] Fix | Delete
* then the front is "/".
[143] Fix | Delete
*
[144] Fix | Delete
* @since 1.5.0
[145] Fix | Delete
* @var string
[146] Fix | Delete
*
[147] Fix | Delete
* @see WP_Rewrite::init()
[148] Fix | Delete
*/
[149] Fix | Delete
public $front;
[150] Fix | Delete
[151] Fix | Delete
/**
[152] Fix | Delete
* The prefix for all permalink structures.
[153] Fix | Delete
*
[154] Fix | Delete
* If PATHINFO/index permalinks are in use then the root is the value of
[155] Fix | Delete
* `WP_Rewrite::$index` with a trailing slash appended. Otherwise the root
[156] Fix | Delete
* will be empty.
[157] Fix | Delete
*
[158] Fix | Delete
* @since 1.5.0
[159] Fix | Delete
* @var string
[160] Fix | Delete
*
[161] Fix | Delete
* @see WP_Rewrite::init()
[162] Fix | Delete
* @see WP_Rewrite::using_index_permalinks()
[163] Fix | Delete
*/
[164] Fix | Delete
public $root = '';
[165] Fix | Delete
[166] Fix | Delete
/**
[167] Fix | Delete
* The name of the index file which is the entry point to all requests.
[168] Fix | Delete
*
[169] Fix | Delete
* @since 1.5.0
[170] Fix | Delete
* @var string
[171] Fix | Delete
*/
[172] Fix | Delete
public $index = 'index.php';
[173] Fix | Delete
[174] Fix | Delete
/**
[175] Fix | Delete
* Variable name to use for regex matches in the rewritten query.
[176] Fix | Delete
*
[177] Fix | Delete
* @since 1.5.0
[178] Fix | Delete
* @var string
[179] Fix | Delete
*/
[180] Fix | Delete
public $matches = '';
[181] Fix | Delete
[182] Fix | Delete
/**
[183] Fix | Delete
* Rewrite rules to match against the request to find the redirect or query.
[184] Fix | Delete
*
[185] Fix | Delete
* @since 1.5.0
[186] Fix | Delete
* @var string[]
[187] Fix | Delete
*/
[188] Fix | Delete
public $rules;
[189] Fix | Delete
[190] Fix | Delete
/**
[191] Fix | Delete
* Additional rules added external to the rewrite class.
[192] Fix | Delete
*
[193] Fix | Delete
* Those not generated by the class, see add_rewrite_rule().
[194] Fix | Delete
*
[195] Fix | Delete
* @since 2.1.0
[196] Fix | Delete
* @var string[]
[197] Fix | Delete
*/
[198] Fix | Delete
public $extra_rules = array();
[199] Fix | Delete
[200] Fix | Delete
/**
[201] Fix | Delete
* Additional rules that belong at the beginning to match first.
[202] Fix | Delete
*
[203] Fix | Delete
* Those not generated by the class, see add_rewrite_rule().
[204] Fix | Delete
*
[205] Fix | Delete
* @since 2.3.0
[206] Fix | Delete
* @var string[]
[207] Fix | Delete
*/
[208] Fix | Delete
public $extra_rules_top = array();
[209] Fix | Delete
[210] Fix | Delete
/**
[211] Fix | Delete
* Rules that don't redirect to WordPress' index.php.
[212] Fix | Delete
*
[213] Fix | Delete
* These rules are written to the mod_rewrite portion of the .htaccess,
[214] Fix | Delete
* and are added by add_external_rule().
[215] Fix | Delete
*
[216] Fix | Delete
* @since 2.1.0
[217] Fix | Delete
* @var string[]
[218] Fix | Delete
*/
[219] Fix | Delete
public $non_wp_rules = array();
[220] Fix | Delete
[221] Fix | Delete
/**
[222] Fix | Delete
* Extra permalink structures, e.g. categories, added by add_permastruct().
[223] Fix | Delete
*
[224] Fix | Delete
* @since 2.1.0
[225] Fix | Delete
* @var array[]
[226] Fix | Delete
*/
[227] Fix | Delete
public $extra_permastructs = array();
[228] Fix | Delete
[229] Fix | Delete
/**
[230] Fix | Delete
* Endpoints (like /trackback/) added by add_rewrite_endpoint().
[231] Fix | Delete
*
[232] Fix | Delete
* @since 2.1.0
[233] Fix | Delete
* @var array[]
[234] Fix | Delete
*/
[235] Fix | Delete
public $endpoints;
[236] Fix | Delete
[237] Fix | Delete
/**
[238] Fix | Delete
* Whether to write every mod_rewrite rule for WordPress into the .htaccess file.
[239] Fix | Delete
*
[240] Fix | Delete
* This is off by default, turning it on might print a lot of rewrite rules
[241] Fix | Delete
* to the .htaccess file.
[242] Fix | Delete
*
[243] Fix | Delete
* @since 2.0.0
[244] Fix | Delete
* @var bool
[245] Fix | Delete
*
[246] Fix | Delete
* @see WP_Rewrite::mod_rewrite_rules()
[247] Fix | Delete
*/
[248] Fix | Delete
public $use_verbose_rules = false;
[249] Fix | Delete
[250] Fix | Delete
/**
[251] Fix | Delete
* Could post permalinks be confused with those of pages?
[252] Fix | Delete
*
[253] Fix | Delete
* If the first rewrite tag in the post permalink structure is one that could
[254] Fix | Delete
* also match a page name (e.g. %postname% or %author%) then this flag is
[255] Fix | Delete
* set to true. Prior to WordPress 3.3 this flag indicated that every page
[256] Fix | Delete
* would have a set of rules added to the top of the rewrite rules array.
[257] Fix | Delete
* Now it tells WP::parse_request() to check if a URL matching the page
[258] Fix | Delete
* permastruct is actually a page before accepting it.
[259] Fix | Delete
*
[260] Fix | Delete
* @since 2.5.0
[261] Fix | Delete
* @var bool
[262] Fix | Delete
*
[263] Fix | Delete
* @see WP_Rewrite::init()
[264] Fix | Delete
*/
[265] Fix | Delete
public $use_verbose_page_rules = true;
[266] Fix | Delete
[267] Fix | Delete
/**
[268] Fix | Delete
* Rewrite tags that can be used in permalink structures.
[269] Fix | Delete
*
[270] Fix | Delete
* These are translated into the regular expressions stored in
[271] Fix | Delete
* `WP_Rewrite::$rewritereplace` and are rewritten to the query
[272] Fix | Delete
* variables listed in WP_Rewrite::$queryreplace.
[273] Fix | Delete
*
[274] Fix | Delete
* Additional tags can be added with add_rewrite_tag().
[275] Fix | Delete
*
[276] Fix | Delete
* @since 1.5.0
[277] Fix | Delete
* @var string[]
[278] Fix | Delete
*/
[279] Fix | Delete
public $rewritecode = array(
[280] Fix | Delete
'%year%',
[281] Fix | Delete
'%monthnum%',
[282] Fix | Delete
'%day%',
[283] Fix | Delete
'%hour%',
[284] Fix | Delete
'%minute%',
[285] Fix | Delete
'%second%',
[286] Fix | Delete
'%postname%',
[287] Fix | Delete
'%post_id%',
[288] Fix | Delete
'%author%',
[289] Fix | Delete
'%pagename%',
[290] Fix | Delete
'%search%',
[291] Fix | Delete
);
[292] Fix | Delete
[293] Fix | Delete
/**
[294] Fix | Delete
* Regular expressions to be substituted into rewrite rules in place
[295] Fix | Delete
* of rewrite tags, see WP_Rewrite::$rewritecode.
[296] Fix | Delete
*
[297] Fix | Delete
* @since 1.5.0
[298] Fix | Delete
* @var string[]
[299] Fix | Delete
*/
[300] Fix | Delete
public $rewritereplace = array(
[301] Fix | Delete
'([0-9]{4})',
[302] Fix | Delete
'([0-9]{1,2})',
[303] Fix | Delete
'([0-9]{1,2})',
[304] Fix | Delete
'([0-9]{1,2})',
[305] Fix | Delete
'([0-9]{1,2})',
[306] Fix | Delete
'([0-9]{1,2})',
[307] Fix | Delete
'([^/]+)',
[308] Fix | Delete
'([0-9]+)',
[309] Fix | Delete
'([^/]+)',
[310] Fix | Delete
'([^/]+?)',
[311] Fix | Delete
'(.+)',
[312] Fix | Delete
);
[313] Fix | Delete
[314] Fix | Delete
/**
[315] Fix | Delete
* Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode.
[316] Fix | Delete
*
[317] Fix | Delete
* @since 1.5.0
[318] Fix | Delete
* @var string[]
[319] Fix | Delete
*/
[320] Fix | Delete
public $queryreplace = array(
[321] Fix | Delete
'year=',
[322] Fix | Delete
'monthnum=',
[323] Fix | Delete
'day=',
[324] Fix | Delete
'hour=',
[325] Fix | Delete
'minute=',
[326] Fix | Delete
'second=',
[327] Fix | Delete
'name=',
[328] Fix | Delete
'p=',
[329] Fix | Delete
'author_name=',
[330] Fix | Delete
'pagename=',
[331] Fix | Delete
's=',
[332] Fix | Delete
);
[333] Fix | Delete
[334] Fix | Delete
/**
[335] Fix | Delete
* Supported default feeds.
[336] Fix | Delete
*
[337] Fix | Delete
* @since 1.5.0
[338] Fix | Delete
* @var string[]
[339] Fix | Delete
*/
[340] Fix | Delete
public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' );
[341] Fix | Delete
[342] Fix | Delete
/**
[343] Fix | Delete
* Determines whether permalinks are being used.
[344] Fix | Delete
*
[345] Fix | Delete
* This can be either rewrite module or permalink in the HTTP query string.
[346] Fix | Delete
*
[347] Fix | Delete
* @since 1.5.0
[348] Fix | Delete
*
[349] Fix | Delete
* @return bool True, if permalinks are enabled.
[350] Fix | Delete
*/
[351] Fix | Delete
public function using_permalinks() {
[352] Fix | Delete
return ! empty( $this->permalink_structure );
[353] Fix | Delete
}
[354] Fix | Delete
[355] Fix | Delete
/**
[356] Fix | Delete
* Determines whether permalinks are being used and rewrite module is not enabled.
[357] Fix | Delete
*
[358] Fix | Delete
* Means that permalink links are enabled and index.php is in the URL.
[359] Fix | Delete
*
[360] Fix | Delete
* @since 1.5.0
[361] Fix | Delete
*
[362] Fix | Delete
* @return bool Whether permalink links are enabled and index.php is in the URL.
[363] Fix | Delete
*/
[364] Fix | Delete
public function using_index_permalinks() {
[365] Fix | Delete
if ( empty( $this->permalink_structure ) ) {
[366] Fix | Delete
return false;
[367] Fix | Delete
}
[368] Fix | Delete
[369] Fix | Delete
// If the index is not in the permalink, we're using mod_rewrite.
[370] Fix | Delete
return preg_match( '#^/*' . $this->index . '#', $this->permalink_structure );
[371] Fix | Delete
}
[372] Fix | Delete
[373] Fix | Delete
/**
[374] Fix | Delete
* Determines whether permalinks are being used and rewrite module is enabled.
[375] Fix | Delete
*
[376] Fix | Delete
* Using permalinks and index.php is not in the URL.
[377] Fix | Delete
*
[378] Fix | Delete
* @since 1.5.0
[379] Fix | Delete
*
[380] Fix | Delete
* @return bool Whether permalink links are enabled and index.php is NOT in the URL.
[381] Fix | Delete
*/
[382] Fix | Delete
public function using_mod_rewrite_permalinks() {
[383] Fix | Delete
return $this->using_permalinks() && ! $this->using_index_permalinks();
[384] Fix | Delete
}
[385] Fix | Delete
[386] Fix | Delete
/**
[387] Fix | Delete
* Indexes for matches for usage in preg_*() functions.
[388] Fix | Delete
*
[389] Fix | Delete
* The format of the string is, with empty matches property value, '$NUM'.
[390] Fix | Delete
* The 'NUM' will be replaced with the value in the $number parameter. With
[391] Fix | Delete
* the matches property not empty, the value of the returned string will
[392] Fix | Delete
* contain that value of the matches property. The format then will be
[393] Fix | Delete
* '$MATCHES[NUM]', with MATCHES as the value in the property and NUM the
[394] Fix | Delete
* value of the $number parameter.
[395] Fix | Delete
*
[396] Fix | Delete
* @since 1.5.0
[397] Fix | Delete
*
[398] Fix | Delete
* @param int $number Index number.
[399] Fix | Delete
* @return string
[400] Fix | Delete
*/
[401] Fix | Delete
public function preg_index( $number ) {
[402] Fix | Delete
$match_prefix = '$';
[403] Fix | Delete
$match_suffix = '';
[404] Fix | Delete
[405] Fix | Delete
if ( ! empty( $this->matches ) ) {
[406] Fix | Delete
$match_prefix = '$' . $this->matches . '[';
[407] Fix | Delete
$match_suffix = ']';
[408] Fix | Delete
}
[409] Fix | Delete
[410] Fix | Delete
return "$match_prefix$number$match_suffix";
[411] Fix | Delete
}
[412] Fix | Delete
[413] Fix | Delete
/**
[414] Fix | Delete
* Retrieves all pages and attachments for pages URIs.
[415] Fix | Delete
*
[416] Fix | Delete
* The attachments are for those that have pages as parents and will be
[417] Fix | Delete
* retrieved.
[418] Fix | Delete
*
[419] Fix | Delete
* @since 2.5.0
[420] Fix | Delete
*
[421] Fix | Delete
* @global wpdb $wpdb WordPress database abstraction object.
[422] Fix | Delete
*
[423] Fix | Delete
* @return array Array of page URIs as first element and attachment URIs as second element.
[424] Fix | Delete
*/
[425] Fix | Delete
public function page_uri_index() {
[426] Fix | Delete
global $wpdb;
[427] Fix | Delete
[428] Fix | Delete
// Get pages in order of hierarchy, i.e. children after parents.
[429] Fix | Delete
$pages = $wpdb->get_results( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'" );
[430] Fix | Delete
$posts = get_page_hierarchy( $pages );
[431] Fix | Delete
[432] Fix | Delete
// If we have no pages get out quick.
[433] Fix | Delete
if ( ! $posts ) {
[434] Fix | Delete
return array( array(), array() );
[435] Fix | Delete
}
[436] Fix | Delete
[437] Fix | Delete
// Now reverse it, because we need parents after children for rewrite rules to work properly.
[438] Fix | Delete
$posts = array_reverse( $posts, true );
[439] Fix | Delete
[440] Fix | Delete
$page_uris = array();
[441] Fix | Delete
$page_attachment_uris = array();
[442] Fix | Delete
[443] Fix | Delete
foreach ( $posts as $id => $post ) {
[444] Fix | Delete
// URL => page name.
[445] Fix | Delete
$uri = get_page_uri( $id );
[446] Fix | Delete
$attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id ) );
[447] Fix | Delete
if ( ! empty( $attachments ) ) {
[448] Fix | Delete
foreach ( $attachments as $attachment ) {
[449] Fix | Delete
$attach_uri = get_page_uri( $attachment->ID );
[450] Fix | Delete
$page_attachment_uris[ $attach_uri ] = $attachment->ID;
[451] Fix | Delete
}
[452] Fix | Delete
}
[453] Fix | Delete
[454] Fix | Delete
$page_uris[ $uri ] = $id;
[455] Fix | Delete
}
[456] Fix | Delete
[457] Fix | Delete
return array( $page_uris, $page_attachment_uris );
[458] Fix | Delete
}
[459] Fix | Delete
[460] Fix | Delete
/**
[461] Fix | Delete
* Retrieves all of the rewrite rules for pages.
[462] Fix | Delete
*
[463] Fix | Delete
* @since 1.5.0
[464] Fix | Delete
*
[465] Fix | Delete
* @return string[] Page rewrite rules.
[466] Fix | Delete
*/
[467] Fix | Delete
public function page_rewrite_rules() {
[468] Fix | Delete
// The extra .? at the beginning prevents clashes with other regular expressions in the rules array.
[469] Fix | Delete
$this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' );
[470] Fix | Delete
[471] Fix | Delete
return $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false );
[472] Fix | Delete
}
[473] Fix | Delete
[474] Fix | Delete
/**
[475] Fix | Delete
* Retrieves date permalink structure, with year, month, and day.
[476] Fix | Delete
*
[477] Fix | Delete
* The permalink structure for the date, if not set already depends on the
[478] Fix | Delete
* permalink structure. It can be one of three formats. The first is year,
[479] Fix | Delete
* month, day; the second is day, month, year; and the last format is month,
[480] Fix | Delete
* day, year. These are matched against the permalink structure for which
[481] Fix | Delete
* one is used. If none matches, then the default will be used, which is
[482] Fix | Delete
* year, month, day.
[483] Fix | Delete
*
[484] Fix | Delete
* Prevents post ID and date permalinks from overlapping. In the case of
[485] Fix | Delete
* post_id, the date permalink will be prepended with front permalink with
[486] Fix | Delete
* 'date/' before the actual permalink to form the complete date permalink
[487] Fix | Delete
* structure.
[488] Fix | Delete
*
[489] Fix | Delete
* @since 1.5.0
[490] Fix | Delete
*
[491] Fix | Delete
* @return string|false Date permalink structure on success, false on failure.
[492] Fix | Delete
*/
[493] Fix | Delete
public function get_date_permastruct() {
[494] Fix | Delete
if ( isset( $this->date_structure ) ) {
[495] Fix | Delete
return $this->date_structure;
[496] Fix | Delete
}
[497] Fix | Delete
[498] Fix | Delete
if ( empty( $this->permalink_structure ) ) {
[499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function