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