PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.20.0
Advanced Ads – Ad Manager & AdSense v1.20.0
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 / plugin.php
advanced-ads / classes Last commit date
EDD_SL_Plugin_Updater.php 6 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 6 years ago ad_type_image.php 5 years ago ad_type_plain.php 5 years ago checks.php 6 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
plugin.php
842 lines
1 <?php
2
3 /**
4 * WordPress integration and definitions:
5 *
6 * - posttypes
7 * - taxonomy
8 * - textdomain
9 */
10 class Advanced_Ads_Plugin {
11 /**
12 * Instance of Advanced_Ads_Plugin
13 *
14 * @var object Advanced_Ads_Plugin
15 */
16 protected static $instance;
17
18 /**
19 * Instance of Advanced_Ads_Model
20 *
21 * @var object Advanced_Ads_Model
22 */
23 protected $model;
24
25 /**
26 * Plugin options
27 *
28 * @var array $options
29 */
30 protected $options;
31
32 /**
33 * Interal plugin options – set by the plugin
34 *
35 * @var array $internal_options
36 */
37 protected $internal_options;
38
39 /**
40 * Default prefix of selectors (id, class) in the frontend
41 * can be changed by options
42 *
43 * @var Advanced_Ads_Plugin
44 */
45 const DEFAULT_FRONTEND_PREFIX = 'advads-';
46
47 /**
48 * Frontend prefix for classes and IDs
49 *
50 * @var string $frontend_prefix
51 */
52 private $frontend_prefix;
53
54 /**
55 * Advanced_Ads_Plugin constructor.
56 */
57 private function __construct() {
58 register_activation_hook( ADVADS_BASE, array( $this, 'activate' ) );
59 register_deactivation_hook( ADVADS_BASE, array( $this, 'deactivate' ) );
60 register_uninstall_hook( ADVADS_BASE, array( 'Advanced_Ads_Plugin', 'uninstall' ) );
61
62 add_action( 'plugins_loaded', array( $this, 'wp_plugins_loaded' ), 10 );
63 add_action( 'init', array( $this, 'run_upgrades' ), 9 );
64 }
65
66 /**
67 * Get instance of Advanced_Ads_Plugin
68 *
69 * @return Advanced_Ads_Plugin
70 */
71 public static function get_instance() {
72 // If the single instance hasn't been set, set it now.
73 if ( null === self::$instance ) {
74 self::$instance = new self();
75 }
76
77 return self::$instance;
78 }
79
80 /**
81 * Get instance of Advanced_Ads_Model
82 *
83 * @param Advanced_Ads_Model $model model to access data.
84 */
85 public function set_model( Advanced_Ads_Model $model ) {
86 $this->model = $model;
87 }
88
89 /**
90 * Execute various hooks after WordPress and all plugins are available
91 */
92 public function wp_plugins_loaded() {
93 // Load plugin text domain.
94 $this->load_plugin_textdomain();
95
96 // activate plugin when new blog is added on multisites // -TODO this is admin-only.
97 add_action( 'wpmu_new_blog', array( $this, 'activate_new_site' ) );
98
99 // Load public-facing style sheet and JavaScript.
100 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ) );
101 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
102 add_action( 'wp_head', array( $this, 'print_head_scripts' ), 7 );
103
104 // add short codes.
105 add_shortcode( 'the_ad', array( $this, 'shortcode_display_ad' ) );
106 add_shortcode( 'the_ad_group', array( $this, 'shortcode_display_ad_group' ) );
107 add_shortcode( 'the_ad_placement', array( $this, 'shortcode_display_ad_placement' ) );
108
109 // remove default ad group menu item // -TODO only for admin.
110 add_action( 'admin_menu', array( $this, 'remove_taxonomy_menu_item' ) );
111 // load widgets.
112 add_action( 'widgets_init', array( $this, 'widget_init' ) );
113
114 // load display conditions.
115 Advanced_Ads_Display_Conditions::get_instance();
116 new Advanced_Ads_Frontend_Checks();
117 new Advanced_Ads_Compatibility();
118 Advanced_Ads_Ad_Health_Notices::get_instance(); // load to fetch notices.
119 }
120
121 /**
122 * Run upgrades.
123 *
124 * Compatibility with the Piklist plugin that has a function hooked to `posts_where` that access $GLOBALS['wp_query'].
125 * Since `Advanced_Ads_Upgrades` applies `posts_where`: (`Advanced_Ads_Admin_Notices::get_instance()` >
126 * `Advanced_Ads::get_number_of_ads()` > new WP_Query > ... 'posts_where') this function is hooked to `init` so that `$GLOBALS['wp_query']` is instantiated.
127 */
128 public function run_upgrades() {
129 /**
130 * Run upgrades, if this is a new version or version does not exist.
131 */
132 $internal_options = $this->internal_options();
133
134 if ( ! defined( 'DOING_AJAX' ) && ( ! isset( $internal_options['version'] ) || version_compare( $internal_options['version'], ADVADS_VERSION, '<' ) ) ) {
135 new Advanced_Ads_Upgrades();
136 }
137 }
138
139 /**
140 * Register and enqueue public-facing style sheet.
141 */
142 public function enqueue_styles() {
143 // wp_enqueue_style( $this->get_plugin_slug() . '-plugin-styles', plugins_url('assets/css/public.css', __FILE__), array(), ADVADS_VERSION);
144 }
145
146 /**
147 * Return the plugin slug.
148 *
149 * @return string plugin slug variable.
150 */
151 public function get_plugin_slug() {
152 return ADVADS_SLUG;
153 }
154
155 /**
156 * Register and enqueues public-facing JavaScript files.
157 */
158 public function enqueue_scripts() {
159 if ( advads_is_amp() ) {
160 return;
161 }
162 // wp_enqueue_script( $this->get_plugin_slug() . '-plugin-script', plugins_url('assets/js/public.js', __FILE__), array('jquery'), ADVADS_VERSION);
163 $activated_js = apply_filters( 'advanced-ads-activate-advanced-js', isset( $this->options()['advanced-js'] ) );
164
165 if ( $activated_js || ! empty( $_COOKIE['advads_frontend_picker'] ) ) {
166 wp_enqueue_script(
167 $this->get_plugin_slug() . '-advanced-js',
168 sprintf( '%spublic/assets/js/advanced%s.js', ADVADS_BASE_URL, defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.orig' : '' ),
169 array( 'jquery' ),
170 ADVADS_VERSION,
171 false
172 );
173
174 $privacy = Advanced_Ads_Privacy::get_instance();
175 $privacy_options = $privacy->options();
176 $privacy_options['enabled'] = ! empty( $privacy_options['enabled'] );
177 $privacy_options['state'] = $privacy->get_state();
178
179 $data = array(
180 'blog_id' => get_current_blog_id(),
181 'privacy' => $privacy_options,
182 );
183
184 wp_localize_script( $this->get_plugin_slug() . '-advanced-js', 'advads_options', $data );
185 }
186 }
187
188 /**
189 * Print public-facing JavaScript in the HTML head.
190 */
191 public function print_head_scripts() {
192 /**
193 * Usage example in add-ons:
194 * ( window.advanced_ads_ready || jQuery( document ).ready ).call( null, function() {
195 * // Called when DOM is ready.
196 * } );
197 */
198
199 $short_url = self::get_short_url();
200 $attribution = '<!-- ' . $short_url . ' is managing ads with Advanced Ads%1$s%2$s -->';
201 $version = self::is_new_user( 1585224000 ) ? ' ' . ADVADS_VERSION : '';
202 $plugin_url = self::get_group_by_url( $short_url, 'a' ) ? '' . ADVADS_URL : '';
203 // escaping would break HTML comment tags so we disable checks here.
204 // phpcs:ignore
205 echo apply_filters( 'advanced-ads-attribution', sprintf( $attribution, $version, $plugin_url ) );
206
207 if ( advads_is_amp() ) {
208 return;
209 }
210
211 ob_start();
212 // @formatter:off
213 ?>
214 <script>
215 <?php
216 if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
217 readfile( ADVADS_BASE_PATH . 'public/assets/js/ready.js' );
218 } else {
219 ?>
220 advanced_ads_ready=function(){var fns=[],listener,doc=typeof document==="object"&&document,hack=doc&&doc.documentElement.doScroll,domContentLoaded="DOMContentLoaded",loaded=doc&&(hack?/^loaded|^c/:/^loaded|^i|^c/).test(doc.readyState);if(!loaded&&doc){listener=function(){doc.removeEventListener(domContentLoaded,listener);window.removeEventListener("load",listener);loaded=1;while(listener=fns.shift())listener()};doc.addEventListener(domContentLoaded,listener);window.addEventListener("load",listener)}return function(fn){loaded?setTimeout(fn,0):fns.push(fn)}}();
221 <?php
222 }
223 ?>
224 </script>
225 <?php
226 // @formatter:on
227 // escaping would break our HTML here.
228 // phpcs:ignore
229 echo Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
230
231 }
232
233 /**
234 * Register the Advanced Ads widget
235 */
236 public function widget_init() {
237 register_widget( 'Advanced_Ads_Widget' );
238 }
239
240 /**
241 * Fired when a new site is activated with a WPMU environment.
242 *
243 * @param int $blog_id ID of the new blog.
244 */
245 public function activate_new_site( $blog_id ) {
246
247 if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
248 return;
249 }
250
251 switch_to_blog( $blog_id );
252 $this->single_activate();
253 restore_current_blog();
254 }
255
256 /**
257 * Fired for each blog when the plugin is activated.
258 */
259 protected function single_activate() {
260 // $this->post_types_rewrite_flush();
261 // -TODO inform modules
262 $this->create_capabilities();
263 }
264
265 /**
266 * Fired for each blog when the plugin is deactivated.
267 */
268 protected function single_deactivate() {
269 // -TODO inform modules
270 $this->remove_capabilities();
271 }
272
273 /**
274 * Load the plugin text domain for translation.
275 */
276 public function load_plugin_textdomain() {
277 load_plugin_textdomain( 'advanced-ads', false, ADVADS_BASE_DIR . '/languages' );
278 }
279
280 /**
281 * Fired when the plugin is activated.
282 *
283 * @param boolean $network_wide True if WPMU superadmin uses
284 * "Network Activate" action, false if
285 * WPMU is disabled or plugin is
286 * activated on an individual blog.
287 */
288 public function activate( $network_wide ) {
289 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
290
291 if ( $network_wide ) {
292 // get all blog ids.
293 global $wpdb;
294 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
295 $original_blog_id = $wpdb->blogid;
296
297 foreach ( $blog_ids as $blog_id ) {
298 switch_to_blog( $blog_id );
299 $this->single_activate();
300 }
301
302 switch_to_blog( $original_blog_id );
303 } else {
304 $this->single_activate();
305 }
306 } else {
307 $this->single_activate();
308 }
309 }
310
311 /**
312 * Fired when the plugin is deactivated.
313 *
314 * @param boolean $network_wide true if Advanced Ads should be disabled network-wide.
315 *
316 * True if WPMU superadmin uses
317 * "Network Deactivate" action, false if
318 * WPMU is disabled or plugin is
319 * deactivated on an individual blog.
320 */
321 public function deactivate( $network_wide ) {
322 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
323
324 if ( $network_wide ) {
325 // get all blog ids.
326 global $wpdb;
327 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
328 $original_blog_id = $wpdb->blogid;
329
330 foreach ( $blog_ids as $blog_id ) {
331 switch_to_blog( $blog_id );
332 $this->single_deactivate();
333 }
334
335 switch_to_blog( $original_blog_id );
336 } else {
337 $this->single_deactivate();
338 }
339 } else {
340 $this->single_deactivate();
341 }
342 }
343
344 /**
345 * Remove WP tag edit page for the ad group taxonomy
346 * needed, because we can’t remove it with `show_ui` without also removing the meta box
347 */
348 public function remove_taxonomy_menu_item() {
349 remove_submenu_page( 'edit.php?post_type=advanced_ads', 'edit-tags.php?taxonomy=advanced_ads_groups&amp;post_type=advanced_ads' );
350 }
351
352 /**
353 * Shortcode to include ad in frontend
354 *
355 * @param array $atts shortcode attributes.
356 *
357 * @return string ad content.
358 */
359 public function shortcode_display_ad( $atts ) {
360 $atts = is_array( $atts ) ? $atts : array();
361 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
362 $atts = $this->prepare_shortcode_atts( $atts );
363
364 // use the public available function here.
365 return get_ad( $id, $atts );
366 }
367
368 /**
369 * Shortcode to include ad from an ad group in frontend
370 *
371 * @param array $atts shortcode attributes.
372 *
373 * @return string ad group content.
374 */
375 public function shortcode_display_ad_group( $atts ) {
376 $atts = is_array( $atts ) ? $atts : array();
377 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
378 $atts = $this->prepare_shortcode_atts( $atts );
379
380 // use the public available function here.
381 return get_ad_group( $id, $atts );
382 }
383
384 /**
385 * Shortcode to display content of an ad placement in frontend
386 *
387 * @param array $atts shortcode attributes.
388 *
389 * @return string ad placement content.
390 */
391 public function shortcode_display_ad_placement( $atts ) {
392 $atts = is_array( $atts ) ? $atts : array();
393 $id = isset( $atts['id'] ) ? (string) $atts['id'] : '';
394 $atts = $this->prepare_shortcode_atts( $atts );
395
396 // use the public available function here.
397 return get_ad_placement( $id, $atts );
398 }
399
400 /**
401 * Prepare shortcode attributes.
402 *
403 * @param array $atts array with strings.
404 *
405 * @return array
406 */
407 private function prepare_shortcode_atts( $atts ) {
408 $result = array();
409
410 /**
411 * Prepare attributes by converting strings to multi-dimensional array
412 * Example: [ 'output__margin__top' => 1 ] => ['output']['margin']['top'] = 1
413 */
414 if ( ! defined( 'ADVANCED_ADS_DISABLE_CHANGE' ) || ! ADVANCED_ADS_DISABLE_CHANGE ) {
415 foreach ( $atts as $attr => $data ) {
416 $levels = explode( '__', $attr );
417 $last = array_pop( $levels );
418
419 $cur_lvl = &$result;
420
421 foreach ( $levels as $lvl ) {
422 if ( ! isset( $cur_lvl[ $lvl ] ) ) {
423 $cur_lvl[ $lvl ] = array();
424 }
425
426 $cur_lvl = &$cur_lvl[ $lvl ];
427 }
428
429 $cur_lvl[ $last ] = $data;
430 }
431
432 $result = array_diff_key(
433 $result,
434 array(
435 'id' => false,
436 'blog_id' => false,
437 'ad_args' => false,
438 )
439 );
440 }
441
442 // Ad type: 'content' and a shortcode inside.
443 if ( isset( $atts['ad_args'] ) ) {
444 $result = array_merge( $result, json_decode( urldecode( $atts['ad_args'] ), true ) );
445
446 }
447
448 return $result;
449 }
450
451 /**
452 * Return plugin options
453 * these are the options updated by the user
454 *
455 * @return array $options
456 */
457 public function options() {
458 // we can’t store options if WPML String Translations is enabled, or it would not translate the "Ad Label" option.
459 if ( ! isset( $this->options ) || class_exists( 'WPML_ST_String' ) ) {
460 $this->options = get_option( ADVADS_SLUG, array() );
461 }
462
463 // default options for new users
464 if ( array() === $this->options ) {
465 // disable the shortcode button by default for users who never stored the settings.
466 if ( ! isset( $this->options['disable-shortcode-button'] ) ) {
467 $this->options['disable-shortcode-button'] = true;
468 }
469 }
470
471 // allow to change options dynamically
472 $this->options = apply_filters( 'advanced-ads-options', $this->options );
473
474 return $this->options;
475 }
476
477 /**
478 * Update plugin options (not for settings page, but if automatic options are needed)
479 *
480 * @param array $options new options.
481 */
482 public function update_options( array $options ) {
483 // do not allow to clear options.
484 if ( array() === $options ) {
485 return;
486 }
487
488 $this->options = $options;
489 update_option( ADVADS_SLUG, $options );
490 }
491
492 /**
493 * Return internal plugin options
494 * these are options set by the plugin
495 *
496 * @return array $options
497 */
498 public function internal_options() {
499 if ( ! isset( $this->internal_options ) ) {
500 $defaults = array(
501 'version' => ADVADS_VERSION,
502 'installed' => time(), // when was this installed.
503 );
504 $this->internal_options = get_option( ADVADS_SLUG . '-internal', array() );
505
506 // save defaults.
507 if ( array() === $this->internal_options ) {
508 $this->internal_options = $defaults;
509 $this->update_internal_options( $this->internal_options );
510
511 self::get_instance()->create_capabilities();
512 }
513
514 // for versions installed prior to 1.5.3 set installed date for now.
515 if ( ! isset( $this->internal_options['installed'] ) ) {
516 $this->internal_options['installed'] = time();
517 $this->update_internal_options( $this->internal_options );
518 }
519 }
520
521 return $this->internal_options;
522 }
523
524 /**
525 * Update internal plugin options
526 *
527 * @param array $options new internal options.
528 */
529 public function update_internal_options( array $options ) {
530 // do not allow to clear options.
531 if ( array() === $options ) {
532 return;
533 }
534
535 $this->internal_options = $options;
536 update_option( ADVADS_SLUG . '-internal', $options );
537 }
538
539 /**
540 * Get prefix used for frontend elements
541 */
542 public function get_frontend_prefix() {
543 if ( ! $this->frontend_prefix ) {
544 $options = $this->options();
545
546 if ( ! isset( $options['front-prefix'] ) ) {
547 if ( isset( $options['id-prefix'] ) ) {
548 // deprecated: keeps widgets working that previously received an id based on the front-prefix.
549 $frontend_prefix = esc_attr( $options['id-prefix'] );
550 } else {
551 $host = parse_url( get_home_url(), PHP_URL_HOST );
552 $frontend_prefix = preg_match( '/[A-Za-z][A-Za-z0-9_]{4}/', $host, $result ) ? $result[0] . '-' : self::DEFAULT_FRONTEND_PREFIX;
553 }
554 } else {
555 $frontend_prefix = esc_attr( $options['front-prefix'] );
556 }
557 /**
558 * Applying the filter here makes sure that it is the same frontend prefix for all
559 * calls on this page impression
560 */
561 $this->frontend_prefix = apply_filters( 'advanced-ads-frontend-prefix', $frontend_prefix );
562 }
563
564 return $this->frontend_prefix;
565 }
566
567 /**
568 * Get priority used for injection inside content
569 */
570 public function get_content_injection_priority() {
571 $options = $this->options();
572
573 return isset( $options['content-injection-priority'] ) ? intval( $options['content-injection-priority'] ) : 100;
574 }
575
576 /**
577 * Returns the capability needed to perform an action
578 *
579 * @param string $capability a capability to check, can be internal to Advanced Ads.
580 *
581 * @return string $capability a valid WordPress capability.
582 */
583 public static function user_cap( $capability = 'manage_options' ) {
584
585 global $advanced_ads_capabilities;
586
587 // admins can do everything.
588 // is also a fallback if no option or more specific capability is given.
589 if ( current_user_can( 'manage_options' ) ) {
590 return 'manage_options';
591 }
592
593 return apply_filters( 'advanced-ads-capability', $capability );
594 }
595
596 /**
597 * Create roles and capabilities
598 */
599 public function create_capabilities() {
600 if ( $role = get_role( 'administrator' ) ) {
601 $role->add_cap( 'advanced_ads_manage_options' );
602 $role->add_cap( 'advanced_ads_see_interface' );
603 $role->add_cap( 'advanced_ads_edit_ads' );
604 $role->add_cap( 'advanced_ads_manage_placements' );
605 $role->add_cap( 'advanced_ads_place_ads' );
606 }
607 }
608
609 /**
610 * Remove roles and capabilities
611 */
612 public function remove_capabilities() {
613 if ( $role = get_role( 'administrator' ) ) {
614 $role->remove_cap( 'advanced_ads_manage_options' );
615 $role->remove_cap( 'advanced_ads_see_interface' );
616 $role->remove_cap( 'advanced_ads_edit_ads' );
617 $role->remove_cap( 'advanced_ads_manage_placements' );
618 $role->remove_cap( 'advanced_ads_place_ads' );
619 }
620 }
621
622 /**
623 * Fired when the plugin is uninstalled.
624 */
625 public static function uninstall() {
626 $advads_options = Advanced_Ads::get_instance()->options();
627
628 if ( ! empty( $advads_options['uninstall-delete-data'] ) ) {
629 global $wpdb;
630 $main_blog_id = $wpdb->blogid;
631
632 Advanced_Ads::get_instance()->create_post_types();
633
634 if ( ! is_multisite() ) {
635 self::get_instance()->uninstall_single();
636 } else {
637 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
638
639 foreach ( $blog_ids as $blog_id ) {
640 switch_to_blog( $blog_id );
641 self::get_instance()->uninstall_single();
642 }
643 switch_to_blog( $main_blog_id );
644 }
645
646 // Delete assets (main blog).
647 Advanced_Ads_Ad_Blocker_Admin::get_instance()->clear_assets();
648 delete_option( ADVADS_AB_SLUG );
649 }
650
651 }
652
653 /**
654 * Fired for each blog when the plugin is uninstalled.
655 */
656 protected function uninstall_single() {
657 global $wpdb;
658
659 // Ads.
660 $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", Advanced_Ads::POST_TYPE_SLUG ) );
661
662 if ( $post_ids ) {
663 $wpdb->delete(
664 $wpdb->posts,
665 array( 'post_type' => Advanced_Ads::POST_TYPE_SLUG ),
666 array( '%s' )
667 );
668
669 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN( %s )", implode( ',', $post_ids ) ) );
670 }
671
672 // Groups.
673 $term_ids = $wpdb->get_col( $wpdb->prepare( "SELECT t.term_id FROM {$wpdb->terms} AS t INNER JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s", Advanced_Ads::AD_GROUP_TAXONOMY ) );
674
675 foreach ( $term_ids as $term_id ) {
676 wp_delete_term( $term_id, Advanced_Ads::AD_GROUP_TAXONOMY );
677 }
678
679 delete_option( 'advads-ad-groups' );
680 delete_option( Advanced_Ads::AD_GROUP_TAXONOMY . '_children' );
681 delete_option( 'advads-ad-weights' );
682
683 // Placements.
684 delete_option( 'advads-ads-placements' );
685
686 // User metadata.
687 delete_metadata( 'user', null, 'advanced-ads-hide-wizard', '', true );
688 delete_metadata( 'user', null, 'advanced-ads-subscribed', '', true );
689
690 // Post metadata.
691 delete_metadata( 'post', null, '_advads_ad_settings', '', true );
692
693 // Transients.
694 delete_transient( ADVADS_SLUG . '_add-on-updates-checked' );
695
696 delete_option( GADSENSE_OPT_NAME );
697 delete_option( ADVADS_SLUG );
698 delete_option( ADVADS_SLUG . '-internal' );
699 delete_option( ADVADS_SLUG . '-notices' );
700
701 // Widget.
702 $base_widget_id = Advanced_Ads_Widget::get_base_id();
703 delete_option( 'widget_' . $base_widget_id );
704
705 do_action( 'advanced-ads-uninstall' );
706
707 wp_cache_flush();
708 }
709
710 /**
711 * Check if any add-on is activated
712 *
713 * @return bool true if there is any add-on activated
714 */
715 public static function any_activated_add_on() {
716 return ( defined( 'AAP_VERSION' ) // Advanced Ads Pro.
717 || defined( 'AAGAM_VERSION' ) // Google Ad Manager.
718 || defined( 'AASA_VERSION' ) // Selling Ads.
719 || defined( 'AAT_VERSION' ) // Tracking.
720 || defined( 'AASADS_VERSION' ) // Sticky Ads.
721 || defined( 'AAR_VERSION' ) // Responsive Ads.
722 || defined( 'AAPLDS_VERSION' ) // PopUp and Layer Ads.
723 || defined( 'AAGT_SLUG' ) // Geo-Targeting.
724 );
725 }
726
727 /**
728 * Get the correct support URL: wp.org for free users and website for those with any add-on installed
729 *
730 * @param string $utm add UTM parameter to the link leading to https://wpadvancedads.com, if given.
731 *
732 * @return string URL.
733 */
734 public static function support_url( $utm = '' ) {
735
736 $utm = empty( $utm ) ? '#utm_source=advanced-ads&utm_medium=link&utm_campaign=support' : $utm;
737 if ( self::any_activated_add_on() ) {
738 $url = ADVADS_URL . 'support/' . $utm . '-with-addons';
739 } else {
740 $url = ADVADS_URL . 'support/' . $utm . '-free-user';
741 }
742
743 return $url;
744 }
745
746 /**
747 * Create a random group
748 *
749 * @param string $url optional parameter.
750 * @param string $ex group.
751 *
752 * @return bool
753 */
754 public static function get_group_by_url( $url = '', $ex = 'a' ) {
755
756 $url = self::get_short_url( $url );
757
758 $code = intval( substr( md5( $url ), - 1 ), 16 );
759
760 switch ( $ex ) {
761 case 'b':
762 return ( $code & 2 ) >> 1; // returns 1 or 0.
763 case 'c':
764 return ( $code & 4 ) >> 2; // returns 1 or 0.
765 case 'd':
766 return ( $code & 8 ) >> 3; // returns 1 or 0.
767 default:
768 return $code & 1; // returns 1 or 0.
769 }
770 }
771
772 /**
773 * Check if user started after a given date
774 *
775 * @param integer $timestamp time stamp.
776 *
777 * @return bool true if user is added after timestamp.
778 */
779 public static function is_new_user( $timestamp = 0 ) {
780
781 // allow admins to see version for new users in any case.
782 if ( current_user_can( self::user_cap( 'advanced_ads_manage_options' ) )
783 && isset( $_REQUEST['advads-ignore-timestamp'] ) ) {
784 return true;
785 }
786
787 $timestamp = absint( $timestamp );
788
789 $options = self::get_instance()->internal_options();
790 $installed = isset( $options['installed'] ) ? $options['installed'] : 0;
791
792 return ( $installed >= $timestamp );
793 }
794
795 /**
796 * Show stuff to new users only.
797 *
798 * @param integer $timestamp time after which to show whatever.
799 * @param string $group optional group.
800 *
801 * @return bool true if user enabled after given timestamp.
802 */
803 public static function show_to_new_users( $timestamp, $group = 'a' ) {
804
805 return ( self::get_group_by_url( null, $group ) && self::is_new_user( $timestamp ) );
806 }
807
808 /**
809 * Get short version of home_url()
810 * remove protocol and www
811 * remove slash
812 *
813 * @param string $url URL to be shortened.
814 *
815 * @return string
816 */
817 public static function get_short_url( $url = '' ) {
818
819 $url = empty( $url ) ? home_url() : $url;
820
821 // strip protocols.
822 if ( preg_match( '/^(\w[\w\d]*:\/\/)?(www\.)?(.*)$/', trim( $url ), $matches ) ) {
823 $url = $matches[3];
824 }
825
826 // strip slashes.
827 $url = trim( $url, '/' );
828
829 return $url;
830 }
831
832 /**
833 * Return Advanced Ads logo in base64 format for use in WP Admin menu.
834 *
835 * @return string
836 */
837 public static function get_icon_svg() {
838 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjEuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJFYmVuZV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDY0Ljk5MyA2NS4wMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDY0Ljk5MyA2NS4wMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIHN0eWxlPSJmaWxsOiNFNEU0RTQ7IiBkPSJNNDYuNTcxLDI3LjY0MXYyMy4xMzNIMTQuMjVWMTguNDUzaDIzLjExOGMtMC45NTYtMi4xODMtMS40OTQtNC41OS0xLjQ5NC03LjEyNg0KCWMwLTIuNTM1LDAuNTM4LTQuOTQyLDEuNDk0LTcuMTI0aC02Ljk1N0gwdjQ5LjQ5M2wxLjYxOCwxLjYxOEwwLDUzLjY5NmMwLDYuMjU2LDUuMDY4LDExLjMyNiwxMS4zMjQsMTEuMzI4djBoMTkuMDg3aDMwLjQxMlYyNy42MTENCgljLTIuMTkxLDAuOTY0LTQuNjA5LDEuNTA5LTcuMTU3LDEuNTA5QzUxLjE0MiwyOS4xMiw0OC43NDYsMjguNTg4LDQ2LjU3MSwyNy42NDF6Ii8+DQo8Y2lyY2xlIHN0eWxlPSJmaWxsOiM5ODk4OTg7IiBjeD0iNTMuNjY2IiBjeT0iMTEuMzI4IiByPSIxMS4zMjgiLz4NCjwvc3ZnPg0K';
839 }
840
841 }
842