PluginProbe
Core Rollback / 1.3.5
Core Rollback v1.3.5
1.4.3 trunk 1.0.0 1.0.1 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.4.0 1.4.1 1.4.2
core-rollback / src / Core.php

Core.php in Core Rollback 1.3.5, at src/Core.php

165 lines 3.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Core Rollback
4 *
5 * @author Andy Fragen
6 * @license MIT
7 * @link https://github.com/afragen/core-rollback
8 * @package core-rollback
9 */
10
11 namespace Fragen\Rollback;
12
13 /*
14 * Exit if called directly.
15 */
16 if ( ! defined( 'WPINC' ) ) {
17 die;
18 }
19
20 /**
21 * Class Core
22 */
23 class Core {
24 /**
25 * Core versions for re-installation.
26 *
27 * @var array
28 */
29 public static $core_versions;
30
31 /**
32 * Constructor.
33 */
34 public function __construct() {
35 static::$core_versions = $this->get_core_versions();
36 }
37
38 /**
39 * Get all core versions from Core API.
40 *
41 * @return array Array of versions and downloads.
42 */
43 public function get_core_versions() {
44 $versions = get_site_transient( 'core_rollback' );
45 if ( ! $versions ) {
46 $versions = [];
47 $locale = get_locale();
48 $response = wp_remote_get( "https://api.wordpress.org/core/version-check/1.7/?locale={$locale}" );
49 if ( is_wp_error( $response ) ) {
50 return [];
51 }
52 $body = wp_remote_retrieve_body( $response );
53 $body = json_decode( $body );
54 $offers = $body->offers;
55 foreach ( $offers as $offer ) {
56 if ( version_compare( $offer->version, '4.0', '>=' ) ) {
57 $offer->response = 'latest';
58 $versions[ $offer->version ] = $offer;
59 }
60 }
61 set_site_transient( 'core_rollback', $versions, DAY_IN_SECONDS );
62 }
63
64 return $versions;
65 }
66
67 /**
68 * Load hooks.
69 */
70 public function load_hooks() {
71 add_filter( 'http_request_args', [ $this, 'filter_http_request_args' ], 10, 2 );
72 add_filter( 'pre_http_request', [ $this, 'filter_http_request' ], 10, 3 );
73 }
74
75 /**
76 * Add core rollback version to http_request_args.
77 *
78 * @param array $args Array of HTTP request args.
79 * @param string $url URL for HTTP request.
80 *
81 * @return array
82 */
83 public function filter_http_request_args( $args, $url ) {
84 if ( false === strpos( $url, '//api.wordpress.org/core/version-check/' ) ) {
85 return $args;
86 }
87 $rollback = get_site_transient( '_core_rollback' );
88
89 if ( $rollback ) {
90 $args['_rollback_version'] = $rollback['core_dropdown'];
91 }
92
93 return $args;
94 }
95
96 /**
97 * Filter 'pre_http_request' to add rollback API check.
98 *
99 * @param mixed $result $result from filter.
100 * @param array $args Array of filter args.
101 * @param string $url URL from filter.
102 *
103 * @return \stdClass $response Output from wp_remote_get().
104 */
105 public function filter_http_request( $result, $args, $url ) {
106 if ( $result || isset( $args['_core_rollback'] ) ) {
107 return $result;
108 }
109 if ( false === strpos( $url, '//api.wordpress.org/core/version-check/' ) ) {
110 return $result;
111 }
112
113 // It's a core-update request.
114 $args['_core_rollback'] = true;
115
116 $response = wp_remote_get( $url, $args );
117 if ( is_wp_error( $response ) ) {
118 return $result;
119 }
120 if ( isset( $args['_rollback_version'] ) ) {
121 $rollback_version = sanitize_text_field( $args['_rollback_version'] );
122 $response = $this->set_rollback( $response, $rollback_version );
123 }
124
125 return $response;
126 }
127
128 /**
129 * Update Core API update response to add rollback.
130 *
131 * @param \stdClass $response Core API response.
132 * @param string $rollback_version Rollback version.
133 *
134 * @return \stdClass
135 */
136 public function set_rollback( $response, $rollback_version ) {
137 if ( ! array_key_exists( $rollback_version, static::$core_versions ) ) {
138 return $response;
139 }
140 $body = wp_remote_retrieve_body( $response );
141 $offers = \json_decode( $body );
142 $latest = false;
143 $num = count( array_keys( $offers->offers ) );
144 foreach ( array_keys( $offers->offers ) as $key ) {
145 if ( 0 === $key ) {
146 continue;
147 }
148
149 if ( 'latest' === $offers->offers[ $key ]->response ) {
150 $offers->offers[ $key ] = static::$core_versions[ $rollback_version ];
151 $latest = true;
152 }
153 }
154
155 if ( ! $latest && ( ( $key + 1 ) === $num ) ) {
156 $offers->offers[ $num ] = static::$core_versions[ $rollback_version ];
157 }
158
159 $body = \json_encode( $offers );
160 $response['body'] = $body;
161
162 return $response;
163 }
164 }
165