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