You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
5.3 KiB
PHTML
207 lines
5.3 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* Google URL Inspection API.
|
||
|
*
|
||
|
* @since 1.0.84
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\modules
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Google;
|
||
|
|
||
|
use RankMath\Helper;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Analytics class.
|
||
|
*/
|
||
|
class Url_Inspection extends Request {
|
||
|
/**
|
||
|
* URL Inspection API base URL.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
private $api_url = 'https://searchconsole.googleapis.com/v1/urlInspection/index:inspect';
|
||
|
|
||
|
/**
|
||
|
* Access token.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public $token = [];
|
||
|
|
||
|
/**
|
||
|
* Main instance
|
||
|
*
|
||
|
* Ensure only one instance is loaded or can be loaded.
|
||
|
*
|
||
|
* @return Url_Inspection
|
||
|
*/
|
||
|
public static function get() {
|
||
|
static $instance;
|
||
|
|
||
|
if ( is_null( $instance ) && ! ( $instance instanceof Url_Inspection ) ) {
|
||
|
$instance = new Url_Inspection();
|
||
|
$instance->setup();
|
||
|
}
|
||
|
|
||
|
return $instance;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Setup token.
|
||
|
*/
|
||
|
public function setup() {
|
||
|
if ( ! Authentication::is_authorized() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$tokens = Authentication::tokens();
|
||
|
$this->token = $tokens['access_token'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Send URL to the API and return the response, or false on failure.
|
||
|
*
|
||
|
* @param string $page URL to inspect (relative).
|
||
|
*/
|
||
|
public function get_api_results( $page ) {
|
||
|
$lang_arr = \explode( '_', get_locale() );
|
||
|
$lang_code = empty( $lang_arr[1] ) ? $lang_arr[0] : $lang_arr[0] . '-' . $lang_arr[1];
|
||
|
|
||
|
$args = [
|
||
|
'inspectionUrl' => untrailingslashit( Helper::get_home_url() ) . $page,
|
||
|
'siteUrl' => Console::get_site_url(),
|
||
|
'languageCode' => $lang_code,
|
||
|
];
|
||
|
|
||
|
set_time_limit( 90 );
|
||
|
|
||
|
$workflow = 'inspections';
|
||
|
$this->set_workflow( $workflow );
|
||
|
|
||
|
$response = $this->http_post( $this->api_url, $args, 60 );
|
||
|
|
||
|
$this->log_failed_request( $response, $workflow, $page, func_get_args() );
|
||
|
|
||
|
if ( ! $this->is_success() ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get inspection data.
|
||
|
*
|
||
|
* @param string $page URL to inspect.
|
||
|
*/
|
||
|
public function get_inspection_data( $page ) {
|
||
|
$inspection = $this->get_api_results( $page );
|
||
|
if ( empty( $inspection ) || empty( $inspection['inspectionResult'] ) ) {
|
||
|
return;
|
||
|
}
|
||
|
$inspection = $this->normalize_inspection_data( $inspection );
|
||
|
|
||
|
$inspection['page'] = $page;
|
||
|
|
||
|
return $inspection;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Normalize inspection data.
|
||
|
*
|
||
|
* @param array $inspection Inspection data.
|
||
|
*/
|
||
|
private function normalize_inspection_data( $inspection ) {
|
||
|
$incoming = $inspection['inspectionResult'];
|
||
|
$normalized = [];
|
||
|
|
||
|
$map_properties = [
|
||
|
'indexStatusResult.verdict' => 'index_verdict',
|
||
|
'indexStatusResult.coverageState' => 'coverage_state',
|
||
|
'indexStatusResult.indexingState' => 'indexing_state',
|
||
|
'indexStatusResult.pageFetchState' => 'page_fetch_state',
|
||
|
'indexStatusResult.robotsTxtState' => 'robots_txt_state',
|
||
|
'mobileUsabilityResult.verdict' => 'mobile_usability_verdict',
|
||
|
'mobileUsabilityResult.issues' => 'mobile_usability_issues',
|
||
|
'richResultsResult.verdict' => 'rich_results_verdict',
|
||
|
'indexStatusResult.crawledAs' => 'crawled_as',
|
||
|
'indexStatusResult.googleCanonical' => 'google_canonical',
|
||
|
'indexStatusResult.userCanonical' => 'user_canonical',
|
||
|
'indexStatusResult.sitemap' => 'sitemap',
|
||
|
'indexStatusResult.referringUrls' => 'referring_urls',
|
||
|
];
|
||
|
|
||
|
$this->assign_inspection_values( $incoming, $map_properties, $normalized );
|
||
|
|
||
|
$normalized = apply_filters( 'rank_math/analytics/url_inspection_map_properties', $normalized, $incoming );
|
||
|
|
||
|
return $normalized;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Assign inspection field value to the data array.
|
||
|
*
|
||
|
* @param array $raw_data Raw data.
|
||
|
* @param string $field Field name.
|
||
|
* @param string $assign_to Field name to assign to.
|
||
|
* @param array $data Data array.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function assign_inspection_value( $raw_data, $field, $assign_to, &$data ) {
|
||
|
$data[ $assign_to ] = $this->get_result_field( $raw_data, $field );
|
||
|
|
||
|
if ( is_array( $data[ $assign_to ] ) ) {
|
||
|
$data[ $assign_to ] = wp_json_encode( $data[ $assign_to ] );
|
||
|
} elseif ( preg_match( '/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/', $data[ $assign_to ], $matches ) ) {
|
||
|
// If it's a date, convert to MySQL format.
|
||
|
$data[ $assign_to ] = date( 'Y-m-d H:i:s', strtotime( $matches[0] ) ); // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date -- Date is stored as TIMESTAMP, so the timezone is converted automatically.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a field from the inspection result.
|
||
|
*
|
||
|
* @param array $raw_data Incoming data.
|
||
|
* @param string $field Field name.
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
protected function get_result_field( $raw_data, $field ) {
|
||
|
if ( false !== strpos( $field, '.' ) ) {
|
||
|
$fields = explode( '.', $field );
|
||
|
|
||
|
if ( ! isset( $raw_data[ $fields[0] ] ) || ! isset( $raw_data[ $fields[0] ][ $fields[1] ] ) ) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
return $raw_data[ $fields[0] ][ $fields[1] ];
|
||
|
}
|
||
|
|
||
|
if ( ! isset( $raw_data[ $field ] ) ) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
return $raw_data[ $field ];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Assign inspection field values to the data array.
|
||
|
*
|
||
|
* @param array $raw_data Raw data.
|
||
|
* @param array $fields Map properties.
|
||
|
* @param array $data Data array.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function assign_inspection_values( $raw_data, $fields, &$data ) {
|
||
|
foreach ( $fields as $field => $assign_to ) {
|
||
|
$this->assign_inspection_value( $raw_data, $field, $assign_to, $data );
|
||
|
}
|
||
|
}
|
||
|
}
|