PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.30.0
Advanced Ads – Ad Manager & AdSense v1.30.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 4 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 4 years ago ad_ajax_callbacks.php 5 years ago ad_group.php 4 years ago ad_placements.php 4 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 4 years ago checks.php 4 years ago compatibility.php 4 years ago display-conditions.php 4 years ago filesystem.php 8 years ago frontend-notices.php 6 years ago frontend_checks.php 4 years ago inline-css.php 4 years ago plugin.php 4 years ago upgrades.php 6 years ago utils.php 4 years ago visitor-conditions.php 4 years ago widget.php 4 years ago
plugin.php
901 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' ), 20 );
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 // higher priority to make sure other scripts are printed before.
104 add_action( 'wp_footer', array( $this, 'print_footer_scripts' ), 100 );
105
106 // add short codes.
107 add_shortcode( 'the_ad', array( $this, 'shortcode_display_ad' ) );
108 add_shortcode( 'the_ad_group', array( $this, 'shortcode_display_ad_group' ) );
109 add_shortcode( 'the_ad_placement', array( $this, 'shortcode_display_ad_placement' ) );
110
111 // remove default ad group menu item // -TODO only for admin.
112 add_action( 'admin_menu', array( $this, 'remove_taxonomy_menu_item' ) );
113 // load widgets.
114 add_action( 'widgets_init', array( $this, 'widget_init' ) );
115
116 // Call action hooks for ad status changes.
117 add_action(
118 'transition_post_status',
119 array(
120 $this,
121 'transition_ad_status',
122 ),
123 10,
124 3
125 );
126
127 // load display conditions.
128 Advanced_Ads_Display_Conditions::get_instance();
129 new Advanced_Ads_Frontend_Checks();
130 new Advanced_Ads_Compatibility();
131 Advanced_Ads_Ad_Health_Notices::get_instance(); // load to fetch notices.
132 }
133
134 /**
135 * Run upgrades.
136 *
137 * Compatibility with the Piklist plugin that has a function hooked to `posts_where` that access $GLOBALS['wp_query'].
138 * Since `Advanced_Ads_Upgrades` applies `posts_where`: (`Advanced_Ads_Admin_Notices::get_instance()` >
139 * `Advanced_Ads::get_number_of_ads()` > new WP_Query > ... 'posts_where') this function is hooked to `init` so that `$GLOBALS['wp_query']` is instantiated.
140 */
141 public function run_upgrades() {
142 /**
143 * Run upgrades, if this is a new version or version does not exist.
144 */
145 $internal_options = $this->internal_options();
146
147 if ( ! defined( 'DOING_AJAX' ) && ( ! isset( $internal_options['version'] ) || version_compare( $internal_options['version'], ADVADS_VERSION, '<' ) ) ) {
148 new Advanced_Ads_Upgrades();
149 }
150 }
151
152 /**
153 * Register and enqueue public-facing style sheet.
154 */
155 public function enqueue_styles() {
156 // wp_enqueue_style( $this->get_plugin_slug() . '-plugin-styles', plugins_url('assets/css/public.css', __FILE__), array(), ADVADS_VERSION);
157 }
158
159 /**
160 * Return the plugin slug.
161 *
162 * @return string plugin slug variable.
163 */
164 public function get_plugin_slug() {
165 return ADVADS_SLUG;
166 }
167
168 /**
169 * Register and enqueues public-facing JavaScript files.
170 */
171 public function enqueue_scripts() {
172 if ( advads_is_amp() ) {
173 return;
174 }
175 // wp_enqueue_script( $this->get_plugin_slug() . '-plugin-script', plugins_url('assets/js/public.js', __FILE__), array('jquery'), ADVADS_VERSION);
176 $activated_js = apply_filters( 'advanced-ads-activate-advanced-js', isset( $this->options()['advanced-js'] ) );
177
178 if ( $activated_js || ! empty( $_COOKIE['advads_frontend_picker'] ) ) {
179 wp_enqueue_script(
180 $this->get_plugin_slug() . '-advanced-js',
181 sprintf( '%spublic/assets/js/advanced%s.js', ADVADS_BASE_URL, defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min' ),
182 array( 'jquery' ),
183 ADVADS_VERSION,
184 false
185 );
186
187 $privacy = Advanced_Ads_Privacy::get_instance();
188 $privacy_options = $privacy->options();
189 $privacy_options['enabled'] = ! empty( $privacy_options['enabled'] );
190 $privacy_options['state'] = $privacy->get_state();
191
192 $data = array(
193 'blog_id' => get_current_blog_id(),
194 'privacy' => $privacy_options,
195 );
196
197 wp_localize_script( $this->get_plugin_slug() . '-advanced-js', 'advads_options', $data );
198 }
199 }
200
201 /**
202 * Print public-facing JavaScript in the HTML head.
203 */
204 public function print_head_scripts() {
205 $short_url = self::get_short_url();
206 $attribution = '<!-- ' . $short_url . ' is managing ads with Advanced Ads%1$s%2$s -->';
207 $version = self::is_new_user( 1585224000 ) ? ' ' . ADVADS_VERSION : '';
208 $plugin_url = self::get_group_by_url( $short_url, 'a' ) ? '' . ADVADS_URL : '';
209 // escaping would break HTML comment tags so we disable checks here.
210 // phpcs:ignore
211 echo apply_filters( 'advanced-ads-attribution', sprintf( $attribution, $version, $plugin_url ) );
212
213 if ( advads_is_amp() ) {
214 return;
215 }
216
217 ob_start();
218 ?>
219 <script id="<?php echo esc_attr( $this->get_frontend_prefix() ); ?>ready">
220 <?php
221 readfile( sprintf(
222 '%spublic/assets/js/ready%s.js',
223 ADVADS_BASE_PATH,
224 defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'
225 ) );
226 ?>
227 </script>
228 <?php
229 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- escaping would break the HTML
230 echo Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
231 }
232
233 /**
234 * Print inline scripts in wp_footer.
235 */
236 public function print_footer_scripts() {
237 if ( advads_is_amp() ) {
238 return;
239 }
240
241 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- escaping would break the HTML
242 echo Advanced_Ads_Utils::get_inline_asset(
243 // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- we're getting the contents of a local file
244 sprintf( '<script>%s</script>', file_get_contents( sprintf(
245 '%spublic/assets/js/ready-queue%s.js',
246 ADVADS_BASE_PATH,
247 defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'
248 ) ) )
249 );
250 }
251
252 /**
253 * Register the Advanced Ads widget
254 */
255 public function widget_init() {
256 register_widget( 'Advanced_Ads_Widget' );
257 }
258
259 /**
260 * Fired when a new site is activated with a WPMU environment.
261 *
262 * @param int $blog_id ID of the new blog.
263 */
264 public function activate_new_site( $blog_id ) {
265
266 if ( 1 !== did_action( 'wpmu_new_blog' ) ) {
267 return;
268 }
269
270 switch_to_blog( $blog_id );
271 $this->single_activate();
272 restore_current_blog();
273 }
274
275 /**
276 * Fired for each blog when the plugin is activated.
277 */
278 protected function single_activate() {
279 // $this->post_types_rewrite_flush();
280 // -TODO inform modules
281 $this->create_capabilities();
282 }
283
284 /**
285 * Fired for each blog when the plugin is deactivated.
286 */
287 protected function single_deactivate() {
288 // -TODO inform modules
289 $this->remove_capabilities();
290 }
291
292 /**
293 * Load the plugin text domain for translation.
294 */
295 public function load_plugin_textdomain() {
296 load_plugin_textdomain( 'advanced-ads', false, ADVADS_BASE_DIR . '/languages' );
297 }
298
299 /**
300 * Fired when the plugin is activated.
301 *
302 * @param boolean $network_wide True if WPMU superadmin uses
303 * "Network Activate" action, false if
304 * WPMU is disabled or plugin is
305 * activated on an individual blog.
306 */
307 public function activate( $network_wide ) {
308 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
309
310 if ( $network_wide ) {
311 // get all blog ids.
312 global $wpdb;
313 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
314 $original_blog_id = $wpdb->blogid;
315
316 foreach ( $blog_ids as $blog_id ) {
317 switch_to_blog( $blog_id );
318 $this->single_activate();
319 }
320
321 switch_to_blog( $original_blog_id );
322 } else {
323 $this->single_activate();
324 }
325 } else {
326 $this->single_activate();
327 }
328 }
329
330 /**
331 * Fired when the plugin is deactivated.
332 *
333 * @param boolean $network_wide true if Advanced Ads should be disabled network-wide.
334 *
335 * True if WPMU superadmin uses
336 * "Network Deactivate" action, false if
337 * WPMU is disabled or plugin is
338 * deactivated on an individual blog.
339 */
340 public function deactivate( $network_wide ) {
341 if ( function_exists( 'is_multisite' ) && is_multisite() ) {
342
343 if ( $network_wide ) {
344 // get all blog ids.
345 global $wpdb;
346 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
347 $original_blog_id = $wpdb->blogid;
348
349 foreach ( $blog_ids as $blog_id ) {
350 switch_to_blog( $blog_id );
351 $this->single_deactivate();
352 }
353
354 switch_to_blog( $original_blog_id );
355 } else {
356 $this->single_deactivate();
357 }
358 } else {
359 $this->single_deactivate();
360 }
361 }
362
363 /**
364 * Remove WP tag edit page for the ad group taxonomy
365 * needed, because we can’t remove it with `show_ui` without also removing the meta box
366 */
367 public function remove_taxonomy_menu_item() {
368 remove_submenu_page( 'edit.php?post_type=advanced_ads', 'edit-tags.php?taxonomy=advanced_ads_groups&amp;post_type=advanced_ads' );
369 }
370
371 /**
372 * Shortcode to include ad in frontend
373 *
374 * @param array $atts shortcode attributes.
375 *
376 * @return string ad content.
377 */
378 public function shortcode_display_ad( $atts ) {
379 $atts = is_array( $atts ) ? $atts : array();
380 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
381 // check if there is an inline attribute with or without value.
382 if ( isset( $atts['inline'] ) || in_array( 'inline', $atts, true ) ) {
383 $atts['inline_wrapper_element'] = true;
384 }
385 $atts = $this->prepare_shortcode_atts( $atts );
386
387 // use the public available function here.
388 return get_ad( $id, $atts );
389 }
390
391 /**
392 * Shortcode to include ad from an ad group in frontend
393 *
394 * @param array $atts shortcode attributes.
395 *
396 * @return string ad group content.
397 */
398 public function shortcode_display_ad_group( $atts ) {
399 $atts = is_array( $atts ) ? $atts : array();
400 $id = isset( $atts['id'] ) ? (int) $atts['id'] : 0;
401 $atts = $this->prepare_shortcode_atts( $atts );
402
403 // use the public available function here.
404 return get_ad_group( $id, $atts );
405 }
406
407 /**
408 * Shortcode to display content of an ad placement in frontend
409 *
410 * @param array $atts shortcode attributes.
411 *
412 * @return string ad placement content.
413 */
414 public function shortcode_display_ad_placement( $atts ) {
415 $atts = is_array( $atts ) ? $atts : array();
416 $id = isset( $atts['id'] ) ? (string) $atts['id'] : '';
417 $atts = $this->prepare_shortcode_atts( $atts );
418
419 // use the public available function here.
420 return get_ad_placement( $id, $atts );
421 }
422
423 /**
424 * Prepare shortcode attributes.
425 *
426 * @param array $atts array with strings.
427 *
428 * @return array
429 */
430 private function prepare_shortcode_atts( $atts ) {
431 $result = array();
432
433 /**
434 * Prepare attributes by converting strings to multi-dimensional array
435 * Example: [ 'output__margin__top' => 1 ] => ['output']['margin']['top'] = 1
436 */
437 if ( ! defined( 'ADVANCED_ADS_DISABLE_CHANGE' ) || ! ADVANCED_ADS_DISABLE_CHANGE ) {
438 foreach ( $atts as $attr => $data ) {
439 $levels = explode( '__', $attr );
440 $last = array_pop( $levels );
441
442 $cur_lvl = &$result;
443
444 foreach ( $levels as $lvl ) {
445 if ( ! isset( $cur_lvl[ $lvl ] ) ) {
446 $cur_lvl[ $lvl ] = array();
447 }
448
449 $cur_lvl = &$cur_lvl[ $lvl ];
450 }
451
452 $cur_lvl[ $last ] = $data;
453 }
454
455 $result = array_diff_key(
456 $result,
457 array(
458 'id' => false,
459 'blog_id' => false,
460 'ad_args' => false,
461 )
462 );
463 }
464
465 // Ad type: 'content' and a shortcode inside.
466 if ( isset( $atts['ad_args'] ) ) {
467 $result = array_merge( $result, json_decode( urldecode( $atts['ad_args'] ), true ) );
468
469 }
470
471 return $result;
472 }
473
474 /**
475 * Return plugin options
476 * these are the options updated by the user
477 *
478 * @return array $options
479 */
480 public function options() {
481 // we can’t store options if WPML String Translations is enabled, or it would not translate the "Ad Label" option.
482 if ( ! isset( $this->options ) || class_exists( 'WPML_ST_String' ) ) {
483 $this->options = get_option( ADVADS_SLUG, array() );
484 }
485
486 // allow to change options dynamically
487 $this->options = apply_filters( 'advanced-ads-options', $this->options );
488
489 return $this->options;
490 }
491
492 /**
493 * Update plugin options (not for settings page, but if automatic options are needed)
494 *
495 * @param array $options new options.
496 */
497 public function update_options( array $options ) {
498 // do not allow to clear options.
499 if ( array() === $options ) {
500 return;
501 }
502
503 $this->options = $options;
504 update_option( ADVADS_SLUG, $options );
505 }
506
507 /**
508 * Return internal plugin options
509 * these are options set by the plugin
510 *
511 * @return array $options
512 */
513 public function internal_options() {
514 if ( ! isset( $this->internal_options ) ) {
515 $defaults = array(
516 'version' => ADVADS_VERSION,
517 'installed' => time(), // when was this installed.
518 );
519 $this->internal_options = get_option( ADVADS_SLUG . '-internal', array() );
520
521 // save defaults.
522 if ( array() === $this->internal_options ) {
523 $this->internal_options = $defaults;
524 $this->update_internal_options( $this->internal_options );
525
526 self::get_instance()->create_capabilities();
527 }
528
529 // for versions installed prior to 1.5.3 set installed date for now.
530 if ( ! isset( $this->internal_options['installed'] ) ) {
531 $this->internal_options['installed'] = time();
532 $this->update_internal_options( $this->internal_options );
533 }
534 }
535
536 return $this->internal_options;
537 }
538
539 /**
540 * Update internal plugin options
541 *
542 * @param array $options new internal options.
543 */
544 public function update_internal_options( array $options ) {
545 // do not allow to clear options.
546 if ( array() === $options ) {
547 return;
548 }
549
550 $this->internal_options = $options;
551 update_option( ADVADS_SLUG . '-internal', $options );
552 }
553
554 /**
555 * Get prefix used for frontend elements
556 */
557 public function get_frontend_prefix() {
558 if ( ! $this->frontend_prefix ) {
559 $options = $this->options();
560
561 if ( ! isset( $options['front-prefix'] ) ) {
562 if ( isset( $options['id-prefix'] ) ) {
563 // deprecated: keeps widgets working that previously received an id based on the front-prefix.
564 $frontend_prefix = esc_attr( $options['id-prefix'] );
565 } else {
566 $host = parse_url( get_home_url(), PHP_URL_HOST );
567 $frontend_prefix = preg_match( '/[A-Za-z][A-Za-z0-9_]{4}/', $host, $result ) ? $result[0] . '-' : self::DEFAULT_FRONTEND_PREFIX;
568 }
569 } else {
570 $frontend_prefix = esc_attr( $options['front-prefix'] );
571 }
572 /**
573 * Applying the filter here makes sure that it is the same frontend prefix for all
574 * calls on this page impression
575 */
576 $this->frontend_prefix = apply_filters( 'advanced-ads-frontend-prefix', $frontend_prefix );
577 }
578
579 return $this->frontend_prefix;
580 }
581
582 /**
583 * Get priority used for injection inside content
584 */
585 public function get_content_injection_priority() {
586 $options = $this->options();
587
588 return isset( $options['content-injection-priority'] ) ? (int) $options['content-injection-priority'] : 100;
589 }
590
591 /**
592 * Returns the capability needed to perform an action
593 *
594 * @param string $capability a capability to check, can be internal to Advanced Ads.
595 *
596 * @return string $capability a valid WordPress capability.
597 */
598 public static function user_cap( $capability = 'manage_options' ) {
599
600 global $advanced_ads_capabilities;
601
602 // admins can do everything.
603 // is also a fallback if no option or more specific capability is given.
604 if ( current_user_can( 'manage_options' ) ) {
605 return 'manage_options';
606 }
607
608 return apply_filters( 'advanced-ads-capability', $capability );
609 }
610
611 /**
612 * Create roles and capabilities
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 public function remove_capabilities() {
628 if ( $role = get_role( 'administrator' ) ) {
629 $role->remove_cap( 'advanced_ads_manage_options' );
630 $role->remove_cap( 'advanced_ads_see_interface' );
631 $role->remove_cap( 'advanced_ads_edit_ads' );
632 $role->remove_cap( 'advanced_ads_manage_placements' );
633 $role->remove_cap( 'advanced_ads_place_ads' );
634 }
635 }
636
637 /**
638 * Fired when the plugin is uninstalled.
639 */
640 public static function uninstall() {
641 $advads_options = Advanced_Ads::get_instance()->options();
642
643 if ( ! empty( $advads_options['uninstall-delete-data'] ) ) {
644 global $wpdb;
645 $main_blog_id = $wpdb->blogid;
646
647 Advanced_Ads::get_instance()->create_post_types();
648
649 if ( ! is_multisite() ) {
650 self::get_instance()->uninstall_single();
651 } else {
652 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
653
654 foreach ( $blog_ids as $blog_id ) {
655 switch_to_blog( $blog_id );
656 self::get_instance()->uninstall_single();
657 }
658 switch_to_blog( $main_blog_id );
659 }
660
661 // Delete assets (main blog).
662 Advanced_Ads_Ad_Blocker_Admin::get_instance()->clear_assets();
663 }
664
665 }
666
667 /**
668 * Fired for each blog when the plugin is uninstalled.
669 */
670 protected function uninstall_single() {
671 global $wpdb;
672
673 // Ads.
674 $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s", Advanced_Ads::POST_TYPE_SLUG ) );
675
676 if ( $post_ids ) {
677 $wpdb->delete(
678 $wpdb->posts,
679 array( 'post_type' => Advanced_Ads::POST_TYPE_SLUG ),
680 array( '%s' )
681 );
682
683 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN( %s )", implode( ',', $post_ids ) ) );
684 }
685
686 // Groups.
687 $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 ) );
688
689 foreach ( $term_ids as $term_id ) {
690 wp_delete_term( $term_id, Advanced_Ads::AD_GROUP_TAXONOMY );
691 }
692
693 delete_option( 'advads-ad-groups' );
694 delete_option( Advanced_Ads::AD_GROUP_TAXONOMY . '_children' );
695 delete_option( 'advads-ad-weights' );
696
697 // Placements.
698 delete_option( 'advads-ads-placements' );
699
700 // User metadata.
701 delete_metadata( 'user', null, 'advanced-ads-hide-wizard', '', true );
702 delete_metadata( 'user', null, 'advanced-ads-subscribed', '', true );
703
704 // Post metadata.
705 delete_metadata( 'post', null, '_advads_ad_settings', '', true );
706
707 // Transients.
708 delete_transient( ADVADS_SLUG . '_add-on-updates-checked' );
709
710 delete_option( GADSENSE_OPT_NAME );
711 delete_option( ADVADS_SLUG );
712 delete_option( ADVADS_SLUG . '-internal' );
713 delete_option( ADVADS_SLUG . '-notices' );
714
715 // Widget.
716 $base_widget_id = Advanced_Ads_Widget::get_base_id();
717 delete_option( 'widget_' . $base_widget_id );
718
719 // Ad blocker disquise.
720 delete_option( ADVADS_AB_SLUG );
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( 'AAGAM_VERSION' ) // Google Ad Manager.
735 || defined( 'AASA_VERSION' ) // Selling Ads.
736 || defined( 'AAT_VERSION' ) // Tracking.
737 || defined( 'AASADS_VERSION' ) // Sticky Ads.
738 || defined( 'AAR_VERSION' ) // Responsive Ads.
739 || defined( 'AAPLDS_VERSION' ) // PopUp and Layer Ads.
740 || defined( 'AAGT_SLUG' ) // Geo-Targeting.
741 );
742 }
743
744 /**
745 * Get the correct support URL: wp.org for free users and website for those with any add-on installed
746 *
747 * @param string $utm add UTM parameter to the link leading to https://wpadvancedads.com, if given.
748 *
749 * @return string URL.
750 */
751 public static function support_url( $utm = '' ) {
752
753 $utm = empty( $utm ) ? '#utm_source=advanced-ads&utm_medium=link&utm_campaign=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 group.
768 *
769 * @return bool
770 */
771 public static function get_group_by_url( $url = '', $ex = 'a' ) {
772
773 $url = self::get_short_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 // allow admins to see version for new users in any case.
799 if ( current_user_can( self::user_cap( 'advanced_ads_manage_options' ) )
800 && isset( $_REQUEST['advads-ignore-timestamp'] ) ) {
801 return true;
802 }
803
804 $timestamp = absint( $timestamp );
805
806 $options = self::get_instance()->internal_options();
807 $installed = isset( $options['installed'] ) ? $options['installed'] : 0;
808
809 return ( $installed >= $timestamp );
810 }
811
812 /**
813 * Show stuff to new users only.
814 *
815 * @param integer $timestamp time after which to show whatever.
816 * @param string $group optional group.
817 *
818 * @return bool true if user enabled after given timestamp.
819 */
820 public static function show_to_new_users( $timestamp, $group = 'a' ) {
821
822 return ( self::get_group_by_url( null, $group ) && self::is_new_user( $timestamp ) );
823 }
824
825 /**
826 * Get short version of home_url()
827 * remove protocol and www
828 * remove slash
829 *
830 * @param string $url URL to be shortened.
831 *
832 * @return string
833 */
834 public static function get_short_url( $url = '' ) {
835
836 $url = empty( $url ) ? home_url() : $url;
837
838 // strip protocols.
839 if ( preg_match( '/^(\w[\w\d]*:\/\/)?(www\.)?(.*)$/', trim( $url ), $matches ) ) {
840 $url = $matches[3];
841 }
842
843 // strip slashes.
844 $url = trim( $url, '/' );
845
846 return $url;
847 }
848
849 /**
850 * Return Advanced Ads logo in base64 format for use in WP Admin menu.
851 *
852 * @return string
853 */
854 public static function get_icon_svg() {
855 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjEuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJFYmVuZV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDY0Ljk5MyA2NS4wMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDY0Ljk5MyA2NS4wMjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIHN0eWxlPSJmaWxsOiNFNEU0RTQ7IiBkPSJNNDYuNTcxLDI3LjY0MXYyMy4xMzNIMTQuMjVWMTguNDUzaDIzLjExOGMtMC45NTYtMi4xODMtMS40OTQtNC41OS0xLjQ5NC03LjEyNg0KCWMwLTIuNTM1LDAuNTM4LTQuOTQyLDEuNDk0LTcuMTI0aC02Ljk1N0gwdjQ5LjQ5M2wxLjYxOCwxLjYxOEwwLDUzLjY5NmMwLDYuMjU2LDUuMDY4LDExLjMyNiwxMS4zMjQsMTEuMzI4djBoMTkuMDg3aDMwLjQxMlYyNy42MTENCgljLTIuMTkxLDAuOTY0LTQuNjA5LDEuNTA5LTcuMTU3LDEuNTA5QzUxLjE0MiwyOS4xMiw0OC43NDYsMjguNTg4LDQ2LjU3MSwyNy42NDF6Ii8+DQo8Y2lyY2xlIHN0eWxlPSJmaWxsOiM5ODk4OTg7IiBjeD0iNTMuNjY2IiBjeT0iMTEuMzI4IiByPSIxMS4zMjgiLz4NCjwvc3ZnPg0K';
856 }
857
858 /**
859 * Fires when a post is transitioned from one status to another.
860 *
861 * @param string $new_status New post status.
862 * @param string $old_status Old post status.
863 * @param WP_Post $post Post object.
864 */
865 public function transition_ad_status( $new_status, $old_status, $post ) {
866 if ( ! isset( $post->post_type ) || Advanced_Ads::POST_TYPE_SLUG !== $post->post_type || ! isset( $post->ID ) ) {
867 return;
868 }
869
870 $ad = new Advanced_Ads_Ad( $post->ID );
871
872 if ( $old_status !== $new_status ) {
873 /**
874 * Fires when an ad has transitioned from one status to another.
875 *
876 * @param Advanced_Ads_Ad $ad Ad object.
877 */
878 do_action( "advanced-ads-ad-status-{$old_status}-to-{$new_status}", $ad );
879 }
880
881 if ( 'publish' === $new_status && 'publish' !== $old_status ) {
882 /**
883 * Fires when an ad has transitioned from any other status to `publish`.
884 *
885 * @param Advanced_Ads_Ad $ad Ad object.
886 */
887 do_action( 'advanced-ads-ad-status-published', $ad );
888 }
889
890 if ( 'publish' === $old_status && 'publish' !== $new_status ) {
891 /**
892 * Fires when an ad has transitioned from `publish` to any other status.
893 *
894 * @param Advanced_Ads_Ad $ad Ad object.
895 */
896 do_action( 'advanced-ads-ad-status-unpublished', $ad );
897 }
898 }
899
900 }
901