PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.13
Advanced Ads – Ad Manager & AdSense v1.13
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 / ad.php
advanced-ads / classes Last commit date
EDD_SL_Plugin_Updater.php 7 years ago ad-ajax.php 7 years ago ad-debug.php 8 years ago ad-health-notices.php 7 years ago ad-model.php 8 years ago ad-select.php 9 years ago ad.php 7 years ago ad_ajax_callbacks.php 7 years ago ad_group.php 7 years ago ad_placements.php 7 years ago ad_type_abstract.php 8 years ago ad_type_content.php 7 years ago ad_type_dummy.php 7 years ago ad_type_group.php 8 years ago ad_type_image.php 7 years ago ad_type_plain.php 7 years ago checks.php 7 years ago compatibility.php 7 years ago display-conditions.php 7 years ago filesystem.php 8 years ago frontend_checks.php 7 years ago plugin.php 7 years ago upgrades.php 7 years ago utils.php 7 years ago visitor-conditions.php 7 years ago widget.php 7 years ago
ad.php
870 lines
1 <?php
2
3 /**
4 * Advanced Ads Ad.
5 *
6 * @package Advanced_Ads_Ad
7 * @author Thomas Maier <thomas.maier@webgilde.com>
8 * @license GPL-2.0+
9 * @link http://webgilde.com
10 * @copyright 2013 Thomas Maier, webgilde GmbH
11 */
12
13 /**
14 * an ad object
15 *
16 * @package Advanced_Ads_Ad
17 * @author Thomas Maier <thomas.maier@webgilde.com>
18 * @deprecated since version 1.5.3 (May 6th 2015)
19 * might still be needed if some old add-ons are running somewhere
20 */
21 if( ! class_exists ( 'Advads_Ad', false ) ){
22 class Advads_Ad extends Advanced_Ads_Ad {
23
24 }
25 }
26
27 /**
28 * an ad object
29 *
30 * @package Advanced_Ads_Ad
31 * @author Thomas Maier <thomas.maier@webgilde.com>
32 */
33 class Advanced_Ads_Ad {
34
35 /**
36 * id of the post type for this ad
37 */
38 public $id = 0;
39
40 /**
41 * true, if this is an Advanced Ads Ad post type
42 */
43 public $is_ad = false;
44
45 /**
46 * ad type
47 */
48 public $type = 'content';
49
50 /**
51 * ad width
52 */
53 public $width = 0;
54
55 /**
56 * target url
57 *
58 * @since 1.6.10
59 */
60 public $url = '';
61
62 /**
63 * ad height
64 */
65 public $height = 0;
66
67 /**
68 * object of current ad type
69 */
70 protected $type_obj;
71
72 /**
73 * content of the ad
74 *
75 * only needed for ad types using the post content field
76 */
77 public $content = '';
78
79 /**
80 * conditions of the ad display
81 */
82 public $conditions = array();
83
84 /**
85 * status of the ad (e.g. publish, pending)
86 */
87 public $status = array();
88
89 /**
90 * array with meta field options aka parameters
91 */
92 protected $options = array();
93
94 /**
95 * name of the meta field to save options to
96 */
97 static $options_meta_field = 'advanced_ads_ad_options';
98
99 /**
100 * additional arguments set when ad is loaded, overwrites or extends options
101 */
102 public $args = array();
103
104 /**
105 * multidimensional array contains information about the wrapper
106 * each possible html attribute is an array with possible multiple elements
107 */
108 public $wrapper = array();
109
110 /**
111 * Displayed above the ad.
112 */
113 protected $label = '';
114
115 /**
116 * init ad object
117 *
118 * @param int $id id of the ad (= post id)
119 * @param arr $args additional arguments
120 */
121 public function __construct($id, $args = array()) {
122 $id = absint( $id );
123 $this->id = $id;
124 $this->args = is_array( $args ) ? $args : array();
125
126 // whether the ad will be tracked
127 $this->global_output = isset( $this->args['global_output'] ) ? (bool) $this->args['global_output'] : true;
128
129 if ( ! empty($id) ) { $this->load( $id ); }
130
131 // dynamically add sanitize filters for condition types
132 $_types = array();
133 // -TODO use model
134 $advanced_ads_ad_conditions = Advanced_Ads::get_ad_conditions();
135 foreach ( $advanced_ads_ad_conditions as $_condition ) {
136 // add unique
137 $_types[$_condition['type']] = false;
138 }
139 // iterate types
140 foreach ( array_keys( $_types ) as $_type ) {
141 // -TODO might be faster to use __call() method or isset()-test class method array
142 $method_name = 'sanitize_condition_'. $_type;
143 if ( method_exists( $this, $method_name ) ) {
144 add_filter( 'advanced-ads-sanitize-condition-' . $_type, array($this, $method_name), 10, 1 );
145 } elseif ( function_exists( 'advads_sanitize_condition_' . $_type ) ) {
146 // check for public function to sanitize this
147 add_filter( 'advanced-ads-sanitize-condition-' . $_type, 'advads_sanitize_condition_' . $_type, 10, 1 );
148
149 }
150 }
151 }
152
153 /**
154 * load an ad object by id based on its ad type
155 *
156 * @since 1.0.0
157 */
158 private function load($id = 0){
159
160 $_data = get_post( $id );
161 if ( $_data == null ) { return false; }
162
163 // return, if not an ad
164 if ( $_data->post_type != Advanced_Ads::POST_TYPE_SLUG ) {
165 return false;
166 } else {
167 $this->is_ad = true;
168 }
169
170 $this->type = $this->options( 'type' );
171 $this->title = $_data->post_title;
172 /* load ad type object */
173 $types = Advanced_Ads::get_instance()->ad_types;
174 if ( isset($types[$this->type]) ){
175 $this->type_obj = $types[$this->type];
176 } else {
177 $this->type_obj = new Advanced_Ads_Ad_Type_Abstract;
178 }
179 $this->url = $this->get_url();
180 $this->width = absint( $this->options( 'width' ) );
181 $this->height = absint( $this->options( 'height' ) );
182 $this->conditions = $this->options( 'conditions' );
183 $this->description = $this->options( 'description' );
184 $this->output = $this->options( 'output' );
185 $this->status = $_data->post_status;
186 $this->expiry_date = $this->options( 'expiry_date' );
187 $this->is_head_placement = isset( $this->args['placement_type'] ) && $this->args['placement_type'] === 'header';
188
189 // load content based on ad type
190 $this->content = $this->type_obj->load_content( $_data );
191
192
193 if ( ! $this->is_head_placement ) {
194 $this->maybe_create_label();
195 $this->wrapper = $this->load_wrapper_options();
196
197 // set wrapper conditions
198 $this->wrapper = apply_filters( 'advanced-ads-set-wrapper', $this->wrapper, $this );
199 // add unique wrapper id
200 if ( is_array( $this->wrapper )
201 && $this->wrapper !== array()
202 && ! isset( $this->wrapper['id'] ) ){
203 // create unique id if not yet given
204 $this->wrapper['id'] = $this->create_wrapper_id();
205 }
206 }
207 }
208
209 /**
210 * get options from meta field and return specific field
211 *
212 * @param string $field post meta key to be returned
213 * @return mixed meta field content
214 * @since 1.0.0
215 * @todo check against default values
216 */
217 public function options( $field = '', $default = null ) {
218 // retrieve options, if not given yet
219 // -TODO may execute multiple times (if empty); bad design and risk to access unintialised data with direct access to $this->options property.
220 if ( $this->options === array() ) {
221 // get_post_meta() may return false
222 $meta = get_post_meta( $this->id, self::$options_meta_field, true );
223 if ( $meta ) {
224 // merge meta with arguments given on ad load
225 $this->options = Advanced_Ads_Utils::merge_deep_array( array( $meta, $this->args ) );
226 } else {
227 // load arguments given on ad load
228 $this->options = $this->args;
229 }
230
231 if ( isset( $this->options['change-ad'] ) ) {
232 // some options was provided by the user
233 $this->options = Advanced_Ads_Utils::merge_deep_array( array( $this->options, $this->options['change-ad'] ) );
234 }
235 }
236
237 // return specific option
238 if ( $field != '' ) {
239 if ( isset($this->options[$field]) ) {
240 return $this->options[$field];
241 }
242 } else { // return all options
243 if ( ! empty($this->options) ) {
244 return $this->options;
245 }
246 }
247
248 return $default;
249 }
250
251 /**
252 * set an option of the ad
253 *
254 * @since 1.1.0
255 * @param string $option name of the option
256 * @param mixed $value value of the option
257 */
258 public function set_option($option = '', $value = ''){
259 if ( $option == '' ) { return; }
260
261 // get current options
262 $options = $this->options();
263
264 // set options
265 $options[$option] = $value;
266
267 // save options
268 $this->options = $options;
269
270 }
271
272
273 /**
274 * return ad content for frontend output
275 *
276 * @since 1.0.0
277 * @param array $output_options output options
278 * @return string $output ad output
279 */
280 public function output( $output_options = array() ){
281 if ( ! $this->is_ad ) { return ''; }
282
283 $output_options['global_output'] = $this->global_output = isset( $output_options['global_output'] ) ? $output_options['global_output'] : $this->global_output;
284
285 // switch between normal and debug mode
286 // check if debug output should only be displayed to admins
287 $user_can_manage_ads = current_user_can( Advanced_Ads_Plugin::user_cap( 'advanced_ads_manage_options') );
288 if( isset( $this->output['debugmode'] )
289 && ( $user_can_manage_ads || ( ! $user_can_manage_ads && ! defined('ADVANCED_ADS_AD_DEBUG_FOR_ADMIN_ONLY') ) ) ){
290 $debug = new Advanced_Ads_Ad_Debug;
291 return $debug->prepare_debug_output( $this );
292 } else {
293 $output = $this->prepare_frontend_output();
294 }
295
296 // add the ad to the global output array
297 $advads = Advanced_Ads::get_instance();
298 if ( $output_options['global_output'] ) {
299 $new_ad = array('type' => 'ad', 'id' => $this->id, 'title' => $this->title, 'output' => $output);
300 // if ( method_exists( 'Advanced_Ads_Tracking_Plugin' , 'check_ad_tracking_enabled' ) ) {
301 // if ( class_exists( 'Advanced_Ads_Tracking_Plugin', false ) ) {
302 if ( defined( 'AAT_VERSION' ) && -1 < version_compare( AAT_VERSION, '1.4.2' ) ) {
303 $new_ad['tracking_enabled'] = Advanced_Ads_Tracking_Plugin::get_instance()->check_ad_tracking_enabled( $this );
304 }
305 $advads->current_ads[] = $new_ad;
306 }
307
308 // action when output is created
309 do_action( 'advanced-ads-output', $this, $output, $output_options );
310
311 return apply_filters( 'advanced-ads-output-final', $output, $this, $output_options );
312 }
313
314 /**
315 * check if the ad can be displayed in frontend due to its own conditions
316 *
317 * @since 1.0.0
318 * @param array $check_options check options
319 * @return bool $can_display true if can be displayed in frontend
320 */
321 public function can_display( $check_options = array() ) {
322 $check_options = wp_parse_args( $check_options, array( 'passive_cache_busting' => false, 'ignore_debugmode' => false ) );
323
324 // prevent ad to show up through wp_head, if this is not a header placement
325 if( doing_action( 'wp_head' ) && isset( $this->options['placement_type'] ) && 'header' !== $this->options['placement_type'] ){
326 return false;
327 }
328
329 // Check If the current ad is requested using a shortcode placed in the content of the current ad.
330 if ( isset( $this->options['shortcode_ad_id'] ) && (int) $this->options['shortcode_ad_id'] === $this->id ) {
331 return false;
332 }
333
334 // force ad display if debug mode is enabled
335 if( isset( $this->output['debugmode'] ) && ! $check_options['ignore_debugmode'] ) {
336 return true;
337 }
338
339 if ( ! $check_options['passive_cache_busting'] ) {
340 // don’t display ads that are not published or private for users not logged in
341 if ( $this->status !== 'publish' && ! ($this->status === 'private' && is_user_logged_in() ) ) {
342 return false;
343 }
344
345 if ( ! $this->can_display_by_visitor() || ! $this->can_display_by_expiry_date() ) {
346 return false;
347 }
348 } else {
349 if ( $this->status !== 'publish' || ! $this->can_display_by_expiry_date() ) {
350 return false;
351 }
352 }
353
354 // add own conditions to flag output as possible or not
355 $can_display = apply_filters( 'advanced-ads-can-display', true, $this, $check_options );
356
357 return $can_display;
358 }
359
360 /**
361 * check visitor conditions
362 *
363 * @since 1.1.0
364 * @return bool $can_display true if can be displayed in frontend based on visitor settings
365 */
366 public function can_display_by_visitor(){
367 if ( ! empty( $this->options['wp_the_query']['is_feed'] ) ) {
368 return true;
369 }
370
371 // check old "visitor" and new "visitors" conditions
372 if ( ( empty($this->options['visitors']) ||
373 ! is_array( $this->options['visitors'] ) )
374 && ( empty($this->options['visitor']) ||
375 ! is_array( $this->options['visitor'] )
376 )) { return true; }
377
378 if ( isset( $this->options['visitors'] ) && is_array( $this->options['visitors'] ) ) {
379
380 $visitor_conditions = $this->options['visitors'];
381
382 $last_result = false;
383 $length = count( $visitor_conditions );
384
385 for($i = 0; $i < $length; ++$i) {
386 $_condition = current( $visitor_conditions );
387 // ignore OR if last result was true
388 if( $last_result && isset( $_condition['connector'] ) && 'or' === $_condition['connector'] ){
389 next( $visitor_conditions );
390 continue;
391 }
392 $last_result = $result = Advanced_Ads_Visitor_Conditions::frontend_check( $_condition, $this );
393 if( ! $result ) {
394 // return false only, if the next condition doesn’t have an OR operator
395 $next = next( $visitor_conditions );
396 if( ! isset( $next['connector'] ) || $next['connector'] !== 'or' ) {
397 return false;
398 }
399 } else {
400 next( $visitor_conditions );
401 }
402 }
403 }
404
405 /**
406 * "old" visitor conditions
407 *
408 * @deprecated since version 1.5.4
409 */
410
411 if ( empty($this->options['visitor']) ||
412 ! is_array( $this->options['visitor'] ) ) { return true; }
413 $visitor_conditions = $this->options( 'visitor' );
414
415 // check mobile condition
416 if ( isset($visitor_conditions['mobile']) ){
417 switch ( $visitor_conditions['mobile'] ){
418 case 'only' :
419 if ( ! wp_is_mobile() ) { return false; }
420 break;
421 case 'no' :
422 if ( wp_is_mobile() ) { return false; }
423 break;
424 }
425 }
426
427 return true;
428 }
429
430 /**
431 * check expiry date
432 *
433 * @since 1.3.15
434 * @return bool $can_display true if can be displayed in frontend based on expiry date
435 */
436 public function can_display_by_expiry_date(){
437
438 // if expiry_date is not set, null is returned
439 $ad_expiry_date = (int) $this->options( 'expiry_date' );
440
441 if ( $ad_expiry_date <= 0 || $ad_expiry_date > time() ) {
442 return true;
443 }
444
445 // set status to 'draft' if the ad is expired
446 if ( $this->status !== 'draft' ) {
447 wp_update_post( array( 'ID' => $this->id, 'post_status' => 'draft' ) );
448 /**
449 * Run when an ad expires
450 */
451 do_action( 'advanced-ads-ad-expired', $this->id, $this );
452 }
453
454 return false;
455 }
456
457 /**
458 * save an ad to the database
459 * takes values from the current state
460 */
461 public function save(){
462 global $wpdb;
463
464 // remove slashes from content
465 $this->content = $this->prepare_content_to_save();
466
467 $where = array('ID' => $this->id);
468 $wpdb->update( $wpdb->posts, array( 'post_content' => $this->content ), $where );
469
470 // clean post from object cache
471 clean_post_cache( $this->id );
472
473 // sanitize conditions
474 // see sanitize_conditions function for example on using this filter
475 $conditions = self::sanitize_conditions_on_save( $this->conditions );
476
477 // save other options to post meta field
478 $options = $this->options();
479
480 $options['type'] = $this->type;
481 $options['url'] = $this->url;
482 // Inform the tracking add-on about the new url.
483 unset ( $options['tracking']['link'] );
484 $options['width'] = $this->width;
485 $options['height'] = $this->height;
486 $options['conditions'] = $conditions;
487 $options['expiry_date'] = $this->expiry_date;
488 $options['description'] = $this->description;
489
490 // filter to manipulate options or add more to be saved
491 $options = apply_filters( 'advanced-ads-save-options', $options, $this );
492
493 update_post_meta( $this->id, self::$options_meta_field, $options );
494 }
495
496 /**
497 * native filter for content field before being saved
498 *
499 * @return string $content ad content
500 * @since 1.0.0
501 */
502 public function prepare_content_to_save() {
503
504 $content = $this->content;
505
506 // load ad type specific parameter filter
507 // @todo this is just a hotfix for type_obj not set, yet the cause is still unknown
508 if(is_object( $this->type_obj )){
509 $content = $this->type_obj->sanitize_content( $content );
510 }
511 // apply a custom filter by ad type
512 $content = apply_filters( 'advanced-ads-pre-ad-save-' . $this->type, $content );
513
514 return $content;
515 }
516
517 /**
518 * native filter for ad parameters before being saved
519 *
520 * @return arr $parameters sanitized parameters
521 */
522 public function prepare_parameters_to_save() {
523
524 $parameters = $this->parameters;
525 // load ad type specific parameter filter
526 $parameters = $this->type_obj->sanitize_parameters( $parameters );
527
528 // apply native WP filter for content fields
529 return $parameters;
530 }
531
532 /**
533 * prepare ads output
534 *
535 */
536 public function prepare_frontend_output() {
537 $options = $this->options();
538
539 if ( isset( $options['change-ad']['content'] ) ) {
540 // output was provided by the user
541 $output = $options['change-ad']['content'];
542 } else {
543 // load ad type specific content filter
544 $output = $this->type_obj->prepare_output( $this );
545 }
546
547 // don’t deliver anything, if main ad content is empty
548 if ( $output == '' ) {
549 return;
550 }
551
552 if ( ! $this->is_head_placement ) {
553 // filter to manipulate the output before the wrapper is added
554 $output = apply_filters( 'advanced-ads-output-inside-wrapper', $output, $this );
555
556 if ( $this->label ) {
557 $output = $this->label . $output;
558 }
559
560 // build wrapper around the ad
561 $output = $this->add_wrapper( $output );
562
563 // add a clearfix, if set
564 if ( isset($this->output['clearfix']) && $this->output['clearfix'] ){
565 $output .= '<br style="clear: both; display: block; float: none;"/>';
566 }
567 }
568
569
570 // apply a custom filter by ad type
571 $output = apply_filters( 'advanced-ads-ad-output', $output, $this );
572
573 return $output;
574 }
575
576 /**
577 * sanitize ad display conditions when saving the ad
578 *
579 * @param array $conditions conditions array send via the dashboard form for an ad
580 * @return array with sanitized conditions
581 * @since 1.0.0
582 */
583 public function sanitize_conditions_on_save($conditions = array()){
584
585 global $advanced_ads_ad_conditions;
586
587 if ( ! is_array( $conditions ) || $conditions == array() ) { return array(); }
588
589 foreach ( $conditions as $_key => $_condition ){
590 if ( $_key == 'postids' ){
591 // sanitize single post conditions
592 if ( empty($_condition['ids']) ){ // remove, if empty
593 $_condition['include'] = array();
594 $_condition['exclude'] = array();
595 } elseif( isset( $_condition['method'] ) ) {
596 switch ( $_condition['method'] ){
597 case 'include' :
598 $_condition['include'] = $_condition['ids'];
599 $_condition['exclude'] = array();
600 break;
601 case 'exclude' :
602 $_condition['include'] = array();
603 $_condition['exclude'] = $_condition['ids'];
604 break;
605 }
606 }
607 } else {
608 if ( ! is_array( $_condition ) ) {
609 $_condition = trim( $_condition ); }
610 if ( $_condition == '' ) {
611 $conditions[$_key] = $_condition;
612 continue;
613 }
614 }
615 $type = ! empty($advanced_ads_ad_conditions[$_key]['type']) ? $advanced_ads_ad_conditions[$_key]['type'] : 0;
616 if ( empty($type) ) { continue; }
617
618 // dynamically apply filters for each condition used
619 $conditions[$_key] = apply_filters( 'advanced-ads-sanitize-condition-' . $type, $_condition );
620 }
621 return $conditions;
622 }
623
624 /**
625 * sanitize id input field(s) for pattern /1,2,3,4/
626 *
627 * @pararm array/string $cond input string/array
628 * @return array/string $cond sanitized string/array
629 */
630 public static function sanitize_condition_idfield($cond = ''){
631 // strip anything that is not comma or number
632
633 if ( is_array( $cond ) ){
634 foreach ( $cond as $_key => $_cond ){
635 $cond[$_key] = preg_replace( '#[^0-9,]#', '', $_cond );
636 }
637 } else {
638 $cond = preg_replace( '#[^0-9,]#', '', $cond );
639 }
640 return $cond;
641 }
642
643 /**
644 * sanitize radio input field
645 *
646 * @pararm string $string input string
647 * @return string $string sanitized string
648 */
649 public static function sanitize_condition_radio($string = ''){
650 // only allow 0, 1 and empty
651 return $string = preg_replace( '#[^01]#', '', $string );
652 }
653
654 /**
655 * sanitize comma seperated text input field
656 *
657 * @pararm array/string $cond input string/array
658 * @return array/string $cond sanitized string/array
659 */
660 public static function sanitize_condition_textvalues($cond = ''){
661 // strip anything that is not comma, alphanumeric, minus and underscore
662 if ( is_array( $cond ) ){
663 foreach ( $cond as $_key => $_cond ){
664 $cond[$_key] = preg_replace( '#[^0-9,A-Za-z-_]#', '', $_cond );
665 }
666 } else {
667 $cond = preg_replace( '#[^0-9,A-Za-z-_]#', '', $cond );
668 }
669 return $cond;
670 }
671
672 /**
673 * load wrapper options set with the ad
674 *
675 * @since 1.3
676 * @return arr $wrapper options array ready to be use in add_wrapper() function
677 */
678 protected function load_wrapper_options(){
679 $wrapper = array();
680
681 // print_r($this->output);
682
683 $position = ! empty( $this->output['position'] ) ? $this->output['position'] : '';
684 $use_placement_pos = false;
685
686 if ( ! isset( $this->args['previous_method'] ) || 'group' !== $this->args['previous_method'] ) {
687 if ( isset($this->output['class'] ) && is_array( $this->output['class'] ) ) {
688 $wrapper['class'] = $this->output['class'];
689 }
690 if ( ! empty( $this->args['placement_position'] ) ) {
691 // If not group, Set placement position instead of ad position.
692 $use_placement_pos = true;
693 $position = $this->args['placement_position'];
694 }
695 }
696
697 switch ( $position ) {
698 case 'left' :
699 $wrapper['style']['float'] = 'left';
700 break;
701 case 'right' :
702 $wrapper['style']['float'] = 'right';
703 break;
704 case 'center' :
705 if ( ! empty ( $this->output['add_wrapper_sizes'] ) ) {
706 $wrapper['style']['margin-left'] = 'auto';
707 $wrapper['style']['margin-right'] = 'auto';
708
709 if ( $use_placement_pos ) {
710 $wrapper['style']['text-align'] = 'center';
711 }
712 } else {
713 $wrapper['style']['text-align'] = 'center';
714 }
715
716 // add css rule after wrapper to center the ad
717 // add_filter( 'advanced-ads-output-wrapper-after-content', array( $this, 'center_ad_content' ), 10, 2 );
718 break;
719 case 'clearfix' :
720 $wrapper['style']['clear'] = 'both';
721 break;
722 }
723
724 // add manual classes
725 if ( isset($this->output['wrapper-class']) && '' !== $this->output['wrapper-class'] ) {
726 $classes = explode( ' ', $this->output['wrapper-class'] );
727
728 foreach( $classes as $_class ){
729 $wrapper['class'][] = sanitize_text_field( $_class );
730 }
731 }
732
733 if ( ! empty($this->output['margin']['top']) ) {
734 $wrapper['style']['margin-top'] = intval( $this->output['margin']['top'] ) . 'px';
735 }
736 if ( ! empty($this->output['margin']['right']) ) {
737 $wrapper['style']['margin-right'] = intval( $this->output['margin']['right'] ) . 'px';
738 }
739 if ( ! empty($this->output['margin']['bottom']) ) {
740 $wrapper['style']['margin-bottom'] = intval( $this->output['margin']['bottom'] ) . 'px';
741 }
742 if ( ! empty($this->output['margin']['left']) ) {
743 $wrapper['style']['margin-left'] = intval( $this->output['margin']['left'] ) . 'px';
744 }
745
746 if ( ! empty ($this->output['add_wrapper_sizes'] ) ) {
747 $wrapper['style']['width'] = intval( $this->width ) . 'px';
748 $wrapper['style']['height'] = intval( $this->height ) . 'px';
749 }
750
751 if ( ! empty( $this->output['clearfix_before'] ) ) {
752 $wrapper['style']['clear'] = 'both';
753 }
754
755
756 return $wrapper;
757 }
758
759 /**
760 * add a wrapper arount the ad content if wrapper information are given
761 *
762 * @since 1.1.4
763 * @param str $ad_content content of the ad
764 * @return str $wrapper ad within the wrapper
765 */
766 protected function add_wrapper($ad_content = ''){
767 $wrapper_options = apply_filters( 'advanced-ads-output-wrapper-options', $this->wrapper, $this );
768
769 if ( ( ! isset( $this->output['wrapper-id'] ) || '' === $this->output['wrapper-id'] )
770 && $wrapper_options == array() || ! is_array( $wrapper_options ) ) { return $ad_content; }
771
772 // create unique id if not yet given
773 if ( empty($wrapper_options['id']) ){
774 $this->wrapper['id'] = $wrapper_options['id'] = $this->create_wrapper_id();
775 }
776
777 // add edit button for users with the appropriate rights
778 if( current_user_can( Advanced_Ads_Plugin::user_cap( 'advanced_ads_edit_ads') ) ){
779 ob_start();
780 include ADVADS_BASE_PATH . 'public/views/ad-edit-bar.php';
781 $ad_content = ob_get_clean() . $ad_content;
782 }
783
784 // build the box
785 $wrapper = '<div' . Advanced_Ads_Utils::build_html_attributes( $wrapper_options ) . '>';
786 $wrapper .= apply_filters( 'advanced-ads-output-wrapper-before-content', '', $this );
787 $wrapper .= $ad_content;
788 $wrapper .= apply_filters( 'advanced-ads-output-wrapper-after-content', '', $this );
789 $wrapper .= '</div>';
790
791 return $wrapper;
792 }
793
794 /**
795 * function to add css rule after the ad to center its content
796 *
797 * @since 1.6.9.5
798 * @param str $output additional output in wrapper after content
799 * @param obj $ad Advanced_Ads_Ad object
800 * @return str $output
801 *
802 */
803 /*public function center_ad_content( $output, Advanced_Ads_Ad $ad ){
804
805 // no additional check needed, because the hook is only called when the ad is centered
806 if( isset( $ad->wrapper['id'] )){
807 // does not work with most div elements, so actually not used now
808 $output .= '<style type="text/css">#'. $ad->wrapper['id'] . ' img, #'. $ad->wrapper['id'] . ' div { display: inline !important; }</style>';
809 }
810
811 return $output;
812 }*/
813
814 /**
815 * create a random wrapper id
816 *
817 * @since 1.1.4
818 * @return string $id random id string
819 */
820 private function create_wrapper_id(){
821
822 if( isset( $this->output['wrapper-id'] )){
823 $id = sanitize_key( $this->output['wrapper-id'] );
824 if( '' !== $id ){
825 return $id;
826 }
827 }
828
829 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
830
831 return $prefix . mt_rand();
832 }
833
834 /**
835 * Create an "Advertisement" label if conditions are met.
836 */
837 public function maybe_create_label() {
838 $placement_state = isset( $this->args['ad_label'] ) ? $this->args['ad_label'] : 'default';
839
840 if ( $this->type !== 'group' &&
841 $label = Advanced_Ads::get_instance()->get_label( $placement_state )
842 ) {
843 $this->label = $label;
844 }
845 }
846
847 /**
848 * Get the ad url.
849 *
850 * @return string
851 */
852 private function get_url() {
853 $this->url = $this->options( 'url' );
854
855 // If the tracking add-on is not active.
856 if ( ! defined( 'AAT_VERSION' ) ) {
857 global $pagenow;
858 // If this is not the ad edit page.
859 if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
860 // Remove placeholders.
861 $this->url = str_replace( array( '[POST_ID]', '[POST_SLUG]', '[CAT_SLUG]', '[AD_ID]' ), '', $this->url );
862 }
863 }
864 return $this->url;
865 }
866
867
868
869 }
870