Prevent wp_remote_post or wp_remote_get to trigger when not necessary

This commit is contained in:
Claudio Sanches 2020-01-07 15:51:16 -03:00
parent b4125269a3
commit 4342ae2b6f
1 changed files with 52 additions and 36 deletions

View File

@ -72,16 +72,11 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller {
*/ */
public function get_items( $request ) { public function get_items( $request ) {
$schema = $this->get_item_schema(); $schema = $this->get_item_schema();
$mappings = $this->get_item_mappings(); $fields = $this->get_fields_for_response( $request );
$mappings = $this->get_item_mappings( $fields );
$response = array(); $response = array();
foreach ( $mappings as $section => $values ) { foreach ( $mappings as $section => $values ) {
foreach ( $values as $key => $value ) {
if ( isset( $schema['properties'][ $section ]['properties'][ $key ]['type'] ) ) {
settype( $values[ $key ], $schema['properties'][ $section ]['properties'][ $key ]['type'] );
}
}
settype( $values, $schema['properties'][ $section ]['type'] );
$response[ $section ] = $values; $response[ $section ] = $values;
} }
@ -571,11 +566,12 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller {
/** /**
* Return an array of sections and the data associated with each. * Return an array of sections and the data associated with each.
* *
* @param array $fields List of fields to be included on the response.
* @return array * @return array
*/ */
public function get_item_mappings() { public function get_item_mappings( $fields ) {
return array( return array(
'environment' => $this->get_environment_info(), 'environment' => $this->get_environment_info( $fields ),
'database' => $this->get_database_info(), 'database' => $this->get_database_info(),
'active_plugins' => $this->get_active_plugins(), 'active_plugins' => $this->get_active_plugins(),
'inactive_plugins' => $this->get_inactive_plugins(), 'inactive_plugins' => $this->get_inactive_plugins(),
@ -592,11 +588,23 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller {
* Get array of environment information. Includes thing like software * Get array of environment information. Includes thing like software
* versions, and various server settings. * versions, and various server settings.
* *
* @param array $fields List of fields to be included on the response.
* @return array * @return array
*/ */
public function get_environment_info() { public function get_environment_info( $fields ) {
global $wpdb; global $wpdb;
$exclude = array();
foreach ( $fields as $field ) {
$values = explode( '.', $field );
if ( 'environment' !== $values[0] || empty( $values[1] ) ) {
continue;
}
$exclude[] = $values[1];
}
// Figure out cURL version, if installed. // Figure out cURL version, if installed.
$curl_version = ''; $curl_version = '';
if ( function_exists( 'curl_version' ) ) { if ( function_exists( 'curl_version' ) ) {
@ -613,40 +621,48 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller {
} }
// Test POST requests. // Test POST requests.
$post_response_code = get_transient( 'woocommerce_test_remote_post' ); $post_response_successful = null;
$post_response_code = null;
if ( empty( $exclude ) || 0 < count( array_intersect( array( 'remote_post_successful', 'remote_post_response' ), $exclude ) ) ) {
$post_response_code = get_transient( 'woocommerce_test_remote_post' );
if ( false === $post_response_code || is_wp_error( $post_response_code ) ) { if ( false === $post_response_code || is_wp_error( $post_response_code ) ) {
$response = wp_safe_remote_post( $response = wp_safe_remote_post(
'https://www.paypal.com/cgi-bin/webscr', 'https://www.paypal.com/cgi-bin/webscr',
array( array(
'timeout' => 10, 'timeout' => 10,
'user-agent' => 'WooCommerce/' . WC()->version, 'user-agent' => 'WooCommerce/' . WC()->version,
'httpversion' => '1.1', 'httpversion' => '1.1',
'body' => array( 'body' => array(
'cmd' => '_notify-validate', 'cmd' => '_notify-validate',
), ),
) )
); );
if ( ! is_wp_error( $response ) ) { if ( ! is_wp_error( $response ) ) {
$post_response_code = $response['response']['code']; $post_response_code = $response['response']['code'];
}
set_transient( 'woocommerce_test_remote_post', $post_response_code, HOUR_IN_SECONDS );
} }
set_transient( 'woocommerce_test_remote_post', $post_response_code, HOUR_IN_SECONDS );
}
$post_response_successful = ! is_wp_error( $post_response_code ) && $post_response_code >= 200 && $post_response_code < 300; $post_response_successful = ! is_wp_error( $post_response_code ) && $post_response_code >= 200 && $post_response_code < 300;
}
// Test GET requests. // Test GET requests.
$get_response_code = get_transient( 'woocommerce_test_remote_get' ); $get_response_successful = null;
$get_response_code = null;
if ( empty( $exclude ) || 0 < count( array_intersect( array( 'remote_get_successful', 'remote_get_response' ), $exclude ) ) ) {
$get_response_code = get_transient( 'woocommerce_test_remote_get' );
if ( false === $get_response_code || is_wp_error( $get_response_code ) ) { if ( false === $get_response_code || is_wp_error( $get_response_code ) ) {
$response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) ); $response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) );
if ( ! is_wp_error( $response ) ) { if ( ! is_wp_error( $response ) ) {
$get_response_code = $response['response']['code']; $get_response_code = $response['response']['code'];
}
set_transient( 'woocommerce_test_remote_get', $get_response_code, HOUR_IN_SECONDS );
} }
set_transient( 'woocommerce_test_remote_get', $get_response_code, HOUR_IN_SECONDS );
}
$get_response_successful = ! is_wp_error( $get_response_code ) && $get_response_code >= 200 && $get_response_code < 300; $get_response_successful = ! is_wp_error( $get_response_code ) && $get_response_code >= 200 && $get_response_code < 300;
}
$database_version = wc_get_server_database_version(); $database_version = wc_get_server_database_version();