PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.23.2
Advanced Ads – Ad Manager & AdSense v1.23.2
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 / compatibility.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 6 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 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
compatibility.php
341 lines
1 <?php
2 /**
3 * Compatibility fixes with other plugins.
4 */
5 class Advanced_Ads_Compatibility {
6
7 /**
8 * Advanced_Ads_Compatibility constructor.
9 */
10 public function __construct() {
11 // Elementor plugin.
12 if ( defined( 'ELEMENTOR_VERSION' ) ) {
13 add_filter(
14 'advanced-ads-placement-content-injection-xpath',
15 array(
16 $this,
17 'content_injection_elementor',
18 ),
19 10,
20 1
21 );
22 }
23 if ( defined( 'WP_ROCKET_VERSION' ) ) {
24 add_filter( 'rocket_excluded_inline_js_content', array( $this, 'exclude_inline_js' ) );
25 }
26 // WPML.
27 add_filter( 'wpml_admin_language_switcher_active_languages', array( $this, 'wpml_language_switcher' ) );
28 // WordPress SEO by Yoast.
29 add_filter( 'wpseo_sitemap_entry', array( $this, 'wordpress_seo_noindex_ad_attachments' ), 10, 3 );
30 // Add shortcode for MailPoet.
31 add_filter( 'mailpoet_newsletter_shortcode', array( 'Advanced_Ads_Compatibility', 'mailpoet_ad_shortcode' ), 10, 5 );
32
33 // Enable Advanced Custom Fields on ad edit pages.
34 if ( class_exists( 'ACF', false ) ) {
35 add_filter( 'advanced-ads-ad-edit-allowed-metaboxes', array( $this, 'advanced_custom_fields_box' ) );
36 }
37
38 add_action( 'admin_enqueue_scripts', array( $this, 'admin_dequeue_scripts_and_styles' ), 100 );
39
40 if ( defined( 'BORLABS_COOKIE_VERSION' ) ) {
41 // Check if Verification code & Auto ads ads can be displayed.
42 add_filter( 'advanced-ads-can-display-ads-in-header', array( $this, 'borlabs_cookie_can_add_auto_ads_code' ), 10 );
43 }
44 }
45
46 /**
47 * Modify xPath expression for Elementor plugin.
48 * The plugin does not wrap newly created text in 'p' tags.
49 *
50 * @param string $tag xpath tag.
51 * @return string xPath expression
52 */
53 public function content_injection_elementor( $tag ) {
54 if ( 'p' === $tag ) {
55 // 'p' or 'div.elementor-widget-text-editor' without nested 'p'
56 $tag = "*[self::p or self::div[@class and contains(concat(' ', normalize-space(@class), ' '), ' elementor-widget-text-editor ') and not(descendant::p)]]";
57 }
58
59 return $tag;
60 }
61
62 /**
63 * Prevent the 'advanced_ads_ready' function declaration from being merged with other JS
64 * and outputted into the footer. This is needed because WP Rocket does not output all
65 * the code that depends on this function into the footer.
66 *
67 * @param array $pattern Patterns to match in inline JS content.
68 * @return array
69 */
70 public function exclude_inline_js( $pattern ) {
71 $pattern[] = 'advanced_ads_ready';
72
73 return $pattern;
74 }
75
76 /**
77 * Compatibility with WPML
78 * show only all languages in language switcher on Advanced Ads pages if ads and groups are translated
79 *
80 * @param array $active_languages languages that can be used in language switcher.
81 * @return array
82 */
83 public function wpml_language_switcher( $active_languages ) {
84 global $sitepress;
85 $screen = get_current_screen();
86 if ( ! isset( $screen->id ) ) {
87 return $active_languages;
88 }
89
90 switch ( $screen->id ) {
91 // check if we are on a group edit page and ad group translations are disabled.
92 case 'advanced-ads_page_advanced-ads-groups':
93 $translatable_taxonomies = $sitepress->get_translatable_taxonomies();
94 if ( ! is_array( $translatable_taxonomies ) || ! in_array( 'advanced_ads_groups', $translatable_taxonomies, true ) ) {
95 return array();
96 }
97 break;
98 // check if Advanced Ads ad post type is translatable.
99 case 'edit-advanced_ads': // overview page.
100 case 'advanced_ads': // edit page.
101 $translatable_documents = $sitepress->get_translatable_documents();
102 if ( empty( $translatable_documents['advanced_ads'] ) ) {
103 return array();
104 }
105 break;
106 }
107
108 return $active_languages;
109 }
110
111 /**
112 * WordPress SEO: remove attachments attached to ads from `/attachment-sitemap.xml`.
113 *
114 * @param array $url Array of URL parts.
115 * @param string $type URL type.
116 * @param object $post WP_Post object of attachment.
117 * @return array|bool Unmodified array of URL parts or false to remove URL.
118 */
119 public function wordpress_seo_noindex_ad_attachments( $url, $type, $post ) {
120 if ( 'post' !== $type ) {
121 return $url;
122 }
123
124 static $ad_ids = null;
125 if ( null === $ad_ids ) {
126 $ad_ids = Advanced_Ads::get_instance()->get_model()->get_ads(
127 array(
128 'post_status' => 'any',
129 'fields' => 'ids',
130 )
131 );
132 }
133
134 if ( isset( $post->post_parent ) && in_array( $post->post_parent, $ad_ids, true ) ) {
135 return false;
136 }
137
138 return $url;
139 }
140
141 /**
142 * Display an ad or ad group in a newsletter created by MailPoet.
143 * e.g., [custom:ad:123] to display ad with the ID 123
144 * [custom:ad_group:345] to display ad group with the ID 345
145 *
146 * DECEMBER 2020: MailPoet deprecated support for custom shortcodes in December 2020
147 * right now, it is not clear if and how this will work in the future
148 * we add an Ad Health notice to users who use one of our custom shortcodes
149 *
150 * @param string $shortcode shortcode that placed the ad.
151 * @param mixed $newsletter unused.
152 * @param mixed $subscriber unused.
153 * @param mixed $queue unused.
154 * @param string $newsletter_body unused.
155 *
156 * @return string
157 */
158 public static function mailpoet_ad_shortcode( $shortcode, $newsletter, $subscriber, $queue, $newsletter_body ) {
159
160 // display an ad group.
161 if ( 0 === strpos( $shortcode, '[custom:ad_group:' ) ) {
162 // get ad group ID.
163 preg_match( '/\d+/', $shortcode, $matches );
164 $group_id = $matches[0];
165
166 // is returning an empty string when the ad group is not found good UI?
167 if ( empty( $group_id ) ) {
168 return '';
169 }
170
171 // see function comment above
172 if ( class_exists( 'Advanced_Ads_Ad_Health_Notices', false ) ) {
173 Advanced_Ads_Ad_Health_Notices::get_instance()->add( 'mailpoet-deprecated-custom-shortcodes' );
174 }
175
176 // only display if the ad group type could work, i.e. default (random) and ordered.
177 $ad_group = new Advanced_Ads_Group( $group_id );
178 if ( isset( $ad_group->type ) && in_array( $ad_group->type, array( 'default', 'ordered' ), true ) ) {
179 return get_ad_group( $group_id );
180 }
181
182 return '';
183
184 // display individual ad.
185 } elseif ( 0 === strpos( $shortcode, '[custom:ad:' ) ) {
186 // get ad ID.
187 preg_match( '/\d+/', $shortcode, $matches );
188 $ad_id = $matches[0];
189
190 // is returning an empty string when the ad is not found good UI?
191 if ( empty( $ad_id ) ) {
192 return '';
193 }
194
195 // see function comment above
196 if ( class_exists( 'Advanced_Ads_Ad_Health_Notices', false ) ) {
197 Advanced_Ads_Ad_Health_Notices::get_instance()->add( 'mailpoet-deprecated-custom-shortcodes' );
198 }
199
200 $ad = new Advanced_Ads_Ad( $ad_id );
201 // only display if the ad type could work, i.e. plain text and image ads.
202 if ( isset( $ad->type ) && in_array( $ad->type, array( 'plain', 'image' ), true ) ) {
203 return get_ad( $ad_id );
204 }
205
206 return '';
207 } else {
208 // always return the shortcode if it doesn't match your own!
209 return $shortcode;
210 }
211 }
212
213 /**
214 * Check if placements of type other than `header` can be injected during `wp_head` action.
215 */
216 public static function can_inject_during_wp_head() {
217 // the "Thrive Theme Builder" theme.
218 if ( did_action( 'before_theme_builder_template_render' ) && ! did_action( 'after_theme_builder_template_render' ) ) {
219 return true;
220 }
221 return false;
222 }
223
224 /**
225 * Dequeue scripts and styles to prevent layout issues.
226 */
227 public function admin_dequeue_scripts_and_styles() {
228 if ( ! Advanced_Ads_Admin::screen_belongs_to_advanced_ads() ) {
229 return;
230 }
231
232 // Dequeue the css file enqueued by the JNews theme.
233 if ( defined( 'JNEWS_THEME_URL' ) ) {
234 wp_dequeue_style( 'jnews-admin' );
235 }
236 }
237
238 /**
239 * Check if Adsense Auto ads code can be added to the header.
240 *
241 * @param bool $can_display if the ad can already be displayed.
242 * @return bool
243 */
244 public function borlabs_cookie_can_add_auto_ads_code( $can_display ) {
245 if ( ! $can_display ) {
246 return false;
247 }
248
249 return ! self::borlabs_cookie_adsense_auto_ads_code_exists();
250 }
251
252 /**
253 * Check if Adsense Auto ads code is added by the Borlabs Cookie plugin.
254 *
255 * This allows to prevent the "Only one 'enable_page_level_ads' allowed per page" error
256 * that makes impossible to close the "Privacy Preference" window created by the "Borlabs Cookie" plugin.
257 *
258 * @return bool
259 */
260 public static function borlabs_cookie_adsense_auto_ads_code_exists() {
261 // Cache the result in order to perform the check only once.
262 static $result = null;
263
264 if ( null !== $result ) {
265 return $result;
266 }
267
268 // Set the `autoload` param to `true` so that the class loads both in frontend and backend.
269 if ( class_exists( '\BorlabsCookie\Cookie\Frontend\Cookies', true ) ) {
270 try {
271 $refl_cookies = new ReflectionClass( '\BorlabsCookie\Cookie\Frontend\Cookies' );
272
273 if ( $refl_cookies->hasMethod( 'getInstance' ) && $refl_cookies->hasMethod( 'getAllCookieGroups' ) ) {
274 $instance = $refl_cookies->getMethod( 'getInstance' );
275 $cookie_groups = $refl_cookies->getMethod( 'getAllCookieGroups' );
276
277 if ( $instance->isPublic() && $instance->isStatic() && $cookie_groups->isPublic() ) {
278 $all_cookies = BorlabsCookie\Cookie\Frontend\Cookies::getInstance()->getAllCookieGroups();
279 }
280 }
281 } catch ( Exception $e ) {
282 $result = false;
283 return $result;
284 }
285 }
286
287 if ( empty( $all_cookies ) ) {
288 $result = false;
289 return $result;
290 }
291
292 foreach ( $all_cookies as $cookie_group_data ) {
293 if ( ! empty( $cookie_group_data->group_id ) && 'marketing' === $cookie_group_data->group_id
294 && ! empty( $cookie_group_data->cookies ) ) {
295 foreach ( $cookie_group_data->cookies as $cookie_data ) {
296 if ( ! empty( $cookie_data->cookie_id ) && 'google-adsense' === $cookie_data->cookie_id
297 && ! empty( $cookie_data->opt_in_js ) ) {
298 $opt_in_js = $cookie_data->opt_in_js;
299 }
300 }
301 }
302 }
303
304 if ( empty( $opt_in_js ) ) {
305 $result = false;
306 return $result;
307 }
308
309 $result = preg_match( '/<script[^>]+data-ad-client/', $opt_in_js ) || false !== strpos( $opt_in_js, 'enable_page_level_ads:' );
310 return $result;
311 }
312
313 /**
314 * Whitelist meta boxes created by the Advanced Custom Fields plugin on the ad edit pages
315 * when they are dedicated for the "Ad" post type.
316 *
317 * @param array $meta_boxes already whitelisted meta boxes.
318 * @return array
319 */
320 public function advanced_custom_fields_box( $meta_boxes ) {
321
322 // fixes an issue reported when ACF class exists, but this function does not
323 if ( ! function_exists( 'acf_get_field_groups' ) ) {
324 return $meta_boxes;
325 }
326
327 // load ACF field groups dedicated to the Advanced Ads post type
328 $groups = acf_get_field_groups( array( 'post_type' => Advanced_Ads::POST_TYPE_SLUG ) );
329
330 if ( is_array( $groups ) && $groups ) {
331 foreach ( $groups as $_group ) {
332 if ( isset( $_group['key'] ) ) {
333 $meta_boxes[] = 'acf-' . $_group['key'];
334 }
335 }
336 }
337
338 return $meta_boxes;
339 }
340 }
341