PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / trunk
Advanced Ads – Ad Manager & AdSense vtrunk
2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / classes / utils.php
advanced-ads / classes Last commit date
ad-health-notices.php 3 weeks ago checks.php 3 months ago display-conditions.php 3 weeks ago filesystem.php 3 weeks ago frontend_checks.php 2 days ago inline-css.php 1 year ago utils.php 2 days ago visitor-conditions.php 1 year ago
utils.php
298 lines
1 <?php // phpcs:ignoreFilename
2 /**
3 * Class Advanced_Ads_Utils
4 */
5 class Advanced_Ads_Utils {
6 /**
7 * Merges multiple arrays, recursively, and returns the merged array.
8 *
9 * This function is similar to PHP's array_merge_recursive() function, but it
10 * handles non-array values differently. When merging values that are not both
11 * arrays, the latter value replaces the former rather than merging with it.
12 *
13 * Example:
14 * $link_options_1 = array( 'fragment' => 'x', 'class' => array( 'a', 'b' ) );
15 * $link_options_2 = array( 'fragment' => 'y', 'class' => array( 'c', 'd' ) );
16 * // This results in array( 'fragment' => 'y', 'class' => array( 'a', 'b', 'c', 'd' ) ).
17 *
18 * @param array $arrays An arrays of arrays to merge.
19 * @param bool $preserve_integer_keys (optional) If given, integer keys will be preserved and merged instead of appended.
20 * @return array The merged array.
21 * @copyright Copyright 2001 - 2013 Drupal contributors. License: GPL-2.0+. Drupal is a registered trademark of Dries Buytaert.
22 */
23 public static function merge_deep_array( array $arrays, $preserve_integer_keys = false ) {
24 $result = [];
25 foreach ( $arrays as $array ) {
26 if ( ! is_array( $array ) ) {
27 continue; }
28
29 foreach ( $array as $key => $value ) {
30 // Renumber integer keys as array_merge_recursive() does unless
31 // $preserve_integer_keys is set to TRUE. Note that PHP automatically
32 // converts array keys that are integer strings (e.g., '1') to integers.
33 if ( is_integer( $key ) && ! $preserve_integer_keys ) {
34 $result[] = $value;
35 } elseif ( isset( $result[ $key ] ) && is_array( $result[ $key ] ) && is_array( $value ) ) {
36 // recurse when both values are arrays.
37 $result[ $key ] = self::merge_deep_array( [ $result[ $key ], $value ], $preserve_integer_keys );
38 } else {
39 // otherwise, use the latter value, overriding any previous value.
40 $result[ $key ] = $value;
41 }
42 }
43 }
44 return $result;
45 }
46
47 /**
48 * Convert array of html attributes to string.
49 *
50 * @param array $data attributes.
51 * @return string
52 * @since untagged
53 */
54 public static function build_html_attributes( $data ) {
55 $result = '';
56 foreach ( $data as $_html_attr => $_values ) {
57 if ( 'style' === $_html_attr ) {
58 $_style_values_string = '';
59 foreach ( $_values as $_style_attr => $_style_values ) {
60 if ( is_array( $_style_values ) ) {
61 $_style_values_string .= $_style_attr . ': ' . implode( ' ', array_filter( $_style_values ) ) . ';';
62 } else {
63 $_style_values_string .= $_style_attr . ': ' . $_style_values . ';';
64 }
65 }
66 $result .= " style=\"$_style_values_string\"";
67 } else {
68 if ( is_array( $_values ) ) {
69 $_values_string = esc_attr( implode( ' ', array_filter( $_values ) ) );
70 } else {
71 $_values_string = esc_attr( $_values );
72 }
73 if ( '' !== $_values_string ) {
74 $result .= " $_html_attr=\"$_values_string\"";
75 }
76 }
77 }
78
79 return $result;
80 }
81
82 /**
83 * Get inline asset.
84 *
85 * @param string $content existing content.
86 * @return string $content
87 */
88 public static function get_inline_asset( $content ) {
89 // WP Fastest Cache Premium: "Render Blocking Js" feature.
90 $content = ltrim( $content );
91 if ( class_exists( 'WpFastestCache', false )
92 && '<script' === substr( $content, 0, 7 ) ) {
93 $content = substr_replace( $content, '<script data-wpfc-render="false"', 0, 7 );
94 }
95
96 if ( Advanced_Ads_Checks::active_autoptimize() || Advanced_Ads_Checks::active_wp_rocket() ) {
97 return '<!--noptimize-->' . $content . '<!--/noptimize-->';
98 }
99 return $content;
100 }
101
102 /**
103 * Get nested ads of an ad or a group.
104 *
105 * @param string $id Id.
106 * @param string $type Type (placement, ad or group).
107 *
108 * @return array of Ad objects.
109 */
110 public static function get_nested_ads( $id, $type ) {
111 $result = [];
112 $id = absint( $id );
113
114 // Early bail!!
115 if ( $id < 1 ) {
116 return $result;
117 }
118
119 switch ( $type ) {
120 // No idea if this is intentional fall through
121 case 'placement':
122 $placement = wp_advads_get_placement( $id );
123 $item = $placement ? $placement->get_item() : '';
124 if ( ! empty( $item ) ) {
125 $item = explode( '_', $item );
126 if ( isset( $item[1] ) ) {
127 return self::get_nested_ads( $item[1], $item[0] );
128 }
129 }
130 case 'ad':
131 $ad = wp_advads_get_ad( $id );
132
133 if ( ! $ad ) {
134 break;
135 }
136
137 $result[] = $ad;
138 if ( $ad->is_type( 'group' ) && ! empty( $ad->get_prop( 'group_id' ) ) ) {
139 $result = array_merge( $result, self::get_nested_ads( $ad->get_prop( 'group_id' ), 'group' ) );
140 }
141 break;
142 case 'group':
143 $group = wp_advads_get_group( $id );
144 $ads = $group->get_ads();
145 foreach ( $ads as $ad ) {
146 $result = array_merge( $result, self::get_nested_ads( $ad->get_id(), 'ad' ) );
147 }
148 break;
149 }
150
151 return $result;
152 }
153
154 /**
155 * Maybe translate a capability to a set of roles.
156 *
157 * @param string/array $roles_or_caps A set of roles or capabilities.
158 * @return array $roles A list of roles.
159 */
160 public static function maybe_translate_cap_to_role( $roles_or_caps ) {
161 global $wp_roles;
162
163 $roles_or_caps = (array) $roles_or_caps;
164 $roles = [];
165
166 foreach ( $roles_or_caps as $cap ) {
167 if ( $wp_roles->is_role( $cap ) ) {
168 $roles[] = $cap;
169 continue;
170 }
171
172 foreach ( $wp_roles->roles as $id => $role ) {
173 if ( isset( $role['capabilities'][ $cap ] ) ) {
174 $roles[] = $id;
175 }
176 }
177 }
178
179 return array_unique( $roles );
180 }
181
182 /**
183 * Check if the page is loaded in an iframe.
184 *
185 * @return bool
186 */
187 public static function is_iframe() {
188 if ( is_customize_preview() ) {
189 return true;
190 }
191
192 if ( self::is_elementor_preview_or_edit() ) {
193 return true;
194 }
195
196 return false;
197 }
198
199 /**
200 * Check if the Elementor preview mode is used.
201 *
202 * @deprecated
203 *
204 * @return bool
205 */
206 private static function is_elementor_preview_or_edit() {
207 if ( class_exists( '\Elementor\Plugin' ) ) {
208 try {
209 $refl_plugin = new ReflectionClass( '\Elementor\Plugin' );
210
211 if ( $refl_plugin->hasMethod( 'instance' ) ) {
212 $refl_instance_method = $refl_plugin->getMethod( 'instance' );
213
214 if ( $refl_instance_method->isPublic() && $refl_instance_method->isStatic() ) {
215
216 if ( class_exists( '\Elementor\Preview' ) && $refl_plugin->hasProperty( 'preview' ) ) {
217 $preview_property = new ReflectionProperty( '\Elementor\Plugin', 'preview' );
218
219 if ( $preview_property->isPublic() && ! $preview_property->isStatic() ) {
220 if ( method_exists( '\Elementor\Preview', 'is_preview_mode' )
221 && \Elementor\Plugin::$instance->preview->is_preview_mode() ) {
222 return true;
223 }
224 }
225 }
226
227 if ( class_exists( '\Elementor\Editor' ) && $refl_plugin->hasProperty( 'editor' ) ) {
228 $editor_property = new ReflectionProperty( '\Elementor\Plugin', 'editor' );
229
230 if ( $editor_property->isPublic() && ! $editor_property->isStatic() ) {
231 if ( method_exists( '\Elementor\Editor', 'is_edit_mode' )
232 && \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
233 return true;
234 }
235 }
236 }
237 }
238 }
239 } catch ( Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch
240 // not much we can do here.
241 }
242 }
243 return false;
244 }
245
246 /**
247 * Get DateTimeZone object for the WP installation
248 *
249 * @return DateTimeZone DateTimeZone object.
250 */
251 public static function get_wp_timezone() {
252 static $date_time_zone;
253 if ( ! is_null( $date_time_zone ) ) {
254 return $date_time_zone;
255 }
256
257 // wp_timezone() is available since WordPress 5.3.0.
258 if ( function_exists( 'wp_timezone' ) ) {
259 $date_time_zone = wp_timezone();
260
261 return $date_time_zone;
262 }
263
264 $time_zone = get_option( 'timezone_string' );
265 // no timezone string but gmt offset.
266 if ( empty( $time_zone ) ) {
267 $time_zone = get_option( 'gmt_offset' );
268 // gmt + x but not prefixed with a "+".
269 if ( preg_match( '/^\d/', $time_zone ) ) {
270 $time_zone = '+' . $time_zone;
271 }
272 }
273
274 $date_time_zone = new DateTimeZone( $time_zone );
275
276 return $date_time_zone;
277 }
278
279 /**
280 * Get literal expression of timezone.
281 *
282 * @return string Human readable timezone name.
283 */
284 public static function get_timezone_name() {
285 $time_zone = self::get_wp_timezone()->getName();
286 if ( 'UTC' === $time_zone ) {
287 return 'UTC+0';
288 }
289
290 if ( strpos( $time_zone, '+' ) === 0 || strpos( $time_zone, '-' ) === 0 ) {
291 return 'UTC' . $time_zone;
292 }
293
294 /* translators: timezone name */
295 return sprintf( __( 'time of %s', 'advanced-ads' ), $time_zone );
296 }
297 }
298