333 lines
7.2 KiB
PHP
333 lines
7.2 KiB
PHP
|
<?php declare(strict_types = 1);
|
||
|
/**
|
||
|
* Request collector.
|
||
|
*
|
||
|
* @package query-monitor
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @extends QM_DataCollector<QM_Data_Request>
|
||
|
*/
|
||
|
class QM_Collector_Request extends QM_DataCollector {
|
||
|
|
||
|
public $id = 'request';
|
||
|
|
||
|
public function get_storage(): QM_Data {
|
||
|
return new QM_Data_Request();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array<int, string>
|
||
|
*/
|
||
|
public function get_concerned_actions() {
|
||
|
return array(
|
||
|
# Rewrites
|
||
|
'generate_rewrite_rules',
|
||
|
|
||
|
# Everything else
|
||
|
'parse_query',
|
||
|
'parse_request',
|
||
|
'parse_tax_query',
|
||
|
'pre_get_posts',
|
||
|
'send_headers',
|
||
|
'the_post',
|
||
|
'wp',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array<int, string>
|
||
|
*/
|
||
|
public function get_concerned_filters() {
|
||
|
global $wp_rewrite;
|
||
|
|
||
|
$filters = array(
|
||
|
# Rewrite rules
|
||
|
'author_rewrite_rules',
|
||
|
'category_rewrite_rules',
|
||
|
'comments_rewrite_rules',
|
||
|
'date_rewrite_rules',
|
||
|
'page_rewrite_rules',
|
||
|
'post_format_rewrite_rules',
|
||
|
'post_rewrite_rules',
|
||
|
'root_rewrite_rules',
|
||
|
'search_rewrite_rules',
|
||
|
'tag_rewrite_rules',
|
||
|
|
||
|
# Home URL
|
||
|
'home_url',
|
||
|
|
||
|
# Post permalinks
|
||
|
'_get_page_link',
|
||
|
'attachment_link',
|
||
|
'page_link',
|
||
|
'post_link',
|
||
|
'post_type_link',
|
||
|
'pre_post_link',
|
||
|
'preview_post_link',
|
||
|
'the_permalink',
|
||
|
|
||
|
# Post type archive permalinks
|
||
|
'post_type_archive_link',
|
||
|
|
||
|
# Term permalinks
|
||
|
'category_link',
|
||
|
'pre_term_link',
|
||
|
'tag_link',
|
||
|
'term_link',
|
||
|
|
||
|
# User permalinks
|
||
|
'author_link',
|
||
|
|
||
|
# Comment permalinks
|
||
|
'get_comment_link',
|
||
|
|
||
|
# More rewrite stuff
|
||
|
'iis7_url_rewrite_rules',
|
||
|
'mod_rewrite_rules',
|
||
|
'rewrite_rules',
|
||
|
'rewrite_rules_array',
|
||
|
|
||
|
# Everything else
|
||
|
'do_parse_request',
|
||
|
'pre_handle_404',
|
||
|
'query_string',
|
||
|
'query_vars',
|
||
|
'redirect_canonical',
|
||
|
'request',
|
||
|
'wp_headers',
|
||
|
);
|
||
|
|
||
|
foreach ( $wp_rewrite->extra_permastructs as $permastructname => $struct ) {
|
||
|
$filters[] = sprintf(
|
||
|
'%s_rewrite_rules',
|
||
|
$permastructname
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return $filters;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array<int, string>
|
||
|
*/
|
||
|
public function get_concerned_options() {
|
||
|
return array(
|
||
|
'home',
|
||
|
'permalink_structure',
|
||
|
'rewrite_rules',
|
||
|
'siteurl',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array<int, string>
|
||
|
*/
|
||
|
public function get_concerned_constants() {
|
||
|
return array(
|
||
|
'WP_HOME',
|
||
|
'WP_SITEURL',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return void
|
||
|
*/
|
||
|
public function process() {
|
||
|
|
||
|
global $wp, $wp_query, $current_blog, $current_site, $wp_rewrite;
|
||
|
|
||
|
$qo = get_queried_object();
|
||
|
$user = wp_get_current_user();
|
||
|
|
||
|
if ( $user->exists() ) {
|
||
|
$user_title = sprintf(
|
||
|
/* translators: %d: User ID */
|
||
|
__( 'Current User: #%d', 'query-monitor' ),
|
||
|
$user->ID
|
||
|
);
|
||
|
} else {
|
||
|
/* translators: No user */
|
||
|
$user_title = _x( 'None', 'user', 'query-monitor' );
|
||
|
}
|
||
|
|
||
|
$this->data->user = array(
|
||
|
'title' => $user_title,
|
||
|
'data' => ( $user->exists() ? $user : false ),
|
||
|
);
|
||
|
|
||
|
if ( is_multisite() ) {
|
||
|
$this->data->multisite['current_site'] = array(
|
||
|
'title' => sprintf(
|
||
|
/* translators: %d: Multisite site ID */
|
||
|
__( 'Current Site: #%d', 'query-monitor' ),
|
||
|
$current_blog->blog_id
|
||
|
),
|
||
|
'data' => $current_blog,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( QM_Util::is_multi_network() ) {
|
||
|
$this->data->multisite['current_network'] = array(
|
||
|
'title' => sprintf(
|
||
|
/* translators: %d: Multisite network ID */
|
||
|
__( 'Current Network: #%d', 'query-monitor' ),
|
||
|
$current_site->id
|
||
|
),
|
||
|
'data' => $current_site,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if ( is_admin() ) {
|
||
|
if ( isset( $_SERVER['REQUEST_URI'] ) ) {
|
||
|
$path = parse_url( home_url(), PHP_URL_PATH );
|
||
|
$home_path = trim( $path ?: '', '/' );
|
||
|
$request = wp_unslash( $_SERVER['REQUEST_URI'] ); // phpcs:ignore
|
||
|
|
||
|
$this->data->request['request'] = str_replace( "/{$home_path}/", '', $request );
|
||
|
} else {
|
||
|
$this->data->request['request'] = '';
|
||
|
}
|
||
|
foreach ( array( 'query_string' ) as $item ) {
|
||
|
$this->data->request[ $item ] = $wp->$item;
|
||
|
}
|
||
|
} else {
|
||
|
foreach ( array( 'request', 'matched_rule', 'matched_query', 'query_string' ) as $item ) {
|
||
|
$this->data->request[ $item ] = $wp->$item;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** This filter is documented in wp-includes/class-wp.php */
|
||
|
$plugin_qvars = array_flip( apply_filters( 'query_vars', array() ) );
|
||
|
|
||
|
/** @var array<string, mixed> */
|
||
|
$qvars = $wp_query->query_vars;
|
||
|
$query_vars = array();
|
||
|
|
||
|
foreach ( $qvars as $k => $v ) {
|
||
|
if ( isset( $plugin_qvars[ $k ] ) ) {
|
||
|
if ( '' !== $v ) {
|
||
|
$query_vars[ $k ] = $v;
|
||
|
}
|
||
|
} else {
|
||
|
if ( ! empty( $v ) ) {
|
||
|
$query_vars[ $k ] = $v;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ksort( $query_vars );
|
||
|
|
||
|
# First add plugin vars to $this->data->qvars:
|
||
|
foreach ( $query_vars as $k => $v ) {
|
||
|
if ( isset( $plugin_qvars[ $k ] ) ) {
|
||
|
$this->data->qvars[ $k ] = $v;
|
||
|
$this->data->plugin_qvars[ $k ] = $v;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# Now add all other vars to $this->data->qvars:
|
||
|
foreach ( $query_vars as $k => $v ) {
|
||
|
if ( ! isset( $plugin_qvars[ $k ] ) ) {
|
||
|
$this->data->qvars[ $k ] = $v;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch ( true ) {
|
||
|
|
||
|
case ! is_object( $qo ):
|
||
|
// Nada
|
||
|
break;
|
||
|
|
||
|
case is_a( $qo, 'WP_Post' ):
|
||
|
// Single post
|
||
|
$this->data->queried_object['title'] = sprintf(
|
||
|
/* translators: 1: Post type name, 2: Post ID */
|
||
|
__( 'Single %1$s: #%2$d', 'query-monitor' ),
|
||
|
get_post_type_object( $qo->post_type )->labels->singular_name,
|
||
|
$qo->ID
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case is_a( $qo, 'WP_User' ):
|
||
|
// Author archive
|
||
|
$this->data->queried_object['title'] = sprintf(
|
||
|
/* translators: %s: Author name */
|
||
|
__( 'Author archive: %s', 'query-monitor' ),
|
||
|
$qo->user_nicename
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case is_a( $qo, 'WP_Term' ):
|
||
|
case property_exists( $qo, 'slug' ):
|
||
|
// Term archive
|
||
|
$this->data->queried_object['title'] = sprintf(
|
||
|
/* translators: %s: Taxonomy term name */
|
||
|
__( 'Term archive: %s', 'query-monitor' ),
|
||
|
$qo->slug
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case is_a( $qo, 'WP_Post_Type' ):
|
||
|
case property_exists( $qo, 'has_archive' ):
|
||
|
// Post type archive
|
||
|
$this->data->queried_object['title'] = sprintf(
|
||
|
/* translators: %s: Post type name */
|
||
|
__( 'Post type archive: %s', 'query-monitor' ),
|
||
|
$qo->name
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// Unknown, but we have a queried object
|
||
|
$this->data->queried_object['title'] = __( 'Unknown queried object', 'query-monitor' );
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( $qo ) {
|
||
|
$this->data->queried_object['data'] = $qo;
|
||
|
}
|
||
|
|
||
|
if ( isset( $_SERVER['REQUEST_METHOD'] ) ) {
|
||
|
$this->data->request_method = strtoupper( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ); // phpcs:ignore
|
||
|
} else {
|
||
|
$this->data->request_method = '';
|
||
|
}
|
||
|
|
||
|
if ( is_admin() || QM_Util::is_async() || empty( $wp_rewrite->rules ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$matching = array();
|
||
|
|
||
|
/** @var array<string, string> */
|
||
|
$rewrite_rules = $wp_rewrite->rules;
|
||
|
|
||
|
foreach ( $rewrite_rules as $match => $query ) {
|
||
|
if ( preg_match( "#^{$match}#", $this->data->request['request'] ) ) {
|
||
|
$matching[ $match ] = $query;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$this->data->matching_rewrites = $matching;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array<string, QM_Collector> $collectors
|
||
|
* @param QueryMonitor $qm
|
||
|
* @return array<string, QM_Collector>
|
||
|
*/
|
||
|
function register_qm_collector_request( array $collectors, QueryMonitor $qm ) {
|
||
|
$collectors['request'] = new QM_Collector_Request();
|
||
|
return $collectors;
|
||
|
}
|
||
|
|
||
|
add_filter( 'qm/collectors', 'register_qm_collector_request', 10, 2 );
|