PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.25.1
Advanced Ads – Ad Manager & AdSense v1.25.1
2.0.23 2.0.22 2.0.21 1.38.0 1.39.0 1.39.1 1.39.2 1.39.3 1.39.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.40.0 1.40.1 1.40.2 1.41.0 1.42.0 1.42.1 1.42.2 1.43.0 1.44.0 1.44.1 1.45.0 1.45.1 1.46.0 1.47.0 1.47.1 1.47.2 1.47.3 1.47.4 1.47.5 1.48.0 1.48.1 1.49.0 1.5.0 1.5.0.1 1.5.1 1.5.2 1.5.2.1 1.5.4 1.5.4.1 1.5.5 1.50.0 1.51.0 1.51.1 1.51.2 1.51.3 1.52.0 1.52.1 1.52.2 1.52.3 1.52.4 1.53.0 1.53.1 1.53.2 1.54.0 1.54.1 1.55.0 1.56.0 1.56.1 1.56.2 1.56.3 1.56.4 1.6 1.6.1 1.6.10 1.6.10.1 1.6.10.2 1.6.11 1.6.11.1 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.17.1 1.6.17.2 1.6.2 1.6.2.1 1.6.3 1.6.4 1.6.4.1 1.6.5 1.6.6 1.6.6.1 1.6.7 1.6.7.1 1.6.8 1.6.8.1 1.6.8.2 1.6.8.3 1.6.9 1.6.9.1 1.6.9.2 1.6.9.3 1.6.9.4 1.7 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.1.1 1.7.1.2 1.7.1.3 1.7.1.4 1.7.1.5 1.7.10 trunk 1.7.11 1.0.1 1.7.12 1.0.2 1.7.13 1.0.3 1.7.14 1.1.0 1.7.15 1.1.1 1.7.16 1.1.2 1.7.17 1.1.3 1.7.18 1.10 1.7.19 1.10.1 1.7.2 1.10.10 1.7.2.1 1.10.11 1.7.20 1.10.12 1.7.21 1.10.2 1.7.22 1.10.3 1.7.23 1.10.4 1.7.24 1.10.5 1.7.25 1.10.6 1.7.3 1.10.7 1.7.4 1.10.8 1.7.4.1 1.10.9 1.7.4.2 1.11 1.7.4.3 1.11.1 1.7.4.4 1.11.2 1.7.4.5 1.12 1.7.5 1.13 1.7.5.1 1.13.1 1.7.6 1.13.2 1.7.7 1.13.3 1.7.8 1.13.4 1.7.9 1.13.5 1.7.9.1 1.13.6 1.7.9.2 1.13.7 1.7.9.3 1.13.8 1.8 1.14 1.8.1 1.14.1 1.8.10 1.14.10 1.8.11 1.14.11 1.8.12 1.14.2 1.8.13 1.14.3 1.8.14 1.14.4 1.8.15 1.14.5 1.8.16 1.14.6 1.8.17 1.14.7 1.8.18 1.14.8 1.8.19 1.14.9 1.8.2 1.15 1.8.20 1.16 1.8.21 1.16.1 1.8.22 1.17 1.8.23 1.17.1 1.8.24 1.17.10 1.8.25 1.17.10-rc.1 1.8.26 1.17.11 1.8.27 1.17.12 1.8.28 1.17.12-rc.1 1.8.29 1.17.2 1.8.3 1.17.3 1.8.30 1.17.4 1.8.4 1.17.5 1.8.5 1.17.6 1.8.6 1.17.7 1.8.7 1.17.8 1.8.8 1.17.9 1.8.9 1.17.9-beta.1 1.9 1.18.0 2.0.0 1.19.0 2.0.1 1.19.1 2.0.10 1.2 2.0.11 1.2.1 2.0.12 1.2.2 2.0.13 1.2.3 2.0.14 1.2.4 2.0.15 1.2.5 2.0.16 1.2.6 2.0.17 1.2.7 2.0.18 1.20.0 2.0.19 1.20.0-rc.1 2.0.2 1.20.0-rc.2 2.0.20 1.20.1 2.0.3 1.20.2 2.0.4 1.20.3 2.0.5 1.21.0 2.0.6 1.21.1 2.0.7 1.22.0 2.0.8 1.22.1 2.0.9 1.22.2 1.23.0 1.23.1 1.23.2 1.24.0 1.24.1 1.24.2 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.29.0 1.29.1 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.30.0 1.30.1 1.30.2 1.30.2-rc.1 1.30.3 1.30.4 1.30.4-rc.1 1.30.5 1.31.0 1.31.1 1.32.0 1.32.0-rc.1 1.33.0 1.33.1 1.33.2 1.34.0 1.35.0 1.35.1 1.36.0 1.36.1 1.36.2 1.36.3 1.37.0 1.37.1 1.37.2
advanced-ads / classes / plugin.php
advanced-ads / classes Last commit date
EDD_SL_Plugin_Updater.php 5 years ago ad-ajax.php 5 years ago ad-debug.php 6 years ago ad-health-notices.php 5 years ago ad-model.php 5 years ago ad-select.php 9 years ago ad.php 5 years ago ad_ajax_callbacks.php 5 years ago ad_group.php 5 years ago ad_placements.php 5 years ago ad_type_abstract.php 5 years ago ad_type_content.php 5 years ago ad_type_dummy.php 5 years ago ad_type_group.php 5 years ago ad_type_image.php 5 years ago ad_type_plain.php 5 years ago checks.php 5 years ago compatibility.php 5 years ago display-conditions.php 5 years ago filesystem.php 8 years ago frontend-notices.php 6 years ago frontend_checks.php 5 years ago inline-css.php 5 years ago plugin.php 5 years ago upgrades.php 6 years ago utils.php 5 years ago visitor-conditions.php 6 years ago widget.php 6 years ago
plugin.php
883 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 // Call action hooks for ad status changes.
115 add_action(
116 'transition_post_status',
117 array(
118 $this,
119 'transition_ad_status',
120 ),
121 10,
122 3
123 );
124
125 // load display conditions.
126 Advanced_Ads_Display_Conditions::get_instance();
127 new Advanced_Ads_Frontend_Checks();
128 new Advanced_Ads_Compatibility();
129 Advanced_Ads_Ad_Health_Notices::get_instance(); // load to fetch notices.
130 }
131
132 /**
133 * Run upgrades.
134 *
135 * Compatibility with the Piklist plugin that has a function hooked to `posts_where` that access $GLOBALS['wp_query'].
136 * Since `Advanced_Ads_Upgrades` applies `posts_where`: (`Advanced_Ads_Admin_Notices::get_instance()` >
137 * `Advanced_Ads::get_number_of_ads()` > new WP_Query > ... 'posts_where') this function is hooked to `init` so that `$GLOBALS['wp_query']` is instantiated.
138 */
139 public function run_upgrades() {
140 /**
141 * Run upgrades, if this is a new version or version does not exist.
142 */
143 $internal_options = $this->internal_options();
144
145 if ( ! defined( 'DOING_AJAX' ) && ( ! isset( $internal_options['version'] ) || version_compare( $internal_options['version'], ADVADS_VERSION, '<' ) ) ) {
146 new Advanced_Ads_Upgrades();
147 }
148 }
149
150 /**
151 * Register and enqueue public-facing style sheet.
152 */
153 public function enqueue_styles() {
154 // wp_enqueue_style( $this->get_plugin_slug() . '-plugin-styles', plugins_url('assets/css/public.css', __FILE__), array(), ADVADS_VERSION);
155 }
156
157 /**
158 * Return the plugin slug.
159 *
160 * @return string plugin slug variable.
161 */
162 public function get_plugin_slug() {
163 return ADVADS_SLUG;
164 }
165
166 /**
167 * Register and enqueues public-facing JavaScript files.
168 */
169 public function enqueue_scripts() {
170 if ( advads_is_amp() ) {
171 return;
172 }
173 // wp_enqueue_script( $this->get_plugin_slug() . '-plugin-script', plugins_url('assets/js/public.js', __FILE__), array('jquery'), ADVADS_VERSION);
174 $activated_js = apply_filters( 'advanced-ads-activate-advanced-js', isset( $this->options()['advanced-js'] ) );
175
176 if ( $activated_js || ! empty( $_COOKIE['advads_frontend_picker'] ) ) {
177 wp_enqueue_script(
178 $this->get_plugin_slug() . '-advanced-js',
179 sprintf( '%spublic/assets/js/advanced%s.js', ADVADS_BASE_URL, defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min' ),
180 array( 'jquery' ),
181 ADVADS_VERSION,
182 false
183 );
184
185 $privacy = Advanced_Ads_Privacy::get_instance();
186 $privacy_options = $privacy->options();
187 $privacy_options['enabled'] = ! empty( $privacy_options['enabled'] );
188 $privacy_options['state'] = $privacy->get_state();
189
190 $data = array(
191 'blog_id' => get_current_blog_id(),
192 'privacy' => $privacy_options,
193 );
194
195 wp_localize_script( $this->get_plugin_slug() . '-advanced-js', 'advads_options', $data );
196 }
197 }
198
199 /**
200 * Print public-facing JavaScript in the HTML head.
201 */
202 public function print_head_scripts() {
203 /**
204 * Usage example in add-ons:
205 * ( window.advanced_ads_ready || jQuery( document ).ready ).call( null, function() {
206 * // Called when DOM is ready.
207 * } );
208 */
209
210 $short_url = self::get_short_url();
211 $attribution = '<!-- ' . $short_url . ' is managing ads with Advanced Ads%1$s%2$s -->';
212 $version = self::is_new_user( 1585224000 ) ? ' ' . ADVADS_VERSION : '';
213 $plugin_url = self::get_group_by_url( $short_url, 'a' ) ? '' . ADVADS_URL : '';
214 // escaping would break HTML comment tags so we disable checks here.
215 // phpcs:ignore
216 echo apply_filters( 'advanced-ads-attribution', sprintf( $attribution, $version, $plugin_url ) );
217
218 if ( advads_is_amp() ) {
219 return;
220 }
221
222 ob_start();
223 ?>
224 <script>
225 <?php
226 readfile( sprintf(
227 '%spublic/assets/js/ready%s.js',
228 ADVADS_BASE_PATH,
229 defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'
230 ) );
231 ?>
232 </script>
233 <?php
234 // escaping would break our HTML here.
235 // phpcs:ignore
236 echo Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
237
238 }
239
240 /**
241 * Register the Advanced Ads widget
242 */
243 public function widget_init() {
244 register_widget( 'Advanced_Ads_Widget' );
245 }
246
247 /**
248 * Fired when a new site is activated with a WPMU environment.
249 *
250 * @param int $blog_id ID of the new blog.
251 */
252 public function activate_new_site( $blog_id ) {
253
254 if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
255 return;
256 }
257
258 switch_to_blog( $blog_id );
259 $this->single_activate();
260 restore_current_blog();
261 }
262
263 /**
264 * Fired for each blog when the plugin is activated.
265 */
266 protected function single_activate() {
267 // $this->post_types_rewrite_flush();
268 // -TODO inform modules
269 $this->create_capabilities();
270 }
271
272 /**
273 * Fired for each blog when the plugin is deactivated.
274 */
275 protected function single_deactivate() {
276 // -TODO inform modules
277 $this->remove_capabilities();
278 }
279
280 /**
281 * Load the plugin text domain for translation.
282 */
283 public function load_plugin_textdomain() {
284 load_plugin_textdomain( 'advanced-ads', false, ADVADS_BASE_DIR . '/languages' );
285 }
286
287 /**
288 * Fired when the plugin is activated.
289 *
290 * @param boolean $network_wide True if WPMU superadmin uses
291 * "Network Activate" action, false if
292 * WPMU is disabled or plugin is
293 * activated on an individual blog.
294 */
295 public function activate( $network_wide ) {
296 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
297
298 if ( $network_wide ) {
299 // get all blog ids.
300 global $wpdb;
301 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
302 $original_blog_id = $wpdb->blogid;
303
304 foreach ( $blog_ids as $blog_id ) {
305 switch_to_blog( $blog_id );
306 $this->single_activate();
307 }
308
309 switch_to_blog( $original_blog_id );
310 } else {
311 $this->single_activate();
312 }
313 } else {
314 $this->single_activate();
315 }
316 }
317
318 /**
319 * Fired when the plugin is deactivated.
320 *
321 * @param boolean $network_wide true if Advanced Ads should be disabled network-wide.
322 *
323 * True if WPMU superadmin uses
324 * "Network Deactivate" action, false if
325 * WPMU is disabled or plugin is
326 * deactivated on an individual blog.
327 */
328 public function deactivate( $network_wide ) {
329 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
330
331 if ( $network_wide ) {
332 // get all blog ids.
333 global $wpdb;
334 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
335 $original_blog_id = $wpdb->blogid;
336
337 foreach ( $blog_ids as $blog_id ) {
338 switch_to_blog( $blog_id );
339 $this->single_deactivate();
340 }
341
342 switch_to_blog( $original_blog_id );
343 } else {
344 $this->single_deactivate();
345 }
346 } else {
347 $this->single_deactivate();
348 }
349 }
350
351 /**
352 * Remove WP tag edit page for the ad group taxonomy
353 * needed, because we can’t remove it with `show_ui` without also removing the meta box
354 */
355 public function remove_taxonomy_menu_item() {
356 remove_submenu_page( 'edit.php?post_type=advanced_ads', 'edit-tags.php?taxonomy=advanced_ads_groups&amp;post_type=advanced_ads' );
357 }
358
359 /**
360 * Shortcode to include ad in frontend
361 *
362 * @param array $atts shortcode attributes.
363 *
364 * @return string ad content.
365 */
366 public function shortcode_display_ad( $atts ) {
367 $atts = is_array( $atts ) ? $atts : array();
368 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
369 $atts = $this->prepare_shortcode_atts( $atts );
370
371 // use the public available function here.
372 return get_ad( $id, $atts );
373 }
374
375 /**
376 * Shortcode to include ad from an ad group in frontend
377 *
378 * @param array $atts shortcode attributes.
379 *
380 * @return string ad group content.
381 */
382 public function shortcode_display_ad_group( $atts ) {
383 $atts = is_array( $atts ) ? $atts : array();
384 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
385 $atts = $this->prepare_shortcode_atts( $atts );
386
387 // use the public available function here.
388 return get_ad_group( $id, $atts );
389 }
390
391 /**
392 * Shortcode to display content of an ad placement in frontend
393 *
394 * @param array $atts shortcode attributes.
395 *
396 * @return string ad placement content.
397 */
398 public function shortcode_display_ad_placement( $atts ) {
399 $atts = is_array( $atts ) ? $atts : array();
400 $id = isset( $atts['id'] ) ? (string) $atts['id'] : '';
401 $atts = $this->prepare_shortcode_atts( $atts );
402
403 // use the public available function here.
404 return get_ad_placement( $id, $atts );
405 }
406
407 /**
408 * Prepare shortcode attributes.
409 *
410 * @param array $atts array with strings.
411 *
412 * @return array
413 */
414 private function prepare_shortcode_atts( $atts ) {
415 $result = array();
416
417 /**
418 * Prepare attributes by converting strings to multi-dimensional array
419 * Example: [ 'output__margin__top' => 1 ] => ['output']['margin']['top'] = 1
420 */
421 if ( ! defined( 'ADVANCED_ADS_DISABLE_CHANGE' ) || ! ADVANCED_ADS_DISABLE_CHANGE ) {
422 foreach ( $atts as $attr => $data ) {
423 $levels = explode( '__', $attr );
424 $last = array_pop( $levels );
425
426 $cur_lvl = &$result;
427
428 foreach ( $levels as $lvl ) {
429 if ( ! isset( $cur_lvl[ $lvl ] ) ) {
430 $cur_lvl[ $lvl ] = array();
431 }
432
433 $cur_lvl = &$cur_lvl[ $lvl ];
434 }
435
436 $cur_lvl[ $last ] = $data;
437 }
438
439 $result = array_diff_key(
440 $result,
441 array(
442 'id' => false,
443 'blog_id' => false,
444 'ad_args' => false,
445 )
446 );
447 }
448
449 // Ad type: 'content' and a shortcode inside.
450 if ( isset( $atts['ad_args'] ) ) {
451 $result = array_merge( $result, json_decode( urldecode( $atts['ad_args'] ), true ) );
452
453 }
454
455 return $result;
456 }
457
458 /**
459 * Return plugin options
460 * these are the options updated by the user
461 *
462 * @return array $options
463 */
464 public function options() {
465 // we can’t store options if WPML String Translations is enabled, or it would not translate the "Ad Label" option.
466 if ( ! isset( $this->options ) || class_exists( 'WPML_ST_String' ) ) {
467 $this->options = get_option( ADVADS_SLUG, array() );
468 }
469
470 // allow to change options dynamically
471 $this->options = apply_filters( 'advanced-ads-options', $this->options );
472
473 return $this->options;
474 }
475
476 /**
477 * Update plugin options (not for settings page, but if automatic options are needed)
478 *
479 * @param array $options new options.
480 */
481 public function update_options( array $options ) {
482 // do not allow to clear options.
483 if ( array() === $options ) {
484 return;
485 }
486
487 $this->options = $options;
488 update_option( ADVADS_SLUG, $options );
489 }
490
491 /**
492 * Return internal plugin options
493 * these are options set by the plugin
494 *
495 * @return array $options
496 */
497 public function internal_options() {
498 if ( ! isset( $this->internal_options ) ) {
499 $defaults = array(
500 'version' => ADVADS_VERSION,
501 'installed' => time(), // when was this installed.
502 );
503 $this->internal_options = get_option( ADVADS_SLUG . '-internal', array() );
504
505 // save defaults.
506 if ( array() === $this->internal_options ) {
507 $this->internal_options = $defaults;
508 $this->update_internal_options( $this->internal_options );
509
510 self::get_instance()->create_capabilities();
511 }
512
513 // for versions installed prior to 1.5.3 set installed date for now.
514 if ( ! isset( $this->internal_options['installed'] ) ) {
515 $this->internal_options['installed'] = time();
516 $this->update_internal_options( $this->internal_options );
517 }
518 }
519
520 return $this->internal_options;
521 }
522
523 /**
524 * Update internal plugin options
525 *
526 * @param array $options new internal options.
527 */
528 public function update_internal_options( array $options ) {
529 // do not allow to clear options.
530 if ( array() === $options ) {
531 return;
532 }
533
534 $this->internal_options = $options;
535 update_option( ADVADS_SLUG . '-internal', $options );
536 }
537
538 /**
539 * Get prefix used for frontend elements
540 */
541 public function get_frontend_prefix() {
542 if ( ! $this->frontend_prefix ) {
543 $options = $this->options();
544
545 if ( ! isset( $options['front-prefix'] ) ) {
546 if ( isset( $options['id-prefix'] ) ) {
547 // deprecated: keeps widgets working that previously received an id based on the front-prefix.
548 $frontend_prefix = esc_attr( $options['id-prefix'] );
549 } else {
550 $host = parse_url( get_home_url(), PHP_URL_HOST );
551 $frontend_prefix = preg_match( '/[A-Za-z][A-Za-z0-9_]{4}/', $host, $result ) ? $result[0] . '-' : self::DEFAULT_FRONTEND_PREFIX;
552 }
553 } else {
554 $frontend_prefix = esc_attr( $options['front-prefix'] );
555 }
556 /**
557 * Applying the filter here makes sure that it is the same frontend prefix for all
558 * calls on this page impression
559 */
560 $this->frontend_prefix = apply_filters( 'advanced-ads-frontend-prefix', $frontend_prefix );
561 }
562
563 return $this->frontend_prefix;
564 }
565
566 /**
567 * Get priority used for injection inside content
568 */
569 public function get_content_injection_priority() {
570 $options = $this->options();
571
572 return isset( $options['content-injection-priority'] ) ? (int) $options['content-injection-priority'] : 100;
573 }
574
575 /**
576 * Returns the capability needed to perform an action
577 *
578 * @param string $capability a capability to check, can be internal to Advanced Ads.
579 *
580 * @return string $capability a valid WordPress capability.
581 */
582 public static function user_cap( $capability = 'manage_options' ) {
583
584 global $advanced_ads_capabilities;
585
586 // admins can do everything.
587 // is also a fallback if no option or more specific capability is given.
588 if ( current_user_can( 'manage_options' ) ) {
589 return 'manage_options';
590 }
591
592 return apply_filters( 'advanced-ads-capability', $capability );
593 }
594
595 /**
596 * Create roles and capabilities
597 */
598 public function create_capabilities() {
599 if ( $role = get_role( 'administrator' ) ) {
600 $role->add_cap( 'advanced_ads_manage_options' );
601 $role->add_cap( 'advanced_ads_see_interface' );
602 $role->add_cap( 'advanced_ads_edit_ads' );
603 $role->add_cap( 'advanced_ads_manage_placements' );
604 $role->add_cap( 'advanced_ads_place_ads' );
605 }
606 }
607
608 /**
609 * Remove roles and capabilities
610 */
611 public function remove_capabilities() {
612 if ( $role = get_role( 'administrator' ) ) {
613 $role->remove_cap( 'advanced_ads_manage_options' );
614 $role->remove_cap( 'advanced_ads_see_interface' );
615 $role->remove_cap( 'advanced_ads_edit_ads' );
616 $role->remove_cap( 'advanced_ads_manage_placements' );
617 $role->remove_cap( 'advanced_ads_place_ads' );
618 }
619 }
620
621 /**
622 * Fired when the plugin is uninstalled.
623 */
624 public static function uninstall() {
625 $advads_options = Advanced_Ads::get_instance()->options();
626
627 if ( ! empty( $advads_options['uninstall-delete-data'] ) ) {
628 global $wpdb;
629 $main_blog_id = $wpdb->blogid;
630
631 Advanced_Ads::get_instance()->create_post_types();
632
633 if ( ! is_multisite() ) {
634 self::get_instance()->uninstall_single();
635 } else {
636 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
637
638 foreach ( $blog_ids as $blog_id ) {
639 switch_to_blog( $blog_id );
640 self::get_instance()->uninstall_single();
641 }
642 switch_to_blog( $main_blog_id );
643 }
644
645 // Delete assets (main blog).
646 Advanced_Ads_Ad_Blocker_Admin::get_instance()->clear_assets();
647 delete_option( ADVADS_AB_SLUG );
648 }
649
650 }
651
652 /**
653 * Fired for each blog when the plugin is uninstalled.
654 */
655 protected function uninstall_single() {
656 global $wpdb;
657
658 // Ads.
659 $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", Advanced_Ads::POST_TYPE_SLUG ) );
660
661 if ( $post_ids ) {
662 $wpdb->delete(
663 $wpdb->posts,
664 array( 'post_type' => Advanced_Ads::POST_TYPE_SLUG ),
665 array( '%s' )
666 );
667
668 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN( %s )", implode( ',', $post_ids ) ) );
669 }
670
671 // Groups.
672 $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 ) );
673
674 foreach ( $term_ids as $term_id ) {
675 wp_delete_term( $term_id, Advanced_Ads::AD_GROUP_TAXONOMY );
676 }
677
678 delete_option( 'advads-ad-groups' );
679 delete_option( Advanced_Ads::AD_GROUP_TAXONOMY . '_children' );
680 delete_option( 'advads-ad-weights' );
681
682 // Placements.
683 delete_option( 'advads-ads-placements' );
684
685 // User metadata.
686 delete_metadata( 'user', null, 'advanced-ads-hide-wizard', '', true );
687 delete_metadata( 'user', null, 'advanced-ads-subscribed', '', true );
688
689 // Post metadata.
690 delete_metadata( 'post', null, '_advads_ad_settings', '', true );
691
692 // Transients.
693 delete_transient( ADVADS_SLUG . '_add-on-updates-checked' );
694
695 delete_option( GADSENSE_OPT_NAME );
696 delete_option( ADVADS_SLUG );
697 delete_option( ADVADS_SLUG . '-internal' );
698 delete_option( ADVADS_SLUG . '-notices' );
699
700 // Widget.
701 $base_widget_id = Advanced_Ads_Widget::get_base_id();
702 delete_option( 'widget_' . $base_widget_id );
703
704 do_action( 'advanced-ads-uninstall' );
705
706 wp_cache_flush();
707 }
708
709 /**
710 * Check if any add-on is activated
711 *
712 * @return bool true if there is any add-on activated
713 */
714 public static function any_activated_add_on() {
715 return ( defined( 'AAP_VERSION' ) // Advanced Ads Pro.
716 || defined( 'AAGAM_VERSION' ) // Google Ad Manager.
717 || defined( 'AASA_VERSION' ) // Selling Ads.
718 || defined( 'AAT_VERSION' ) // Tracking.
719 || defined( 'AASADS_VERSION' ) // Sticky Ads.
720 || defined( 'AAR_VERSION' ) // Responsive Ads.
721 || defined( 'AAPLDS_VERSION' ) // PopUp and Layer Ads.
722 || defined( 'AAGT_SLUG' ) // Geo-Targeting.
723 );
724 }
725
726 /**
727 * Get the correct support URL: wp.org for free users and website for those with any add-on installed
728 *
729 * @param string $utm add UTM parameter to the link leading to https://wpadvancedads.com, if given.
730 *
731 * @return string URL.
732 */
733 public static function support_url( $utm = '' ) {
734
735 $utm = empty( $utm ) ? '#utm_source=advanced-ads&utm_medium=link&utm_campaign=support' : $utm;
736 if ( self::any_activated_add_on() ) {
737 $url = ADVADS_URL . 'support/' . $utm . '-with-addons';
738 } else {
739 $url = ADVADS_URL . 'support/' . $utm . '-free-user';
740 }
741
742 return $url;
743 }
744
745 /**
746 * Create a random group
747 *
748 * @param string $url optional parameter.
749 * @param string $ex group.
750 *
751 * @return bool
752 */
753 public static function get_group_by_url( $url = '', $ex = 'a' ) {
754
755 $url = self::get_short_url( $url );
756
757 $code = intval( substr( md5( $url ), - 1 ), 16 );
758
759 switch ( $ex ) {
760 case 'b':
761 return ( $code & 2 ) >> 1; // returns 1 or 0.
762 case 'c':
763 return ( $code & 4 ) >> 2; // returns 1 or 0.
764 case 'd':
765 return ( $code & 8 ) >> 3; // returns 1 or 0.
766 default:
767 return $code & 1; // returns 1 or 0.
768 }
769 }
770
771 /**
772 * Check if user started after a given date
773 *
774 * @param integer $timestamp time stamp.
775 *
776 * @return bool true if user is added after timestamp.
777 */
778 public static function is_new_user( $timestamp = 0 ) {
779
780 // allow admins to see version for new users in any case.
781 if ( current_user_can( self::user_cap( 'advanced_ads_manage_options' ) )
782 && isset( $_REQUEST['advads-ignore-timestamp'] ) ) {
783 return true;
784 }
785
786 $timestamp = absint( $timestamp );
787
788 $options = self::get_instance()->internal_options();
789 $installed = isset( $options['installed'] ) ? $options['installed'] : 0;
790
791 return ( $installed >= $timestamp );
792 }
793
794 /**
795 * Show stuff to new users only.
796 *
797 * @param integer $timestamp time after which to show whatever.
798 * @param string $group optional group.
799 *
800 * @return bool true if user enabled after given timestamp.
801 */
802 public static function show_to_new_users( $timestamp, $group = 'a' ) {
803
804 return ( self::get_group_by_url( null, $group ) && self::is_new_user( $timestamp ) );
805 }
806
807 /**
808 * Get short version of home_url()
809 * remove protocol and www
810 * remove slash
811 *
812 * @param string $url URL to be shortened.
813 *
814 * @return string
815 */
816 public static function get_short_url( $url = '' ) {
817
818 $url = empty( $url ) ? home_url() : $url;
819
820 // strip protocols.
821 if ( preg_match( '/^(\w[\w\d]*:\/\/)?(www\.)?(.*)$/', trim( $url ), $matches ) ) {
822 $url = $matches[3];
823 }
824
825 // strip slashes.
826 $url = trim( $url, '/' );
827
828 return $url;
829 }
830
831 /**
832 * Return Advanced Ads logo in base64 format for use in WP Admin menu.
833 *
834 * @return string
835 */
836 public static function get_icon_svg() {
837 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjEuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJFYmVuZV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDY0Ljk5MyA2NS4wMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDY0Ljk5MyA2NS4wMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIHN0eWxlPSJmaWxsOiNFNEU0RTQ7IiBkPSJNNDYuNTcxLDI3LjY0MXYyMy4xMzNIMTQuMjVWMTguNDUzaDIzLjExOGMtMC45NTYtMi4xODMtMS40OTQtNC41OS0xLjQ5NC03LjEyNg0KCWMwLTIuNTM1LDAuNTM4LTQuOTQyLDEuNDk0LTcuMTI0aC02Ljk1N0gwdjQ5LjQ5M2wxLjYxOCwxLjYxOEwwLDUzLjY5NmMwLDYuMjU2LDUuMDY4LDExLjMyNiwxMS4zMjQsMTEuMzI4djBoMTkuMDg3aDMwLjQxMlYyNy42MTENCgljLTIuMTkxLDAuOTY0LTQuNjA5LDEuNTA5LTcuMTU3LDEuNTA5QzUxLjE0MiwyOS4xMiw0OC43NDYsMjguNTg4LDQ2LjU3MSwyNy42NDF6Ii8+DQo8Y2lyY2xlIHN0eWxlPSJmaWxsOiM5ODk4OTg7IiBjeD0iNTMuNjY2IiBjeT0iMTEuMzI4IiByPSIxMS4zMjgiLz4NCjwvc3ZnPg0K';
838 }
839
840 /**
841 * Fires when a post is transitioned from one status to another.
842 *
843 * @param string $new_status New post status.
844 * @param string $old_status Old post status.
845 * @param WP_Post $post Post object.
846 */
847 public function transition_ad_status( $new_status, $old_status, $post ) {
848 if ( ! isset( $post->post_type ) || Advanced_Ads::POST_TYPE_SLUG !== $post->post_type || ! isset( $post->ID ) ) {
849 return;
850 }
851
852 $ad = new Advanced_Ads_Ad( $post->ID );
853
854 if ( $old_status !== $new_status ) {
855 /**
856 * Fires when an ad has transitioned from one status to another.
857 *
858 * @param Advanced_Ads_Ad $ad Ad object.
859 */
860 do_action( "advanced-ads-ad-status-{$old_status}-to-{$new_status}", $ad );
861 }
862
863 if ( 'publish' === $new_status && 'publish' !== $old_status ) {
864 /**
865 * Fires when an ad has transitioned from any other status to `publish`.
866 *
867 * @param Advanced_Ads_Ad $ad Ad object.
868 */
869 do_action( 'advanced-ads-ad-status-published', $ad );
870 }
871
872 if ( 'publish' === $old_status && 'publish' !== $new_status ) {
873 /**
874 * Fires when an ad has transitioned from `publish` to any other status.
875 *
876 * @param Advanced_Ads_Ad $ad Ad object.
877 */
878 do_action( 'advanced-ads-ad-status-unpublished', $ad );
879 }
880 }
881
882 }
883