/**
* 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 ( ![Rendered by QuickLaTeX.com wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=$matches\[([0-9]+)\]/',](https://www.zhichai.top/wp-content/ql-cache/quicklatex.com-6082a040537b574343c7e6bd6691cfc0_l3.png)
友情链接:ACEJoy
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
过滤器。插件可以使用此过滤器来跳过解析过程。 - 初始化:
- 清除任何之前的查询变量。
- 初始化本地变量以处理URL的不同组件。
- 处理额外的查询变量:如果提供了任何额外的查询变量,它们将被整合到查询处理中。
- 应用重写规则:
- 从
$wp_rewrite
检索WordPress重写规则。 - 处理请求URI和路径信息,去除家庭URL路径,留下将与重写规则匹配的相对路径或查询字符串。
- 与重写规则匹配:
- 迭代重写规则以找到与处理后的请求路径的匹配项。
- 如果找到匹配,相应的WordPress查询变量将根据重写规则设置。
- 文章类型和分类法处理:
- 将与文章类型或分类法相关的任何查询变量映射到其相应的查询。
- 确保只能查询公开可查询的文章类型和分类法。
- 安全和清洁:
- 处理GET和POST请求之间潜在的变量冲突。
- 过滤查询变量以确保最终查询中只包含允许的键。
- 最终查询变量准备:
- 应用过滤器以修改或验证查询变量列表。
- 解决URL中的数字slug冲突。
- 动作钩子:
- 执行操作,允许插件在解析查询变量后执行操作。
结论
parse_request
函数是WordPress解释和响应URL的能力的核心部分。它使用重写规则将URL映射到查询变量,处理来自GET和POST请求的传入变量,并确保只执行允许的查询。这个方法对于确保WordPress可以为不同的URL提供正确的内容至关重要,无论这些URL指向文章、页面、存档还是自定义文章类型和分类法。
开发中的使用
开发人员可以使用提供的钩子(do_parse_request
、query_vars
、request
和parse_request
)来扩展或修改这种行为,以定制WordPress对不同请求的响应,这对于需要专门路由的自定义插件或主题特别有用。
发表回复