Complex classes like Jetpack_Geo_Location often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Jetpack_Geo_Location, and based on these observations, apply Extract Interface, too.
| 1 | <?php  | 
            ||
| 33 | class Jetpack_Geo_Location { | 
            ||
| 34 | private static $instance;  | 
            ||
| 35 | |||
| 36 | 	public static function init() { | 
            ||
| 43 | |||
| 44 | /**  | 
            ||
| 45 | * This is mostly just used for testing purposes.  | 
            ||
| 46 | */  | 
            ||
| 47 | 	public static function reset_instance() { | 
            ||
| 50 | |||
| 51 | 	public function __construct() { | 
            ||
| 59 | |||
| 60 | /**  | 
            ||
| 61 | * Register support for the geo-location feature on pages and posts. Register the meta  | 
            ||
| 62 | * fields managed by this plugin so that they are properly sanitized during save.  | 
            ||
| 63 | */  | 
            ||
| 64 | 	public function wordpress_init() { | 
            ||
| 113 | |||
| 114 | /**  | 
            ||
| 115 | * Filter "public" input to always be either 1 or 0.  | 
            ||
| 116 | *  | 
            ||
| 117 | * @param mixed $public  | 
            ||
| 118 | *  | 
            ||
| 119 | * @return int  | 
            ||
| 120 | */  | 
            ||
| 121 | 	public function sanitize_public( $public ) { | 
            ||
| 124 | |||
| 125 | /**  | 
            ||
| 126 | * Filter geo coordinates and normalize them to floats with 7 digits of precision.  | 
            ||
| 127 | *  | 
            ||
| 128 | * @param mixed $coordinate  | 
            ||
| 129 | *  | 
            ||
| 130 | * @return float|null  | 
            ||
| 131 | */  | 
            ||
| 132 | 	public function sanitize_coordinate( $coordinate ) { | 
            ||
| 139 | |||
| 140 | /**  | 
            ||
| 141 | * Render geo.position and ICBM meta tags with public geo meta values when rendering  | 
            ||
| 142 | * a single post.  | 
            ||
| 143 | */  | 
            ||
| 144 | 	public function wp_head() { | 
            ||
| 178 | |||
| 179 | /**  | 
            ||
| 180 | * Append public meta values in the Geo microformat (https://en.wikipedia.org/wiki/Geo_(microformat)  | 
            ||
| 181 | * to the supplied content.  | 
            ||
| 182 | *  | 
            ||
| 183 | * Note that we cannot render the microformat in the context of an excerpt because tags are stripped  | 
            ||
| 184 | * in that context, making our microformat data visible.  | 
            ||
| 185 | *  | 
            ||
| 186 | * @param string $content  | 
            ||
| 187 | *  | 
            ||
| 188 | * @return string  | 
            ||
| 189 | */  | 
            ||
| 190 | 	public function the_content_microformat( $content ) { | 
            ||
| 220 | |||
| 221 | /**  | 
            ||
| 222 | * Register a range of hooks for integrating geo data with various feeds.  | 
            ||
| 223 | */  | 
            ||
| 224 | 	public function register_rss_hooks() { | 
            ||
| 233 | |||
| 234 | /**  | 
            ||
| 235 | * Add the georss namespace during RSS generation.  | 
            ||
| 236 | */  | 
            ||
| 237 | 	public function rss_namespace() { | 
            ||
| 240 | |||
| 241 | /**  | 
            ||
| 242 | * Output georss data for RSS items, assuming we have data for the currently rendered post and  | 
            ||
| 243 | * that data as marked as public.  | 
            ||
| 244 | */  | 
            ||
| 245 | 	public function rss_item() { | 
            ||
| 261 | |||
| 262 | /**  | 
            ||
| 263 | * Enqueue CSS for rendering post flair with geo-location.  | 
            ||
| 264 | */  | 
            ||
| 265 | 	public function enqueue_scripts() { | 
            ||
| 268 | |||
| 269 | /**  | 
            ||
| 270 | * If we're rendering a single post and public geo-location data is available for it,  | 
            ||
| 271 | * include the human-friendly location label in the output.  | 
            ||
| 272 | *  | 
            ||
| 273 | * @param string $content  | 
            ||
| 274 | *  | 
            ||
| 275 | * @return string  | 
            ||
| 276 | */  | 
            ||
| 277 | 	public function the_content_location_display( $content ) { | 
            ||
| 284 | |||
| 285 | /**  | 
            ||
| 286 | * Get the HTML for displaying a label representing the location associated with the  | 
            ||
| 287 | * supplied post ID. If no post ID is given, we'll use the global $post variable, if  | 
            ||
| 288 | * it is available.  | 
            ||
| 289 | *  | 
            ||
| 290 | * @param integer|null $post_id  | 
            ||
| 291 | *  | 
            ||
| 292 | * @return string  | 
            ||
| 293 | */  | 
            ||
| 294 | 	public function get_location_label( $post_id = null ) { | 
            ||
| 323 | |||
| 324 | /**  | 
            ||
| 325 | * Get the ID of the current global post object, if available. Otherwise, return null.  | 
            ||
| 326 | *  | 
            ||
| 327 | * This isolates the access of the global scope to this single method, making it easier to  | 
            ||
| 328 | * safeguard against unexpected missing $post objects in other hook functions.  | 
            ||
| 329 | *  | 
            ||
| 330 | * @return int|null  | 
            ||
| 331 | */  | 
            ||
| 332 | 	public function get_post_id() { | 
            ||
| 341 | |||
| 342 | /**  | 
            ||
| 343 | * This method always returns an array with the following structure:  | 
            ||
| 344 | *  | 
            ||
| 345 | * array(is_public => bool, latitude => float, longitude => float, label => string, is_populated => bool)  | 
            ||
| 346 | *  | 
            ||
| 347 | * So, regardless of whether your post actually has values in postmeta for the geo-location fields,  | 
            ||
| 348 | * you can be sure that you can reference those array keys in calling code without having to juggle  | 
            ||
| 349 | * isset(), array_key_exists(), etc.  | 
            ||
| 350 | *  | 
            ||
| 351 | * Mocking this method during testing can also be useful for testing output and logic in various  | 
            ||
| 352 | * hook functions.  | 
            ||
| 353 | *  | 
            ||
| 354 | * @param integer $post_id  | 
            ||
| 355 | *  | 
            ||
| 356 | * @return array A predictably structured array representing the meta values for the supplied post ID.  | 
            ||
| 357 | */  | 
            ||
| 358 | 	public function get_meta_values( $post_id ) { | 
            ||
| 373 | |||
| 374 | /**  | 
            ||
| 375 | * This function wraps get_post_meta() to enable us to keep the "geo_" prefix isolated to a single  | 
            ||
| 376 | * location in the code and to assist in mocking during testing.  | 
            ||
| 377 | *  | 
            ||
| 378 | * @param integer $post_id  | 
            ||
| 379 | * @param string $meta_field_name  | 
            ||
| 380 | *  | 
            ||
| 381 | * @return mixed  | 
            ||
| 382 | */  | 
            ||
| 383 | 	public function get_meta_value( $post_id, $meta_field_name ) { | 
            ||
| 390 | |||
| 391 | /**  | 
            ||
| 392 | * Check to see if the current filter is the get_the_excerpt filter.  | 
            ||
| 393 | *  | 
            ||
| 394 | * Just checking current_filter() here is not adequate because current_filter() only looks  | 
            ||
| 395 | * at the last element in the $wp_current_filter array. In the context of rendering an  | 
            ||
| 396 | * excerpt, however, both get_the_excerpt and the_content are present in that array.  | 
            ||
| 397 | *  | 
            ||
| 398 | * @return bool  | 
            ||
| 399 | */  | 
            ||
| 400 | 	public function is_currently_excerpt_filter() { | 
            ||
| 409 | }  | 
            ||
| 410 | |||
| 412 |