Completed
Push — fix/issue-7 ( 6a095d...826db8 )
by
unknown
75:12 queued 61:54
created

Jetpack_Options::get_grouped_option()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 8
rs 9.4286
nc 2
cc 3
eloc 5
nop 3
1
<?php
2
3
class Jetpack_Options {
4
5
	private static $grouped_options = array(
6
		'compact' => 'jetpack_options',
7
		'private' => 'jetpack_private_options'
8
	);
9
10
	public static function get_option_names( $type = 'compact' ) {
11
		switch ( $type ) {
12
		case 'non-compact' :
13
		case 'non_compact' :
14
			return array(
15
				'activated',
16
				'active_modules',
17
				'available_modules',
18
				'do_activate',
19
				'log',
20
				'publicize',
21
				'slideshow_background_color',
22
				'widget_twitter',
23
				'wpcc_options',
24
				'relatedposts',
25
				'file_data',
26
				'security_report',
27
				'autoupdate_plugins',          // (array)  An array of plugin ids ( eg. jetpack/jetpack ) that should be autoupdated
28
				'autoupdate_themes',           // (array)  An array of theme ids ( eg. twentyfourteen ) that should be autoupdated
29
				'autoupdate_core',             // (bool)   Whether or not to autoupdate core
30
				'json_api_full_management',    // (bool)   Allow full management (eg. Activate, Upgrade plugins) of the site via the JSON API.
31
				'sync_non_public_post_stati',  // (bool)   Allow synchronisation of posts and pages with non-public status.
32
				'site_icon_url',               // (string) url to the full site icon
33
				'site_icon_id',                // (int)    Attachment id of the site icon file
34
				'dismissed_manage_banner',     // (bool) Dismiss Jetpack manage banner allows the user to dismiss the banner permanently
35
				'restapi_stats_cache',         // (array) Stats Cache data.
36
				'unique_connection',           // (array)  A flag to determine a unique connection to wordpress.com two values "connected" and "disconnected" with values for how many times each has occured
37
				'protect_whitelist'            // (array) IP Address for the Protect module to ignore
38
			);
39
40
		case 'private' :
41
			return array(
42
				'register',
43
				'blog_token',                  // (string) The Client Secret/Blog Token of this site.
44
				'user_token',                  // (string) The User Token of this site. (deprecated)
45
				'user_tokens'                  // (array)  User Tokens for each user of this site who has connected to jetpack.wordpress.com.
46
			);
47
		}
48
49
		return array(
50
			'id',                           // (int)    The Client ID/WP.com Blog ID of this site.
51
			'publicize_connections',        // (array)  An array of Publicize connections from WordPress.com
52
			'master_user',                  // (int)    The local User ID of the user who connected this site to jetpack.wordpress.com.
53
			'version',                      // (string) Used during upgrade procedure to auto-activate new modules. version:time
54
			'old_version',                  // (string) Used to determine which modules are the most recently added. previous_version:time
55
			'fallback_no_verify_ssl_certs', // (int)    Flag for determining if this host must skip SSL Certificate verification due to misconfigured SSL.
56
			'time_diff',                    // (int)    Offset between Jetpack server's clocks and this server's clocks. Jetpack Server Time = time() + (int) Jetpack_Options::get_option( 'time_diff' )
57
			'public',                       // (int|bool) If we think this site is public or not (1, 0), false if we haven't yet tried to figure it out.
58
			'videopress',                   // (array)  VideoPress options array.
59
			'is_network_site',              // (int|bool) If we think this site is a network or a single blog (1, 0), false if we haven't yet tried to figue it out.
60
			'social_links',                 // (array)  The specified links for each social networking site.
61
			'identity_crisis_whitelist',    // (array)  An array of options, each having an array of the values whitelisted for it.
62
			'gplus_authors',                // (array)  The Google+ authorship information for connected users.
63
			'last_heartbeat',               // (int)    The timestamp of the last heartbeat that fired.
64
			'last_security_report',         // (int)    The timestamp of the last security report that was run.
65
			'sync_bulk_reindexing',         // (bool)   If a bulk reindex is currently underway.
66
			'jumpstart',                    // (string) A flag for whether or not to show the Jump Start.  Accepts: new_connection, jumpstart_activated, jetpack_action_taken, jumpstart_dismissed.
67
			'hide_jitm'                     // (array)  A list of just in time messages that we should not show because they have been dismissed by the user
68
		);
69
	}
70
71
	public static function is_valid( $name, $group = null ) {
72
		if ( is_array( $name ) ) {
73
			$compact_names = array();
74
			foreach ( array_keys( self::$grouped_options ) as $_group ) {
75
				$compact_names = array_merge( $compact_names, self::get_option_names( $_group ) );
76
			}
77
78
			$result = array_diff( $name, self::get_option_names( 'non_compact' ), $compact_names );
79
80
			return empty( $result );
81
		}
82
83 View Code Duplication
		if ( is_null( $group ) || 'non_compact' === $group ) {
1 ignored issue
show
Coding Style introduced by
As per coding-style, please use === null instead of is_null.
Loading history...
84
			if ( in_array( $name, self::get_option_names( $group ) ) ) {
85
				return true;
86
			}
87
		}
88
89
		foreach ( array_keys( self::$grouped_options ) as $_group ) {
90 View Code Duplication
			if ( is_null( $group ) || $group === $_group ) {
1 ignored issue
show
Coding Style introduced by
As per coding-style, please use === null instead of is_null.
Loading history...
91
				if ( in_array( $name, self::get_option_names( $_group ) ) ) {
92
					return true;
93
				}
94
			}
95
		}
96
97
		return false;
98
	}
99
100
	/**
101
	 * Returns the requested option.  Looks in jetpack_options or jetpack_$name as appropriate.
102
	 *
103
	 * @param string $name Option name
104
	 * @param mixed $default (optional)
105
	 */
106
	public static function get_option( $name, $default = false ) {
107
		if ( self::is_valid( $name, 'non_compact' ) ) {
108
			return get_option( "jetpack_$name", $default );
109
		}
110
111
		foreach ( array_keys( self::$grouped_options ) as $group ) {
112
			if ( self::is_valid( $name, $group ) ) {
113
				return self::get_grouped_option( $group, $name, $default );
114
			}
115
		}
116
117
		trigger_error( sprintf( 'Invalid Jetpack option name: %s', $name ), E_USER_WARNING );
118
119
		return $default;
120
	}
121
122
	private static function update_grouped_option( $group, $name, $value ) {
123
		$options = get_option( self::$grouped_options[ $group ] );
124
		if ( ! is_array( $options ) ) {
125
			$options = array();
126
		}
127
		$options[ $name ] = $value;
128
129
		return update_option( self::$grouped_options[ $group ], $options );
130
	}
131
132
	/**
133
	 * Updates the single given option.  Updates jetpack_options or jetpack_$name as appropriate.
134
	 *
135
	 * @param string $name Option name
136
	 * @param mixed $value Option value
137
	 * @param string $autoload If not compact option, allows specifying whether to autoload or not.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $autoload not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
138
	 */
139
	public static function update_option( $name, $value, $autoload = null ) {
140
		/**
141
		 * Fires before Jetpack updates a specific option.
142
		 *
143
		 * @since 3.0.0
144
		 *
145
		 * @param str $name The name of the option being updated.
146
		 * @param mixed $value The new value of the option.
147
		 */
148
		do_action( 'pre_update_jetpack_option_' . $name, $name, $value );
149
		if ( self::is_valid( $name, 'non_compact' ) ) {
150
			/**
151
			 * Allowing update_option to change autoload status only shipped in WordPress v4.2
152
			 * @link https://github.com/WordPress/WordPress/commit/305cf8b95
153
			 */
154
			if ( version_compare( $GLOBALS['wp_version'], '4.2', '>=' ) ) {
155
				return update_option( "jetpack_$name", $value, $autoload );
156
			}
157
			return update_option( "jetpack_$name", $value );
158
		}
159
160
		foreach ( array_keys( self::$grouped_options ) as $group ) {
161
			if ( self::is_valid( $name, $group ) ) {
162
				return self::update_grouped_option( $group, $name, $value );
163
			}
164
		}
165
166
		trigger_error( sprintf( 'Invalid Jetpack option name: %s', $name ), E_USER_WARNING );
167
168
		return false;
169
	}
170
171
	/**
172
	 * Updates the multiple given options.  Updates jetpack_options and/or jetpack_$name as appropriate.
173
	 *
174
	 * @param array $array array( option name => option value, ... )
175
	 */
176
	public static function update_options( $array ) {
177
		$names = array_keys( $array );
178
179
		foreach ( array_diff( $names, self::get_option_names(), self::get_option_names( 'non_compact' ), self::get_option_names( 'private' ) ) as $unknown_name ) {
180
			trigger_error( sprintf( 'Invalid Jetpack option name: %s', $unknown_name ), E_USER_WARNING );
181
			unset( $array[ $unknown_name ] );
182
		}
183
184
		foreach ( $names as $name ) {
185
			self::update_option( $name, $array[ $name ] );
186
		}
187
	}
188
189
	/**
190
	 * Deletes the given option.  May be passed multiple option names as an array.
191
	 * Updates jetpack_options and/or deletes jetpack_$name as appropriate.
192
	 *
193
	 * @param string|array $names
194
	 */
195
	public static function delete_option( $names ) {
196
		$result = true;
197
		$names  = (array) $names;
198
199
		if ( ! self::is_valid( $names ) ) {
200
			trigger_error( sprintf( 'Invalid Jetpack option names: %s', print_r( $names, 1 ) ), E_USER_WARNING );
201
202
			return false;
203
		}
204
205
		foreach ( array_intersect( $names, self::get_option_names( 'non_compact' ) ) as $name ) {
206
			if ( ! delete_option( "jetpack_$name" ) ) {
207
				$result = false;
208
			}
209
		}
210
211
		foreach ( array_keys( self::$grouped_options ) as $group ) {
212
			if ( ! self::delete_grouped_option( $group, $names ) ) {
213
				$result = false;
214
			}
215
		}
216
217
		return $result;
218
	}
219
220
	private static function get_grouped_option( $group, $name, $default ) {
221
		$options = get_option( self::$grouped_options[ $group ] );
222
		if ( is_array( $options ) && isset( $options[ $name ] ) ) {
223
			return $options[ $name ];
224
		}
225
226
		return $default;
227
	}
228
229
	private static function delete_grouped_option( $group, $names ) {
230
		$options = get_option( self::$grouped_options[ $group ], array() );
231
232
		$to_delete = array_intersect( $names, self::get_option_names( $group ), array_keys( $options ) );
233
		if ( $to_delete ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $to_delete of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
234
			foreach ( $to_delete as $name ) {
235
				unset( $options[ $name ] );
236
			}
237
238
			return update_option( self::$grouped_options[ $group ], $options );
239
		}
240
241
		return true;
242
	}
243
244
}
1 ignored issue
show
Coding Style introduced by
According to PSR2, the closing brace of classes should be placed on the next line directly after the body.

Below you find some examples:

// Incorrect placement according to PSR2
class MyClass
{
    public function foo()
    {

    }
    // This blank line is not allowed.

}

// Correct
class MyClass
{
    public function foo()
    {

    } // No blank lines after this line.
}
Loading history...
245