first commit
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
/**
|
||||
* WPSEO plugin file.
|
||||
*
|
||||
* @package WPSEO\Admin
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class handles the data for the option where the Ryte data is stored.
|
||||
*/
|
||||
class WPSEO_Ryte_Option {
|
||||
|
||||
/**
|
||||
* Indicates the data is not fetched.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const NOT_FETCHED = 99;
|
||||
|
||||
/**
|
||||
* Indicates the option is indexable.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const IS_INDEXABLE = 1;
|
||||
|
||||
/**
|
||||
* Indicates the option is not indexable.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const IS_NOT_INDEXABLE = 0;
|
||||
|
||||
/**
|
||||
* Indicates the data could not be fetched.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const CANNOT_FETCH = -1;
|
||||
|
||||
/**
|
||||
* The name of the option where data will be stored.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const OPTION_NAME = 'wpseo_ryte';
|
||||
|
||||
/**
|
||||
* The key of the status in the option.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const STATUS = 'status';
|
||||
|
||||
/**
|
||||
* The key of the last fetch date in the option.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const LAST_FETCH = 'last_fetch';
|
||||
|
||||
/**
|
||||
* The limit for fetching the status manually.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
const FETCH_LIMIT = 15;
|
||||
|
||||
/**
|
||||
* The Ryte option stored in the database.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $ryte_option;
|
||||
|
||||
/**
|
||||
* Setting the object by setting the properties.
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->ryte_option = $this->get_option();
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the status from the option.
|
||||
*
|
||||
* @return integer|string
|
||||
*/
|
||||
public function get_status() {
|
||||
if ( array_key_exists( self::STATUS, $this->ryte_option ) ) {
|
||||
return $this->ryte_option[ self::STATUS ];
|
||||
}
|
||||
|
||||
return self::CANNOT_FETCH;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saving the status to the options.
|
||||
*
|
||||
* @param string $status The status to save.
|
||||
*/
|
||||
public function set_status( $status ) {
|
||||
$this->ryte_option[ self::STATUS ] = $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saving the last fetch timestamp to the options.
|
||||
*
|
||||
* @param int $timestamp Timestamp with the new value.
|
||||
*/
|
||||
public function set_last_fetch( $timestamp ) {
|
||||
$this->ryte_option[ self::LAST_FETCH ] = $timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the indexability status should be fetched.
|
||||
*
|
||||
* If LAST_FETCH isn't set, we assume the indexability status hasn't been fetched
|
||||
* yet and return true. Then, we check whether the last fetch is within the
|
||||
* FETCH_LIMIT time interval (15 seconds) to avoid too many consecutive API calls.
|
||||
*
|
||||
* @return bool Whether the indexability status should be fetched.
|
||||
*/
|
||||
public function should_be_fetched() {
|
||||
if ( ! isset( $this->ryte_option[ self::LAST_FETCH ] ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return ( ( time() - $this->ryte_option[ self::LAST_FETCH ] ) > self::FETCH_LIMIT );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saving the option with the current data.
|
||||
*/
|
||||
public function save_option() {
|
||||
update_option( self::OPTION_NAME, $this->ryte_option );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of the onpage_enabled status.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function is_enabled() {
|
||||
return WPSEO_Options::get( 'ryte_indexability' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the option with the Ryte data.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function get_option() {
|
||||
$default = [
|
||||
self::STATUS => self::NOT_FETCHED,
|
||||
self::LAST_FETCH => 0,
|
||||
];
|
||||
|
||||
return get_option( self::OPTION_NAME, $default );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
/**
|
||||
* WPSEO plugin file.
|
||||
*
|
||||
* @package WPSEO\Admin
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class will fetch a new status from Ryte and if it's necessary it will
|
||||
* notify the site admin by email and remove the current meta value to hide the
|
||||
* notice for all admin users.
|
||||
*/
|
||||
class WPSEO_Ryte_Request {
|
||||
|
||||
/**
|
||||
* The endpoint where the request will be send to.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $ryte_endpoint = 'https://indexability.yoast.onpage.org/';
|
||||
|
||||
/**
|
||||
* Gets the response from the Ryte API and returns the body.
|
||||
*
|
||||
* @param string $target_url The URL to check indexability for.
|
||||
* @param array $parameters Array of extra parameters to send to the Ryte API.
|
||||
*
|
||||
* @return array The successful response or the error details.
|
||||
*/
|
||||
protected function get_remote( $target_url, $parameters = [] ) {
|
||||
$defaults = [
|
||||
'url' => $target_url,
|
||||
'wp_version' => $GLOBALS['wp_version'],
|
||||
'yseo_version' => WPSEO_VERSION,
|
||||
];
|
||||
|
||||
$parameters = array_merge( $defaults, $parameters );
|
||||
$url = add_query_arg( $parameters, $this->ryte_endpoint );
|
||||
|
||||
// Decrease a chance of "cURL 28 (timeout)" errors by increasing the timeout to 10 seconds.
|
||||
$args = [ 'timeout' => 10 ];
|
||||
$response = wp_remote_get( $url, $args );
|
||||
|
||||
return $this->process_response( $response );
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a request to the Ryte API to check whether a URL is indexable.
|
||||
*
|
||||
* @param string $target_url The URL to check indexability for.
|
||||
* @param array $parameters Array of extra parameters to send to the Ryte API.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function do_request( $target_url, $parameters = [] ) {
|
||||
$json_body = $this->get_remote( $target_url, $parameters );
|
||||
|
||||
// Ryte recognized a redirect, fetch the data of that URL by calling this method with the value from Ryte.
|
||||
if ( ! empty( $json_body['passes_juice_to'] ) ) {
|
||||
return $this->do_request( $json_body['passes_juice_to'], $parameters );
|
||||
}
|
||||
|
||||
return $json_body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the given Ryte response.
|
||||
*
|
||||
* @param array|WP_Error $response The response or WP_Error to process.
|
||||
*
|
||||
* @return array The response body or the error detaiils on failure.
|
||||
*/
|
||||
protected function process_response( $response ) {
|
||||
// Most of the potential errors are WP_Error(s).
|
||||
if ( is_wp_error( $response ) ) {
|
||||
return [
|
||||
'is_error' => true,
|
||||
'raw_error_code' => '',
|
||||
// WP_Error codes aren't that helpful for users, let's display them in a less prominent way.
|
||||
'wp_error_code' => '(' . $response->get_error_code() . ')',
|
||||
'message' => $response->get_error_message(),
|
||||
];
|
||||
}
|
||||
|
||||
/*
|
||||
* As of February 2020 the Ryte API returns an error 500 for non-reachable
|
||||
* sites. There's also the need to handle any potential raw HTTP error.
|
||||
*/
|
||||
if ( wp_remote_retrieve_response_code( $response ) !== 200 ) {
|
||||
// Not all HTTP errors may have a response message. Let's provide a default one.
|
||||
$response_message = wp_remote_retrieve_response_message( $response );
|
||||
$message = ( $response_message ) ? $response_message : __( 'The request to Ryte returned an error.', 'wordpress-seo' );
|
||||
|
||||
return [
|
||||
'is_error' => true,
|
||||
'raw_error_code' => wp_remote_retrieve_response_code( $response ),
|
||||
'wp_error_code' => '',
|
||||
'message' => $message,
|
||||
];
|
||||
}
|
||||
|
||||
// When the request is successful, the response code will be 200.
|
||||
$response_body = wp_remote_retrieve_body( $response );
|
||||
|
||||
return json_decode( $response_body, true );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user