PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.17.6
Advanced Ads – Ad Manager & AdSense v1.17.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 6 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 6 years ago ad_type_content.php 6 years ago ad_type_dummy.php 6 years ago ad_type_group.php 6 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-notices.php 6 years ago frontend_checks.php 6 years ago plugin.php 6 years ago upgrades.php 7 years ago utils.php 6 years ago visitor-conditions.php 6 years ago widget.php 6 years ago
plugin.php
809 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 $options = $this->options();
164 $activated_js = apply_filters( 'advanced-ads-activate-advanced-js', isset( $options['advanced-js'] ) );
165 if ( $activated_js ) {
166 wp_enqueue_script( $this->get_plugin_slug() . '-advanced-js', ADVADS_BASE_URL . 'public/assets/js/advanced.js', array( 'jquery' ), ADVADS_VERSION );
167 }
168 }
169
170 /**
171 * Print public-facing JavaScript in the HTML head.
172 */
173 public function print_head_scripts() {
174 /**
175 * Usage example in add-ons:
176 * ( window.advanced_ads_ready || jQuery( document ).ready ).call( null, function() {
177 * // Called when DOM is ready.
178 * } );
179 */
180
181 $short_url = self::get_short_url();
182 $attribution = '<!-- ' . $short_url . ' is managing ads with Advanced Ads%1$s%2$s -->';
183 $version = self::is_new_user( 1585224000 ) ? ' ' . ADVADS_VERSION : '';
184 $plugin_url = self::get_group_by_url( $short_url, 'a' ) ? '' . ADVADS_URL : '';
185 // escaping would break HTML comment tags so we disable checks here.
186 // phpcs:ignore
187 echo apply_filters( 'advanced-ads-attribution', sprintf( $attribution, $version, $plugin_url ) );
188
189 if ( advads_is_amp() ) {
190 return;
191 }
192
193 ob_start();
194 // @formatter:off
195 ?>
196 <script>
197 <?php
198 if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
199 readfile( ADVADS_BASE_PATH . 'public/assets/js/ready.js' );
200 } else {
201 ?>
202 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)}}();
203 <?php
204 }
205
206 // Output privacy options.
207 $privacy_options = Advanced_Ads_Privacy::get_instance()->options();
208 if ( ! empty( $privacy_options['enabled'] ) ) {
209 printf( '(advads_options = window.advads_options || {} )["privacy"] = %s;', wp_json_encode( $privacy_options ) );
210 }
211
212 ?>
213 </script>
214 <?php
215 // @formatter:on
216 // escaping would break our HTML here.
217 // phpcs:ignore
218 echo Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
219
220 }
221
222 /**
223 * Register the Advanced Ads widget
224 */
225 public function widget_init() {
226 register_widget( 'Advanced_Ads_Widget' );
227 }
228
229 /**
230 * Fired when a new site is activated with a WPMU environment.
231 *
232 * @param int $blog_id ID of the new blog.
233 */
234 public function activate_new_site( $blog_id ) {
235
236 if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
237 return;
238 }
239
240 switch_to_blog( $blog_id );
241 $this->single_activate();
242 restore_current_blog();
243 }
244
245 /**
246 * Fired for each blog when the plugin is activated.
247 */
248 protected function single_activate() {
249 // $this->post_types_rewrite_flush();
250 // -TODO inform modules
251 $this->create_capabilities();
252 }
253
254 /**
255 * Fired for each blog when the plugin is deactivated.
256 */
257 protected function single_deactivate() {
258 // -TODO inform modules
259 $this->remove_capabilities();
260 }
261
262 /**
263 * Load the plugin text domain for translation.
264 */
265 public function load_plugin_textdomain() {
266 load_plugin_textdomain( 'advanced-ads', false, ADVADS_BASE_DIR . '/languages' );
267 }
268
269 /**
270 * Fired when the plugin is activated.
271 *
272 * @param boolean $network_wide True if WPMU superadmin uses
273 * "Network Activate" action, false if
274 * WPMU is disabled or plugin is
275 * activated on an individual blog.
276 */
277 public function activate( $network_wide ) {
278 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
279
280 if ( $network_wide ) {
281 // get all blog ids.
282 global $wpdb;
283 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
284 $original_blog_id = $wpdb->blogid;
285
286 foreach ( $blog_ids as $blog_id ) {
287 switch_to_blog( $blog_id );
288 $this->single_activate();
289 }
290
291 switch_to_blog( $original_blog_id );
292 } else {
293 $this->single_activate();
294 }
295 } else {
296 $this->single_activate();
297 }
298 }
299
300 /**
301 * Fired when the plugin is deactivated.
302 *
303 * @param boolean $network_wide true if Advanced Ads should be disabled network-wide.
304 *
305 * True if WPMU superadmin uses
306 * "Network Deactivate" action, false if
307 * WPMU is disabled or plugin is
308 * deactivated on an individual blog.
309 */
310 public function deactivate( $network_wide ) {
311 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
312
313 if ( $network_wide ) {
314 // get all blog ids.
315 global $wpdb;
316 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
317 $original_blog_id = $wpdb->blogid;
318
319 foreach ( $blog_ids as $blog_id ) {
320 switch_to_blog( $blog_id );
321 $this->single_deactivate();
322 }
323
324 switch_to_blog( $original_blog_id );
325 } else {
326 $this->single_deactivate();
327 }
328 } else {
329 $this->single_deactivate();
330 }
331 }
332
333 /**
334 * Remove WP tag edit page for the ad group taxonomy
335 * needed, because we can’t remove it with `show_ui` without also removing the meta box
336 */
337 public function remove_taxonomy_menu_item() {
338 remove_submenu_page( 'edit.php?post_type=advanced_ads', 'edit-tags.php?taxonomy=advanced_ads_groups&amp;post_type=advanced_ads' );
339 }
340
341 /**
342 * Shortcode to include ad in frontend
343 *
344 * @param array $atts shortcode attributes.
345 *
346 * @return string ad content.
347 */
348 public function shortcode_display_ad( $atts ) {
349 $atts = is_array( $atts ) ? $atts : array();
350 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
351 $atts = $this->prepare_shortcode_atts( $atts );
352
353 // use the public available function here.
354 return get_ad( $id, $atts );
355 }
356
357 /**
358 * Shortcode to include ad from an ad group in frontend
359 *
360 * @param array $atts shortcode attributes.
361 *
362 * @return string ad group content.
363 */
364 public function shortcode_display_ad_group( $atts ) {
365 $atts = is_array( $atts ) ? $atts : array();
366 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
367 $atts = $this->prepare_shortcode_atts( $atts );
368
369 // use the public available function here.
370 return get_ad_group( $id, $atts );
371 }
372
373 /**
374 * Shortcode to display content of an ad placement in frontend
375 *
376 * @param array $atts shortcode attributes.
377 *
378 * @return string ad placement content.
379 */
380 public function shortcode_display_ad_placement( $atts ) {
381 $atts = is_array( $atts ) ? $atts : array();
382 $id = isset( $atts['id'] ) ? (string) $atts['id'] : '';
383 $atts = $this->prepare_shortcode_atts( $atts );
384
385 // use the public available function here.
386 return get_ad_placement( $id, $atts );
387 }
388
389 /**
390 * Prepare shortcode attributes.
391 *
392 * @param array $atts array with strings.
393 *
394 * @return array
395 */
396 private function prepare_shortcode_atts( $atts ) {
397 $result = array();
398
399 /**
400 * Prepare attributes by converting strings to multi-dimensional array
401 * Example: [ 'output__margin__top' => 1 ] => ['output']['margin']['top'] = 1
402 */
403 if ( ! defined( 'ADVANCED_ADS_DISABLE_CHANGE' ) || ! ADVANCED_ADS_DISABLE_CHANGE ) {
404 foreach ( $atts as $attr => $data ) {
405 $levels = explode( '__', $attr );
406 $last = array_pop( $levels );
407
408 $cur_lvl = &$result;
409
410 foreach ( $levels as $lvl ) {
411 if ( ! isset( $cur_lvl[ $lvl ] ) ) {
412 $cur_lvl[ $lvl ] = array();
413 }
414
415 $cur_lvl = &$cur_lvl[ $lvl ];
416 }
417
418 $cur_lvl[ $last ] = $data;
419 }
420
421 $result = array_diff_key(
422 $result,
423 array(
424 'id' => false,
425 'blog_id' => false,
426 'ad_args' => false,
427 )
428 );
429 }
430
431 // Ad type: 'content' and a shortcode inside.
432 if ( isset( $atts['ad_args'] ) ) {
433 $result = array_merge( $result, json_decode( urldecode( $atts['ad_args'] ), true ) );
434
435 }
436
437 return $result;
438 }
439
440 /**
441 * Return plugin options
442 * these are the options updated by the user
443 *
444 * @return array $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 * @param array $options new options.
459 */
460 public function update_options( array $options ) {
461 // do not allow to clear options.
462 if ( array() === $options ) {
463 return;
464 }
465
466 $this->options = $options;
467 update_option( ADVADS_SLUG, $options );
468 }
469
470 /**
471 * Return internal plugin options
472 * these are options set by the plugin
473 *
474 * @return array $options
475 */
476 public function internal_options() {
477 if ( ! isset( $this->internal_options ) ) {
478 $defaults = array(
479 'version' => ADVADS_VERSION,
480 'installed' => time(), // when was this installed.
481 );
482 $this->internal_options = get_option( ADVADS_SLUG . '-internal', array() );
483
484 // save defaults.
485 if ( array() === $this->internal_options ) {
486 $this->internal_options = $defaults;
487 $this->update_internal_options( $this->internal_options );
488
489 self::get_instance()->create_capabilities();
490 }
491
492 // for versions installed prior to 1.5.3 set installed date for now.
493 if ( ! isset( $this->internal_options['installed'] ) ) {
494 $this->internal_options['installed'] = time();
495 $this->update_internal_options( $this->internal_options );
496 }
497 }
498
499 return $this->internal_options;
500 }
501
502 /**
503 * Update internal plugin options
504 *
505 * @param array $options new internal options.
506 */
507 public function update_internal_options( array $options ) {
508 // do not allow to clear options.
509 if ( array() === $options ) {
510 return;
511 }
512
513 $this->internal_options = $options;
514 update_option( ADVADS_SLUG . '-internal', $options );
515 }
516
517 /**
518 * Get prefix used for frontend elements
519 */
520 public function get_frontend_prefix() {
521 if ( ! $this->frontend_prefix ) {
522 $options = $this->options();
523
524 if ( ! isset( $options['front-prefix'] ) ) {
525 if ( isset( $options['id-prefix'] ) ) {
526 // deprecated: keeps widgets working that previously received an id based on the front-prefix.
527 $frontend_prefix = esc_attr( $options['id-prefix'] );
528 } else {
529 $host = parse_url( get_home_url(), PHP_URL_HOST );
530 $frontend_prefix = preg_match( '/[A-Za-z][A-Za-z0-9_]{4}/', $host, $result ) ? $result[0] . '-' : self::DEFAULT_FRONTEND_PREFIX;
531 }
532 } else {
533 $frontend_prefix = esc_attr( $options['front-prefix'] );
534 }
535 /**
536 * Applying the filter here makes sure that it is the same frontend prefix for all
537 * calls on this page impression
538 */
539 $this->frontend_prefix = apply_filters( 'advanced-ads-frontend-prefix', $frontend_prefix );
540 }
541
542 return $this->frontend_prefix;
543 }
544
545 /**
546 * Get priority used for injection inside content
547 */
548 public function get_content_injection_priority() {
549 $options = $this->options();
550
551 return isset( $options['content-injection-priority'] ) ? intval( $options['content-injection-priority'] ) : 100;
552 }
553
554 /**
555 * Returns the capability needed to perform an action
556 *
557 * @param string $capability a capability to check, can be internal to Advanced Ads.
558 *
559 * @return string $capability a valid WordPress capability.
560 */
561 public static function user_cap( $capability = 'manage_options' ) {
562
563 global $advanced_ads_capabilities;
564
565 // admins can do everything.
566 // is also a fallback if no option or more specific capability is given.
567 if ( current_user_can( 'manage_options' ) ) {
568 return 'manage_options';
569 }
570
571 return apply_filters( 'advanced-ads-capability', $capability );
572 }
573
574 /**
575 * Create roles and capabilities
576 */
577 public function create_capabilities() {
578 if ( $role = get_role( 'administrator' ) ) {
579 $role->add_cap( 'advanced_ads_manage_options' );
580 $role->add_cap( 'advanced_ads_see_interface' );
581 $role->add_cap( 'advanced_ads_edit_ads' );
582 $role->add_cap( 'advanced_ads_manage_placements' );
583 $role->add_cap( 'advanced_ads_place_ads' );
584 }
585 }
586
587 /**
588 * Remove roles and capabilities
589 */
590 public function remove_capabilities() {
591 if ( $role = get_role( 'administrator' ) ) {
592 $role->remove_cap( 'advanced_ads_manage_options' );
593 $role->remove_cap( 'advanced_ads_see_interface' );
594 $role->remove_cap( 'advanced_ads_edit_ads' );
595 $role->remove_cap( 'advanced_ads_manage_placements' );
596 $role->remove_cap( 'advanced_ads_place_ads' );
597 }
598 }
599
600 /**
601 * Fired when the plugin is uninstalled.
602 */
603 public static function uninstall() {
604 $advads_options = Advanced_Ads::get_instance()->options();
605
606 if ( ! empty( $advads_options['uninstall-delete-data'] ) ) {
607 global $wpdb;
608 $main_blog_id = $wpdb->blogid;
609
610 Advanced_Ads::get_instance()->create_post_types();
611
612 if ( ! is_multisite() ) {
613 self::get_instance()->uninstall_single();
614 } else {
615 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
616
617 foreach ( $blog_ids as $blog_id ) {
618 switch_to_blog( $blog_id );
619 self::get_instance()->uninstall_single();
620 }
621 switch_to_blog( $main_blog_id );
622 }
623
624 // Delete assets (main blog).
625 Advanced_Ads_Ad_Blocker_Admin::get_instance()->clear_assets();
626 delete_option( ADVADS_AB_SLUG );
627 }
628
629 }
630
631 /**
632 * Fired for each blog when the plugin is uninstalled.
633 */
634 protected function uninstall_single() {
635 global $wpdb;
636
637 // Ads.
638 $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", Advanced_Ads::POST_TYPE_SLUG ) );
639
640 if ( $post_ids ) {
641 $wpdb->delete(
642 $wpdb->posts,
643 array( 'post_type' => Advanced_Ads::POST_TYPE_SLUG ),
644 array( '%s' )
645 );
646
647 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN( %s )", implode( ',', $post_ids ) ) );
648 }
649
650 // Groups.
651 $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 ) );
652
653 foreach ( $term_ids as $term_id ) {
654 wp_delete_term( $term_id, Advanced_Ads::AD_GROUP_TAXONOMY );
655 }
656
657 delete_option( 'advads-ad-groups' );
658 delete_option( Advanced_Ads::AD_GROUP_TAXONOMY . '_children' );
659 delete_option( 'advads-ad-weights' );
660
661 // Placements.
662 delete_option( 'advads-ads-placements' );
663
664 // User metadata.
665 delete_metadata( 'user', null, 'advanced-ads-hide-wizard', '', true );
666 delete_metadata( 'user', null, 'advanced-ads-subscribed', '', true );
667
668 // Post metadata.
669 delete_metadata( 'post', null, '_advads_ad_settings', '', true );
670
671 // Transients.
672 delete_transient( ADVADS_SLUG . '_add-on-updates-checked' );
673
674 delete_option( GADSENSE_OPT_NAME );
675 delete_option( ADVADS_SLUG );
676 delete_option( ADVADS_SLUG . '-internal' );
677 delete_option( ADVADS_SLUG . '-notices' );
678
679 // Widget.
680 $base_widget_id = Advanced_Ads_Widget::get_base_id();
681 delete_option( 'widget_' . $base_widget_id );
682
683 do_action( 'advanced-ads-uninstall' );
684
685 wp_cache_flush();
686 }
687
688 /**
689 * Check if any add-on is activated
690 *
691 * @return bool true if there is any add-on activated
692 */
693 public static function any_activated_add_on() {
694 return ( defined( 'AAP_VERSION' ) // Advanced Ads Pro.
695 || defined( 'AASA_VERSION' ) // Selling Ads.
696 || defined( 'AAT_VERSION' ) // Tracking.
697 || defined( 'AASADS_VERSION' ) // Sticky Ads.
698 || defined( 'AAR_VERSION' ) // Responsive Ads.
699 || defined( 'AAPLDS_VERSION' ) // PopUp and Layer Ads.
700 || defined( 'AAGT_SLUG' ) // Geo-Targeting.
701 );
702 }
703
704 /**
705 * Get the correct support URL: wp.org for free users and website for those with any add-on installed
706 *
707 * @param string $utm add UTM parameter to the link leading to https://wpadvancedads.com, if given.
708 *
709 * @return string URL.
710 */
711 public static function support_url( $utm = '' ) {
712
713 $utm = empty( $utm ) ? '#utm_source=advanced-ads&utm_medium=link&utm_campaign=support' : $utm;
714 if ( self::any_activated_add_on() ) {
715 $url = ADVADS_URL . 'support/' . $utm . '-with-addons';
716 } else {
717 $url = ADVADS_URL . 'support/' . $utm . '-free-user';
718 }
719
720 return $url;
721 }
722
723 /**
724 * Create a random group
725 *
726 * @param string $url optional parameter.
727 * @param string $ex group.
728 *
729 * @return bool
730 */
731 public static function get_group_by_url( $url = '', $ex = 'a' ) {
732
733 $url = self::get_short_url( $url );
734
735 $code = intval( substr( md5( $url ), - 1 ), 16 );
736
737 switch ( $ex ) {
738 case 'b':
739 return ( $code & 2 ) >> 1; // returns 1 or 0.
740 case 'c':
741 return ( $code & 4 ) >> 2; // returns 1 or 0.
742 case 'd':
743 return ( $code & 8 ) >> 3; // returns 1 or 0.
744 default:
745 return $code & 1; // returns 1 or 0.
746 }
747 }
748
749 /**
750 * Check if user started after a given date
751 *
752 * @param integer $timestamp time stamp.
753 *
754 * @return bool true if user is added after timestamp.
755 */
756 public static function is_new_user( $timestamp = 0 ) {
757
758 // allow admins to see version for new users in any case.
759 if ( current_user_can( self::user_cap( 'advanced_ads_manage_options' ) )
760 && isset( $_REQUEST['advads-ignore-timestamp'] ) ) {
761 return true;
762 }
763
764 $timestamp = absint( $timestamp );
765
766 $options = self::get_instance()->internal_options();
767 $installed = isset( $options['installed'] ) ? $options['installed'] : 0;
768
769 return ( $installed >= $timestamp );
770 }
771
772 /**
773 * Show stuff to new users only.
774 *
775 * @param integer $timestamp time after which to show whatever.
776 * @param string $group optional group.
777 *
778 * @return bool true if user enabled after given timestamp.
779 */
780 public static function show_to_new_users( $timestamp, $group = 'a' ) {
781
782 return ( self::get_group_by_url( null, $group ) && self::is_new_user( $timestamp ) );
783 }
784
785 /**
786 * Get short version of home_url()
787 * remove protocol and www
788 * remove slash
789 *
790 * @param string $url URL to be shortened.
791 *
792 * @return string
793 */
794 public static function get_short_url( $url = '' ) {
795
796 $url = empty( $url ) ? home_url() : $url;
797
798 // strip protocols.
799 if ( preg_match( '/^(\w[\w\d]*:\/\/)?(www\.)?(.*)$/', trim( $url ), $matches ) ) {
800 $url = $matches[3];
801 }
802
803 // strip slashes.
804 $url = trim( $url, '/' );
805
806 return $url;
807 }
808 }
809