PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.14.2
Advanced Ads – Ad Manager & AdSense v1.14.2
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 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
ad.php
878 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
304 $new_ad['tracking_enabled'] = Advanced_Ads_Tracking_Plugin::get_instance()->check_ad_tracking_enabled( $this );
305
306 $tracking_options = Advanced_Ads_Tracking_Plugin::get_instance()->options();
307 if ( isset( $tracking_options['method'] ) && 'frontend' == $tracking_options['method'] && isset( $this->output['placement_id'] ) ) {
308 $new_ad['placement_id'] = $this->output['placement_id'];
309 }
310
311 }
312
313 $advads->current_ads[] = $new_ad;
314 }
315
316 // action when output is created
317 do_action( 'advanced-ads-output', $this, $output, $output_options );
318
319 return apply_filters( 'advanced-ads-output-final', $output, $this, $output_options );
320 }
321
322 /**
323 * check if the ad can be displayed in frontend due to its own conditions
324 *
325 * @since 1.0.0
326 * @param array $check_options check options
327 * @return bool $can_display true if can be displayed in frontend
328 */
329 public function can_display( $check_options = array() ) {
330 $check_options = wp_parse_args( $check_options, array( 'passive_cache_busting' => false, 'ignore_debugmode' => false ) );
331
332 // prevent ad to show up through wp_head, if this is not a header placement
333 if( doing_action( 'wp_head' ) && isset( $this->options['placement_type'] ) && 'header' !== $this->options['placement_type'] ){
334 return false;
335 }
336
337 // Check If the current ad is requested using a shortcode placed in the content of the current ad.
338 if ( isset( $this->options['shortcode_ad_id'] ) && (int) $this->options['shortcode_ad_id'] === $this->id ) {
339 return false;
340 }
341
342 // force ad display if debug mode is enabled
343 if( isset( $this->output['debugmode'] ) && ! $check_options['ignore_debugmode'] ) {
344 return true;
345 }
346
347 if ( ! $check_options['passive_cache_busting'] ) {
348 // don’t display ads that are not published or private for users not logged in
349 if ( $this->status !== 'publish' && ! ($this->status === 'private' && is_user_logged_in() ) ) {
350 return false;
351 }
352
353 if ( ! $this->can_display_by_visitor() || ! $this->can_display_by_expiry_date() ) {
354 return false;
355 }
356 } else {
357 if ( $this->status !== 'publish' || ! $this->can_display_by_expiry_date() ) {
358 return false;
359 }
360 }
361
362 // add own conditions to flag output as possible or not
363 $can_display = apply_filters( 'advanced-ads-can-display', true, $this, $check_options );
364
365 return $can_display;
366 }
367
368 /**
369 * check visitor conditions
370 *
371 * @since 1.1.0
372 * @return bool $can_display true if can be displayed in frontend based on visitor settings
373 */
374 public function can_display_by_visitor(){
375 if ( ! empty( $this->options['wp_the_query']['is_feed'] ) ) {
376 return true;
377 }
378
379 // check old "visitor" and new "visitors" conditions
380 if ( ( empty($this->options['visitors']) ||
381 ! is_array( $this->options['visitors'] ) )
382 && ( empty($this->options['visitor']) ||
383 ! is_array( $this->options['visitor'] )
384 )) { return true; }
385
386 if ( isset( $this->options['visitors'] ) && is_array( $this->options['visitors'] ) ) {
387
388 $visitor_conditions = $this->options['visitors'];
389
390 $last_result = false;
391 $length = count( $visitor_conditions );
392
393 for($i = 0; $i < $length; ++$i) {
394 $_condition = current( $visitor_conditions );
395 // ignore OR if last result was true
396 if( $last_result && isset( $_condition['connector'] ) && 'or' === $_condition['connector'] ){
397 next( $visitor_conditions );
398 continue;
399 }
400 $last_result = $result = Advanced_Ads_Visitor_Conditions::frontend_check( $_condition, $this );
401 if( ! $result ) {
402 // return false only, if the next condition doesn’t have an OR operator
403 $next = next( $visitor_conditions );
404 if( ! isset( $next['connector'] ) || $next['connector'] !== 'or' ) {
405 return false;
406 }
407 } else {
408 next( $visitor_conditions );
409 }
410 }
411 }
412
413 /**
414 * "old" visitor conditions
415 *
416 * @deprecated since version 1.5.4
417 */
418
419 if ( empty($this->options['visitor']) ||
420 ! is_array( $this->options['visitor'] ) ) { return true; }
421 $visitor_conditions = $this->options( 'visitor' );
422
423 // check mobile condition
424 if ( isset($visitor_conditions['mobile']) ){
425 switch ( $visitor_conditions['mobile'] ){
426 case 'only' :
427 if ( ! wp_is_mobile() ) { return false; }
428 break;
429 case 'no' :
430 if ( wp_is_mobile() ) { return false; }
431 break;
432 }
433 }
434
435 return true;
436 }
437
438 /**
439 * check expiry date
440 *
441 * @since 1.3.15
442 * @return bool $can_display true if can be displayed in frontend based on expiry date
443 */
444 public function can_display_by_expiry_date(){
445
446 // if expiry_date is not set, null is returned
447 $ad_expiry_date = (int) $this->options( 'expiry_date' );
448
449 if ( $ad_expiry_date <= 0 || $ad_expiry_date > time() ) {
450 return true;
451 }
452
453 // set status to 'draft' if the ad is expired
454 if ( $this->status !== 'draft' ) {
455 wp_update_post( array( 'ID' => $this->id, 'post_status' => 'draft' ) );
456 /**
457 * Run when an ad expires
458 */
459 do_action( 'advanced-ads-ad-expired', $this->id, $this );
460 }
461
462 return false;
463 }
464
465 /**
466 * save an ad to the database
467 * takes values from the current state
468 */
469 public function save(){
470 global $wpdb;
471
472 // remove slashes from content
473 $this->content = $this->prepare_content_to_save();
474
475 $where = array('ID' => $this->id);
476 $wpdb->update( $wpdb->posts, array( 'post_content' => $this->content ), $where );
477
478 // clean post from object cache
479 clean_post_cache( $this->id );
480
481 // sanitize conditions
482 // see sanitize_conditions function for example on using this filter
483 $conditions = self::sanitize_conditions_on_save( $this->conditions );
484
485 // save other options to post meta field
486 $options = $this->options();
487
488 $options['type'] = $this->type;
489 $options['url'] = $this->url;
490 // Inform the tracking add-on about the new url.
491 unset ( $options['tracking']['link'] );
492 $options['width'] = $this->width;
493 $options['height'] = $this->height;
494 $options['conditions'] = $conditions;
495 $options['expiry_date'] = $this->expiry_date;
496 $options['description'] = $this->description;
497
498 // filter to manipulate options or add more to be saved
499 $options = apply_filters( 'advanced-ads-save-options', $options, $this );
500
501 update_post_meta( $this->id, self::$options_meta_field, $options );
502 }
503
504 /**
505 * native filter for content field before being saved
506 *
507 * @return string $content ad content
508 * @since 1.0.0
509 */
510 public function prepare_content_to_save() {
511
512 $content = $this->content;
513
514 // load ad type specific parameter filter
515 // @todo this is just a hotfix for type_obj not set, yet the cause is still unknown
516 if(is_object( $this->type_obj )){
517 $content = $this->type_obj->sanitize_content( $content );
518 }
519 // apply a custom filter by ad type
520 $content = apply_filters( 'advanced-ads-pre-ad-save-' . $this->type, $content );
521
522 return $content;
523 }
524
525 /**
526 * native filter for ad parameters before being saved
527 *
528 * @return arr $parameters sanitized parameters
529 */
530 public function prepare_parameters_to_save() {
531
532 $parameters = $this->parameters;
533 // load ad type specific parameter filter
534 $parameters = $this->type_obj->sanitize_parameters( $parameters );
535
536 // apply native WP filter for content fields
537 return $parameters;
538 }
539
540 /**
541 * prepare ads output
542 *
543 */
544 public function prepare_frontend_output() {
545 $options = $this->options();
546
547 if ( isset( $options['change-ad']['content'] ) ) {
548 // output was provided by the user
549 $output = $options['change-ad']['content'];
550 } else {
551 // load ad type specific content filter
552 $output = $this->type_obj->prepare_output( $this );
553 }
554
555 // don’t deliver anything, if main ad content is empty
556 if ( $output == '' ) {
557 return;
558 }
559
560 if ( ! $this->is_head_placement ) {
561 // filter to manipulate the output before the wrapper is added
562 $output = apply_filters( 'advanced-ads-output-inside-wrapper', $output, $this );
563
564 if ( $this->label ) {
565 $output = $this->label . $output;
566 }
567
568 // build wrapper around the ad
569 $output = $this->add_wrapper( $output );
570
571 // add a clearfix, if set
572 if ( isset($this->output['clearfix']) && $this->output['clearfix'] ){
573 $output .= '<br style="clear: both; display: block; float: none;"/>';
574 }
575 }
576
577
578 // apply a custom filter by ad type
579 $output = apply_filters( 'advanced-ads-ad-output', $output, $this );
580
581 return $output;
582 }
583
584 /**
585 * sanitize ad display conditions when saving the ad
586 *
587 * @param array $conditions conditions array send via the dashboard form for an ad
588 * @return array with sanitized conditions
589 * @since 1.0.0
590 */
591 public function sanitize_conditions_on_save($conditions = array()){
592
593 global $advanced_ads_ad_conditions;
594
595 if ( ! is_array( $conditions ) || $conditions == array() ) { return array(); }
596
597 foreach ( $conditions as $_key => $_condition ){
598 if ( $_key == 'postids' ){
599 // sanitize single post conditions
600 if ( empty($_condition['ids']) ){ // remove, if empty
601 $_condition['include'] = array();
602 $_condition['exclude'] = array();
603 } elseif( isset( $_condition['method'] ) ) {
604 switch ( $_condition['method'] ){
605 case 'include' :
606 $_condition['include'] = $_condition['ids'];
607 $_condition['exclude'] = array();
608 break;
609 case 'exclude' :
610 $_condition['include'] = array();
611 $_condition['exclude'] = $_condition['ids'];
612 break;
613 }
614 }
615 } else {
616 if ( ! is_array( $_condition ) ) {
617 $_condition = trim( $_condition ); }
618 if ( $_condition == '' ) {
619 $conditions[$_key] = $_condition;
620 continue;
621 }
622 }
623 $type = ! empty($advanced_ads_ad_conditions[$_key]['type']) ? $advanced_ads_ad_conditions[$_key]['type'] : 0;
624 if ( empty($type) ) { continue; }
625
626 // dynamically apply filters for each condition used
627 $conditions[$_key] = apply_filters( 'advanced-ads-sanitize-condition-' . $type, $_condition );
628 }
629 return $conditions;
630 }
631
632 /**
633 * sanitize id input field(s) for pattern /1,2,3,4/
634 *
635 * @pararm array/string $cond input string/array
636 * @return array/string $cond sanitized string/array
637 */
638 public static function sanitize_condition_idfield($cond = ''){
639 // strip anything that is not comma or number
640
641 if ( is_array( $cond ) ){
642 foreach ( $cond as $_key => $_cond ){
643 $cond[$_key] = preg_replace( '#[^0-9,]#', '', $_cond );
644 }
645 } else {
646 $cond = preg_replace( '#[^0-9,]#', '', $cond );
647 }
648 return $cond;
649 }
650
651 /**
652 * sanitize radio input field
653 *
654 * @pararm string $string input string
655 * @return string $string sanitized string
656 */
657 public static function sanitize_condition_radio($string = ''){
658 // only allow 0, 1 and empty
659 return $string = preg_replace( '#[^01]#', '', $string );
660 }
661
662 /**
663 * sanitize comma seperated text input field
664 *
665 * @pararm array/string $cond input string/array
666 * @return array/string $cond sanitized string/array
667 */
668 public static function sanitize_condition_textvalues($cond = ''){
669 // strip anything that is not comma, alphanumeric, minus and underscore
670 if ( is_array( $cond ) ){
671 foreach ( $cond as $_key => $_cond ){
672 $cond[$_key] = preg_replace( '#[^0-9,A-Za-z-_]#', '', $_cond );
673 }
674 } else {
675 $cond = preg_replace( '#[^0-9,A-Za-z-_]#', '', $cond );
676 }
677 return $cond;
678 }
679
680 /**
681 * load wrapper options set with the ad
682 *
683 * @since 1.3
684 * @return arr $wrapper options array ready to be use in add_wrapper() function
685 */
686 protected function load_wrapper_options(){
687 $wrapper = array();
688
689 // print_r($this->output);
690
691 $position = ! empty( $this->output['position'] ) ? $this->output['position'] : '';
692 $use_placement_pos = false;
693
694 if ( ! isset( $this->args['previous_method'] ) || 'group' !== $this->args['previous_method'] ) {
695 if ( isset($this->output['class'] ) && is_array( $this->output['class'] ) ) {
696 $wrapper['class'] = $this->output['class'];
697 }
698 if ( ! empty( $this->args['placement_position'] ) ) {
699 // If not group, Set placement position instead of ad position.
700 $use_placement_pos = true;
701 $position = $this->args['placement_position'];
702 }
703 }
704
705 switch ( $position ) {
706 case 'left' :
707 $wrapper['style']['float'] = 'left';
708 break;
709 case 'right' :
710 $wrapper['style']['float'] = 'right';
711 break;
712 case 'center' :
713 if ( ! empty ( $this->output['add_wrapper_sizes'] ) ) {
714 $wrapper['style']['margin-left'] = 'auto';
715 $wrapper['style']['margin-right'] = 'auto';
716
717 if ( $use_placement_pos ) {
718 $wrapper['style']['text-align'] = 'center';
719 }
720 } else {
721 $wrapper['style']['text-align'] = 'center';
722 }
723
724 // add css rule after wrapper to center the ad
725 // add_filter( 'advanced-ads-output-wrapper-after-content', array( $this, 'center_ad_content' ), 10, 2 );
726 break;
727 case 'clearfix' :
728 $wrapper['style']['clear'] = 'both';
729 break;
730 }
731
732 // add manual classes
733 if ( isset($this->output['wrapper-class']) && '' !== $this->output['wrapper-class'] ) {
734 $classes = explode( ' ', $this->output['wrapper-class'] );
735
736 foreach( $classes as $_class ){
737 $wrapper['class'][] = sanitize_text_field( $_class );
738 }
739 }
740
741 if ( ! empty($this->output['margin']['top']) ) {
742 $wrapper['style']['margin-top'] = intval( $this->output['margin']['top'] ) . 'px';
743 }
744 if ( ! empty($this->output['margin']['right']) ) {
745 $wrapper['style']['margin-right'] = intval( $this->output['margin']['right'] ) . 'px';
746 }
747 if ( ! empty($this->output['margin']['bottom']) ) {
748 $wrapper['style']['margin-bottom'] = intval( $this->output['margin']['bottom'] ) . 'px';
749 }
750 if ( ! empty($this->output['margin']['left']) ) {
751 $wrapper['style']['margin-left'] = intval( $this->output['margin']['left'] ) . 'px';
752 }
753
754 if ( ! empty ($this->output['add_wrapper_sizes'] ) ) {
755 $wrapper['style']['width'] = intval( $this->width ) . 'px';
756 $wrapper['style']['height'] = intval( $this->height ) . 'px';
757 }
758
759 if ( ! empty( $this->output['clearfix_before'] ) ) {
760 $wrapper['style']['clear'] = 'both';
761 }
762
763
764 return $wrapper;
765 }
766
767 /**
768 * add a wrapper arount the ad content if wrapper information are given
769 *
770 * @since 1.1.4
771 * @param str $ad_content content of the ad
772 * @return str $wrapper ad within the wrapper
773 */
774 protected function add_wrapper($ad_content = ''){
775 $wrapper_options = apply_filters( 'advanced-ads-output-wrapper-options', $this->wrapper, $this );
776
777 if ( ( ! isset( $this->output['wrapper-id'] ) || '' === $this->output['wrapper-id'] )
778 && $wrapper_options == array() || ! is_array( $wrapper_options ) ) { return $ad_content; }
779
780 // create unique id if not yet given
781 if ( empty($wrapper_options['id']) ){
782 $this->wrapper['id'] = $wrapper_options['id'] = $this->create_wrapper_id();
783 }
784
785 // add edit button for users with the appropriate rights
786 if( ! defined( 'ADVANCED_ADS_DISABLE_EDIT_BAR' ) && current_user_can( Advanced_Ads_Plugin::user_cap( 'advanced_ads_edit_ads') ) ){
787 ob_start();
788 include ADVADS_BASE_PATH . 'public/views/ad-edit-bar.php';
789 $ad_content = ob_get_clean() . $ad_content;
790 }
791
792 // build the box
793 $wrapper = '<div' . Advanced_Ads_Utils::build_html_attributes( $wrapper_options ) . '>';
794 $wrapper .= apply_filters( 'advanced-ads-output-wrapper-before-content', '', $this );
795 $wrapper .= $ad_content;
796 $wrapper .= apply_filters( 'advanced-ads-output-wrapper-after-content', '', $this );
797 $wrapper .= '</div>';
798
799 return $wrapper;
800 }
801
802 /**
803 * function to add css rule after the ad to center its content
804 *
805 * @since 1.6.9.5
806 * @param str $output additional output in wrapper after content
807 * @param obj $ad Advanced_Ads_Ad object
808 * @return str $output
809 *
810 */
811 /*public function center_ad_content( $output, Advanced_Ads_Ad $ad ){
812
813 // no additional check needed, because the hook is only called when the ad is centered
814 if( isset( $ad->wrapper['id'] )){
815 // does not work with most div elements, so actually not used now
816 $output .= '<style type="text/css">#'. $ad->wrapper['id'] . ' img, #'. $ad->wrapper['id'] . ' div { display: inline !important; }</style>';
817 }
818
819 return $output;
820 }*/
821
822 /**
823 * create a random wrapper id
824 *
825 * @since 1.1.4
826 * @return string $id random id string
827 */
828 private function create_wrapper_id(){
829
830 if( isset( $this->output['wrapper-id'] )){
831 $id = sanitize_key( $this->output['wrapper-id'] );
832 if( '' !== $id ){
833 return $id;
834 }
835 }
836
837 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
838
839 return $prefix . mt_rand();
840 }
841
842 /**
843 * Create an "Advertisement" label if conditions are met.
844 */
845 public function maybe_create_label() {
846 $placement_state = isset( $this->args['ad_label'] ) ? $this->args['ad_label'] : 'default';
847
848 if ( $this->type !== 'group' &&
849 $label = Advanced_Ads::get_instance()->get_label( $placement_state )
850 ) {
851 $this->label = $label;
852 }
853 }
854
855 /**
856 * Get the ad url.
857 *
858 * @return string
859 */
860 private function get_url() {
861 $this->url = $this->options( 'url' );
862
863 // If the tracking add-on is not active.
864 if ( ! defined( 'AAT_VERSION' ) ) {
865 global $pagenow;
866 // If this is not the ad edit page.
867 if ( 'post.php' !== $pagenow && 'post-new.php' !== $pagenow ) {
868 // Remove placeholders.
869 $this->url = str_replace( array( '[POST_ID]', '[POST_SLUG]', '[CAT_SLUG]', '[AD_ID]' ), '', $this->url );
870 }
871 }
872 return $this->url;
873 }
874
875
876
877 }
878