summaryrefslogtreecommitdiff
blob: cd576ac16429ba13fdd4b23e584075ab4a064538 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
/**
 * Special cases for overriding modules.
 *
 * @package automattic/jetpack
 */

/**
 * Provides methods for dealing with module overrides.
 *
 * @since 5.9.0
 */
class Jetpack_Modules_Overrides {
	/**
	 * Used to cache module overrides so that we minimize how many times we apply the
	 * option_jetpack_active_modules filter.
	 *
	 * @var null|array
	 */
	private $overrides = null;

	/**
	 * Clears the $overrides member used for caching.
	 *
	 * Since get_overrides() can be passed a falsey value to skip caching, this is probably
	 * most useful for clearing cache between tests.
	 *
	 * @return void
	 */
	public function clear_cache() {
		$this->overrides = null;
	}

	/**
	 * Returns true if there is a filter on the jetpack_active_modules option.
	 *
	 * @return bool Whether there is a filter on the jetpack_active_modules option.
	 */
	public function do_overrides_exist() {
		return (bool) ( has_filter( 'option_jetpack_active_modules' ) || has_filter( 'jetpack_active_modules' ) );
	}

	/**
	 * Gets the override for a given module.
	 *
	 * @param string  $module_slug The module's slug.
	 * @param boolean $use_cache   Whether or not cached overrides should be used.
	 *
	 * @return bool|string False if no override for module. 'active' or 'inactive' if there is an override.
	 */
	public function get_module_override( $module_slug, $use_cache = true ) {
		$overrides = $this->get_overrides( $use_cache );

		if ( ! isset( $overrides[ $module_slug ] ) ) {
			return false;
		}

		return $overrides[ $module_slug ];
	}

	/**
	 * Returns an array of module overrides where the key is the module slug and the value
	 * is true if the module is forced on and false if the module is forced off.
	 *
	 * @param bool $use_cache Whether or not cached overrides should be used.
	 *
	 * @return array The array of module overrides.
	 */
	public function get_overrides( $use_cache = true ) {
		if ( $use_cache && ! is_null( $this->overrides ) ) {
			return $this->overrides;
		}

		if ( ! $this->do_overrides_exist() ) {
			return array();
		}

		$available_modules = Jetpack::get_available_modules();

		/**
		 * First, let's get all modules that have been forced on.
		 */

		/** This filter is documented in wp-includes/option.php */
		$filtered = apply_filters( 'option_jetpack_active_modules', array() );

		/** This filter is documented in class.jetpack.php */
		$filtered = apply_filters( 'jetpack_active_modules', $filtered );

		$forced_on = array_diff( $filtered, array() );

		/**
		 * Second, let's get all modules forced off.
		 */

		/** This filter is documented in wp-includes/option.php */
		$filtered = apply_filters( 'option_jetpack_active_modules', $available_modules );

		/** This filter is documented in class.jetpack.php */
		$filtered = apply_filters( 'jetpack_active_modules', $filtered );

		$forced_off = array_diff( $available_modules, $filtered );

		/**
		 * Last, build the return value.
		 */
		$return_value = array();
		foreach ( $forced_on as $on ) {
			$return_value[ $on ] = 'active';
		}

		foreach ( $forced_off as $off ) {
			$return_value[ $off ] = 'inactive';
		}

		$this->overrides = $return_value;

		return $return_value;
	}

	/**
	 * A reference to an instance of this class.
	 *
	 * @var Jetpack_Modules_Overrides
	 */
	private static $instance = null;

	/**
	 * Returns the singleton instance of Jetpack_Modules_Overrides
	 *
	 * @return Jetpack_Modules_Overrides
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new Jetpack_Modules_Overrides();
		}

		return self::$instance;
	}

	/**
	 * Private construct to enforce singleton.
	 */
	private function __construct() {
	}
}

Jetpack_Modules_Overrides::instance();