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