/**
* Parses the request to find the correct WordPress query.
*
* Sets up the query variables based on the request. There are also many
* filters and actions that can be used to further manipulate the result.
*
* @since 2.0.0
* @since 6.0.0 A return value was added.
*
* @global WP_Rewrite extra_query_vars Set the extra query variables.
* @return bool Whether the request was parsed.
*/
public function parse_request( wp_rewrite;
/**
* Filters whether to parse the request.
*
* @since 3.5.0
*
* @param bool wp Current WordPress environment instance.
* @param array|string this, this->query_vars = array();
extra_query_vars ) ) {
extra_query_vars;
} elseif ( ! empty( extra_query_vars, rewrite = rewrite ) ) {
// If we match a rewrite rule, this will be cleared.
this->did_permalink = true;
_SERVER['PATH_INFO'] ) ? pathinfo ) = explode( '?', pathinfo = str_replace( '%', '%25', req_uri ) = explode( '?', self = home_path = parse_url( home_url(), PHP_URL_PATH );
home_path ) && '' !== home_path = trim( home_path_regex = sprintf( '|^%s|i', preg_quote( req_uri = str_replace( req_uri );
req_uri, '/' );
pathinfo, '/' );
self, '/' );
if ( ! empty( req_uri = preg_replace( req_uri );
req_uri, '/' );
home_path_regex, '', pathinfo = trim( self = preg_replace( self );
self, '/' );
}
// The requested permalink is in req_uri for other requests.
if ( ! empty( wp_rewrite->index . 'pathinfo ) ) {
pathinfo;
} else {
// If the request uri is the index, blank it out so that we don't try to match it against a rule.
if ( wp_rewrite->index ) {
requested_path = requested_file = this->request = request_match = request_match ) ) {
// An empty request could only match against ^rewrite['this->matched_rule = 'query = '];
rewrite as query ) {
// If the requested file is the anchor of the match, prepend it to the path info.
if ( ! empty( match, requested_file !== request_match = requested_path;
}
if ( preg_match( "#^request_match, match#", urldecode( matches )
) {
if (
query, page = get_page_by_path( varmatch[1] ] );
if ( ! post_status_obj = get_post_status_object( post_status_obj->public && ! post_status_obj->private && this->matched_rule = this->matched_rule ) ) {
// Trim the query of everything up to the '?'.
query );
// Substitute the substring matches into the query.
query, this->matched_query = query, error ) {
unset( _GET['error'] );
}
}
// If req_uri is empty or if it is a request for ourself, unset error.
if ( empty( requested_file === _SERVER['PHP_SELF'], 'wp-admin/' )
) {
unset( _GET['error'] );
if ( isset( _SERVER['PHP_SELF'], 'wp-admin/' ) ) {
unset( this->did_permalink = false;
}
}
/**
* Filters the query variables allowed before processing.
*
* Allows (publicly allowed) query vars to be added, removed, or changed prior
* to executing the query. Needed to allow custom rewrite rules using your own arguments
* to work, or any other custom query variables you want to be publicly available.
*
* @since 1.5.0
*
* @param string[] this->public_query_vars = apply_filters( 'query_vars', post_type => t ) && post_type_query_vars[ post_type;
}
}
foreach ( wpvar ) {
if ( isset( wpvar ] ) ) {
wpvar ] = wpvar ];
} elseif ( isset( wpvar ] ) && isset( wpvar ] )
&& wpvar ] !== wpvar ]
) {
wp_die(
__( 'A variable mismatch has been detected.' ),
__( 'Sorry, you are not allowed to view this item.' ),
400
);
} elseif ( isset( wpvar ] ) ) {
wpvar ] = wpvar ];
} elseif ( isset( wpvar ] ) ) {
wpvar ] = wpvar ];
} elseif ( isset( wpvar ] ) ) {
wpvar ] = wpvar ];
}
if ( ! empty( wpvar ] ) ) {
if ( ! is_array( wpvar ] ) ) {
wpvar ] = (string) wpvar ];
} else {
foreach ( wpvar ] as v ) {
if ( is_scalar( this->query_vars[ vkey ] = (string) post_type_query_vars[ this->query_vars['post_type'] = wpvar ];
this->query_vars[ taxonomy => t->query_var && isset( t->query_var ] ) ) {
t->query_var ] = str_replace( ' ', '+', t->query_var ] );
}
}
// Don't allow non-publicly queryable taxonomies to be queried from the front end.
if ( ! is_admin() ) {
foreach ( get_taxonomies( array( 'publicly_queryable' => false ), 'objects' ) as t ) {
/*
* Disallow when set to the 'taxonomy' query var.
* Non-publicly queryable taxonomies cannot register custom query vars. See register_taxonomy().
*/
if ( isset( taxonomy === this->query_vars['taxonomy'], this->query_vars['post_type'] ) ) {
this->query_vars['post_type'] ) ) {
if ( ! in_array( queryable_post_types, true ) ) {
unset( this->query_vars['post_type'] = array_intersect( queryable_post_types );
}
}
// Resolve conflicts between posts with numeric slugs and date archive queries.
this->query_vars );
foreach ( (array) var ) {
if ( isset( var ] ) ) {
var ] = var ];
}
}
if ( isset( this->query_vars['error'] = query_vars The array of requested query variables.
*/
this->query_vars );
/**
* Fires once all query variables for the current request have been parsed.
*
* @since 2.1.0
*
* @param WP this ) );
return true;
}
上述代码是WordPress核心类
WP
中parse_request
方法的详细实现。这个方法负责解析传入的URL或请求,以确定应执行哪个WordPress查询。以下是对此方法的作用和工作方式的解释,分解为其关键组件:parse_request
的目的parse_request
方法旨在根据传入请求设置查询变量。它确定请求应如何处理——无论是渲染文章、页面、类别列表还是处理404错误。关键步骤和操作
do_parse_request
过滤器。插件可以使用此过滤器来跳过解析过程。$wp_rewrite
检索WordPress重写规则。结论
parse_request
函数是WordPress解释和响应URL的能力的核心部分。它使用重写规则将URL映射到查询变量,处理来自GET和POST请求的传入变量,并确保只执行允许的查询。这个方法对于确保WordPress可以为不同的URL提供正确的内容至关重要,无论这些URL指向文章、页面、存档还是自定义文章类型和分类法。开发中的使用
开发人员可以使用提供的钩子(
do_parse_request
、query_vars
、request
和parse_request
)来扩展或修改这种行为,以定制WordPress对不同请求的响应,这对于需要专门路由的自定义插件或主题特别有用。