PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 2.0.8
Advanced Ads – Ad Manager & AdSense v2.0.8
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 1 year ago checks.php 1 year ago display-conditions.php 1 year ago filesystem.php 2 years ago frontend_checks.php 1 year ago in-content-injector.php 1 year ago inline-css.php 1 year ago utils.php 1 year ago visitor-conditions.php 1 year ago
utils.php
293 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 $placements = wp_advads_get_placements();
123 $item = $placements[ $id ]->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 $result[] = $ad;
133 if ( $ad->is_type( 'group' ) && ! empty( $ad->get_prop( 'group_id' ) ) ) {
134 $result = array_merge( $result, self::get_nested_ads( $ad->get_prop( 'group_id' ), 'group' ) );
135 }
136 break;
137 case 'group':
138 $group = wp_advads_get_group( $id );
139 $ads = $group->get_ads();
140 foreach ( $ads as $ad ) {
141 $result = array_merge( $result, self::get_nested_ads( $ad->get_id(), 'ad' ) );
142 }
143 break;
144 }
145
146 return $result;
147 }
148
149 /**
150 * Maybe translate a capability to a set of roles.
151 *
152 * @param string/array $roles_or_caps A set of roles or capabilities.
153 * @return array $roles A list of roles.
154 */
155 public static function maybe_translate_cap_to_role( $roles_or_caps ) {
156 global $wp_roles;
157
158 $roles_or_caps = (array) $roles_or_caps;
159 $roles = [];
160
161 foreach ( $roles_or_caps as $cap ) {
162 if ( $wp_roles->is_role( $cap ) ) {
163 $roles[] = $cap;
164 continue;
165 }
166
167 foreach ( $wp_roles->roles as $id => $role ) {
168 if ( isset( $role['capabilities'][ $cap ] ) ) {
169 $roles[] = $id;
170 }
171 }
172 }
173
174 return array_unique( $roles );
175 }
176
177 /**
178 * Check if the page is loaded in an iframe.
179 *
180 * @return bool
181 */
182 public static function is_iframe() {
183 if ( is_customize_preview() ) {
184 return true;
185 }
186
187 if ( self::is_elementor_preview_or_edit() ) {
188 return true;
189 }
190
191 return false;
192 }
193
194 /**
195 * Check if the Elementor preview mode is used.
196 *
197 * @deprecated
198 *
199 * @return bool
200 */
201 private static function is_elementor_preview_or_edit() {
202 if ( class_exists( '\Elementor\Plugin' ) ) {
203 try {
204 $refl_plugin = new ReflectionClass( '\Elementor\Plugin' );
205
206 if ( $refl_plugin->hasMethod( 'instance' ) ) {
207 $refl_instance_method = $refl_plugin->getMethod( 'instance' );
208
209 if ( $refl_instance_method->isPublic() && $refl_instance_method->isStatic() ) {
210
211 if ( class_exists( '\Elementor\Preview' ) && $refl_plugin->hasProperty( 'preview' ) ) {
212 $preview_property = new ReflectionProperty( '\Elementor\Plugin', 'preview' );
213
214 if ( $preview_property->isPublic() && ! $preview_property->isStatic() ) {
215 if ( method_exists( '\Elementor\Preview', 'is_preview_mode' )
216 && \Elementor\Plugin::$instance->preview->is_preview_mode() ) {
217 return true;
218 }
219 }
220 }
221
222 if ( class_exists( '\Elementor\Editor' ) && $refl_plugin->hasProperty( 'editor' ) ) {
223 $editor_property = new ReflectionProperty( '\Elementor\Plugin', 'editor' );
224
225 if ( $editor_property->isPublic() && ! $editor_property->isStatic() ) {
226 if ( method_exists( '\Elementor\Editor', 'is_edit_mode' )
227 && \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
228 return true;
229 }
230 }
231 }
232 }
233 }
234 } catch ( Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch
235 // not much we can do here.
236 }
237 }
238 return false;
239 }
240
241 /**
242 * Get DateTimeZone object for the WP installation
243 *
244 * @return DateTimeZone DateTimeZone object.
245 */
246 public static function get_wp_timezone() {
247 static $date_time_zone;
248 if ( ! is_null( $date_time_zone ) ) {
249 return $date_time_zone;
250 }
251
252 // wp_timezone() is available since WordPress 5.3.0.
253 if ( function_exists( 'wp_timezone' ) ) {
254 $date_time_zone = wp_timezone();
255
256 return $date_time_zone;
257 }
258
259 $time_zone = get_option( 'timezone_string' );
260 // no timezone string but gmt offset.
261 if ( empty( $time_zone ) ) {
262 $time_zone = get_option( 'gmt_offset' );
263 // gmt + x but not prefixed with a "+".
264 if ( preg_match( '/^\d/', $time_zone ) ) {
265 $time_zone = '+' . $time_zone;
266 }
267 }
268
269 $date_time_zone = new DateTimeZone( $time_zone );
270
271 return $date_time_zone;
272 }
273
274 /**
275 * Get literal expression of timezone.
276 *
277 * @return string Human readable timezone name.
278 */
279 public static function get_timezone_name() {
280 $time_zone = self::get_wp_timezone()->getName();
281 if ( 'UTC' === $time_zone ) {
282 return 'UTC+0';
283 }
284
285 if ( strpos( $time_zone, '+' ) === 0 || strpos( $time_zone, '-' ) === 0 ) {
286 return 'UTC' . $time_zone;
287 }
288
289 /* translators: timezone name */
290 return sprintf( __( 'time of %s', 'advanced-ads' ), $time_zone );
291 }
292 }
293