PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.40.1
Advanced Ads – Ad Manager & AdSense v1.40.1
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
Advanced_Ads_Modal.php 3 years ago EDD_SL_Plugin_Updater.php 4 years ago ad-ajax.php 3 years ago ad-debug.php 3 years ago ad-expiration.php 3 years ago ad-health-notices.php 3 years ago ad-model.php 3 years ago ad-select.php 3 years ago ad.php 3 years ago ad_ajax_callbacks.php 3 years ago ad_group.php 3 years ago ad_placements.php 3 years ago ad_type_abstract.php 3 years ago ad_type_content.php 3 years ago ad_type_dummy.php 3 years ago ad_type_group.php 3 years ago ad_type_image.php 3 years ago ad_type_plain.php 3 years ago checks.php 3 years ago compatibility.php 3 years ago display-conditions.php 3 years ago filesystem.php 3 years ago frontend-notices.php 3 years ago frontend_checks.php 3 years ago in-content-injector.php 3 years ago inline-css.php 3 years ago plugin.php 3 years ago upgrades.php 6 years ago utils.php 3 years ago visitor-conditions.php 3 years ago widget.php 3 years ago
utils.php
283 lines
1 <?php
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 return $result;
79 }
80
81 /**
82 * Get inline asset.
83 *
84 * @param string $content existing content.
85 * @return string $content
86 */
87 public static function get_inline_asset( $content ) {
88 // WP Fastest Cache Premium: "Render Blocking Js" feature.
89 $content = ltrim( $content );
90 if ( class_exists( 'WpFastestCache', false )
91 && '<script' === substr( $content, 0, 7 ) ) {
92 $content = substr_replace( $content, '<script data-wpfc-render="false"', 0, 7 );
93 }
94
95 if ( Advanced_Ads_Checks::active_autoptimize() || Advanced_Ads_Checks::active_wp_rocket() ) {
96 return '<!--noptimize-->' . $content . '<!--/noptimize-->';
97 }
98 return $content;
99 }
100
101 /**
102 * Get nested ads of an ad or a group.
103 *
104 * @param string $id Id.
105 * @param string $type Type (placement, ad or group).
106 * @return array of Advanced_Ads_Ad objects.
107 */
108 public static function get_nested_ads( $id, $type ) {
109 $result = [];
110
111 switch ( $type ) {
112 case 'placement':
113 $placements = Advanced_Ads::get_ad_placements_array();
114 if ( isset( $placements[ $id ]['item'] ) ) {
115 $item = explode( '_', $placements[ $id ]['item'] );
116 if ( isset( $item[1] ) ) {
117 return self::get_nested_ads( $item[1], $item[0] );
118 }
119 }
120 case 'ad':
121 $ad = new Advanced_Ads_Ad( $id );
122 $result[] = $ad;
123 if ( 'group' === $ad->type && ! empty( $ad->output['group_id'] ) ) {
124 $result = array_merge( $result, self::get_nested_ads( $ad->output['group_id'], 'group' ) );
125 }
126 break;
127 case 'group':
128 $group = new Advanced_Ads_Group( $id );
129 $ads = $group->get_all_ads();
130 foreach ( $ads as $ad ) {
131 $result = array_merge( $result, self::get_nested_ads( $ad->ID, 'ad' ) );
132 }
133 break;
134 }
135 return $result;
136 }
137
138 /**
139 * Maybe translate a capability to a set of roles.
140 *
141 * @param string/array $roles_or_caps A set of roles or capabilities.
142 * @return array $roles A list of roles.
143 */
144 public static function maybe_translate_cap_to_role( $roles_or_caps ) {
145 global $wp_roles;
146
147 $roles_or_caps = (array) $roles_or_caps;
148 $roles = [];
149
150 foreach ( $roles_or_caps as $cap ) {
151 if ( $wp_roles->is_role( $cap ) ) {
152 $roles[] = $cap;
153 continue;
154 }
155
156 foreach ( $wp_roles->roles as $id => $role ) {
157 if ( isset( $role['capabilities'][ $cap ] ) ) {
158 $roles[] = $id;
159 }
160 }
161 }
162
163 return array_unique( $roles );
164 }
165
166 /**
167 * Check if the page is loaded in an iframe.
168 *
169 * @return bool
170 */
171 public static function is_iframe() {
172 if ( is_customize_preview() ) {
173 return true;
174 }
175
176 if ( self::is_elementor_preview_or_edit() ) {
177 return true;
178 }
179
180 return false;
181 }
182
183 /**
184 * Check if the Elementor preview mode is used.
185 *
186 * @deprecated
187 *
188 * @return bool
189 */
190 private static function is_elementor_preview_or_edit() {
191 if ( class_exists( '\Elementor\Plugin' ) ) {
192 try {
193 $refl_plugin = new ReflectionClass( '\Elementor\Plugin' );
194
195 if ( $refl_plugin->hasMethod( 'instance' ) ) {
196 $refl_instance_method = $refl_plugin->getMethod( 'instance' );
197
198 if ( $refl_instance_method->isPublic() && $refl_instance_method->isStatic() ) {
199
200 if ( class_exists( '\Elementor\Preview' ) && $refl_plugin->hasProperty( 'preview' ) ) {
201 $preview_property = new ReflectionProperty( '\Elementor\Plugin', 'preview' );
202
203 if ( $preview_property->isPublic() && ! $preview_property->isStatic() ) {
204 if ( method_exists( '\Elementor\Preview', 'is_preview_mode' )
205 && \Elementor\Plugin::$instance->preview->is_preview_mode() ) {
206 return true;
207 }
208 }
209 }
210
211 if ( class_exists( '\Elementor\Editor' ) && $refl_plugin->hasProperty( 'editor' ) ) {
212 $editor_property = new ReflectionProperty( '\Elementor\Plugin', 'editor' );
213
214 if ( $editor_property->isPublic() && ! $editor_property->isStatic() ) {
215 if ( method_exists( '\Elementor\Editor', 'is_edit_mode' )
216 && \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
217 return true;
218 }
219 }
220 }
221 }
222 }
223 } catch ( Exception $e ) {
224 // not much we can do here.
225 }
226 }
227 return false;
228 }
229
230 /**
231 * Get DateTimeZone object for the WP installation
232 *
233 * @return DateTimeZone DateTimeZone object.
234 */
235 public static function get_wp_timezone() {
236 static $date_time_zone;
237 if ( ! is_null( $date_time_zone ) ) {
238 return $date_time_zone;
239 }
240
241 // wp_timezone() is available since WordPress 5.3.0.
242 if ( function_exists( 'wp_timezone' ) ) {
243 $date_time_zone = wp_timezone();
244
245 return $date_time_zone;
246 }
247
248 $time_zone = get_option( 'timezone_string' );
249 // no timezone string but gmt offset.
250 if ( empty( $time_zone ) ) {
251 $time_zone = get_option( 'gmt_offset' );
252 // gmt + x but not prefixed with a "+".
253 if ( preg_match( '/^\d/', $time_zone ) ) {
254 $time_zone = '+' . $time_zone;
255 }
256 }
257
258 $date_time_zone = new DateTimeZone( $time_zone );
259
260 return $date_time_zone;
261 }
262
263 /**
264 * Get literal expression of timezone.
265 *
266 * @return string Human readable timezone name.
267 */
268 public static function get_timezone_name() {
269 $time_zone = self::get_wp_timezone()->getName();
270 if ( $time_zone === 'UTC' ) {
271 return 'UTC+0';
272 }
273
274 if ( strpos( $time_zone, '+' ) === 0 || strpos( $time_zone, '-' ) === 0 ) {
275 return 'UTC' . $time_zone;
276 }
277
278 // translators: time zone name.
279 return sprintf( __( 'time of %s', 'advanced-ads' ), $time_zone );
280 }
281 }
282
283