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