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