PluginProbe ʕ •ᴥ•ʔ
Advanced Ads – Ad Manager & AdSense / 1.10.8
Advanced Ads – Ad Manager & AdSense v1.10.8
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 8 years ago ad-debug.php 8 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 8 years ago ad_type_dummy.php 8 years ago ad_type_group.php 8 years ago ad_type_image.php 7 years ago ad_type_plain.php 8 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 9 years ago utils.php 7 years ago visitor-conditions.php 7 years ago widget.php 7 years ago
ad.php
840 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->options( '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
450 return false;
451 }
452
453 /**
454 * save an ad to the database
455 * takes values from the current state
456 */
457 public function save(){
458 global $wpdb;
459
460 // remove slashes from content
461 $this->content = $this->prepare_content_to_save();
462
463 $where = array('ID' => $this->id);
464 $wpdb->update( $wpdb->posts, array( 'post_content' => $this->content ), $where );
465
466 // clean post from object cache
467 clean_post_cache( $this->id );
468
469 // sanitize conditions
470 // see sanitize_conditions function for example on using this filter
471 $conditions = self::sanitize_conditions_on_save( $this->conditions );
472
473 // save other options to post meta field
474 $options = $this->options();
475
476 $options['type'] = $this->type;
477 $options['url'] = $this->url;
478 $options['width'] = $this->width;
479 $options['height'] = $this->height;
480 $options['conditions'] = $conditions;
481 $options['expiry_date'] = $this->expiry_date;
482 $options['description'] = $this->description;
483
484 // filter to manipulate options or add more to be saved
485 $options = apply_filters( 'advanced-ads-save-options', $options, $this );
486
487 update_post_meta( $this->id, self::$options_meta_field, $options );
488 }
489
490 /**
491 * native filter for content field before being saved
492 *
493 * @return string $content ad content
494 * @since 1.0.0
495 */
496 public function prepare_content_to_save() {
497
498 $content = $this->content;
499
500 // load ad type specific parameter filter
501 // @todo this is just a hotfix for type_obj not set, yet the cause is still unknown
502 if(is_object( $this->type_obj )){
503 $content = $this->type_obj->sanitize_content( $content );
504 }
505 // apply a custom filter by ad type
506 $content = apply_filters( 'advanced-ads-pre-ad-save-' . $this->type, $content );
507
508 return $content;
509 }
510
511 /**
512 * native filter for ad parameters before being saved
513 *
514 * @return arr $parameters sanitized parameters
515 */
516 public function prepare_parameters_to_save() {
517
518 $parameters = $this->parameters;
519 // load ad type specific parameter filter
520 $parameters = $this->type_obj->sanitize_parameters( $parameters );
521
522 // apply native WP filter for content fields
523 return $parameters;
524 }
525
526 /**
527 * prepare ads output
528 *
529 */
530 public function prepare_frontend_output() {
531 $options = $this->options();
532
533 if ( isset( $options['change-ad']['content'] ) ) {
534 // output was provided by the user
535 $output = $options['change-ad']['content'];
536 } else {
537 // load ad type specific content filter
538 $output = $this->type_obj->prepare_output( $this );
539 }
540
541 // don’t deliver anything, if main ad content is empty
542 if ( $output == '' ) {
543 return;
544 }
545
546 if ( ! $this->is_head_placement ) {
547 // filter to manipulate the output before the wrapper is added
548 $output = apply_filters( 'advanced-ads-output-inside-wrapper', $output, $this );
549
550 if ( $this->label ) {
551 $output = $this->label . $output;
552 }
553
554 // add edit button for users with the appropriate rights
555 if( current_user_can( Advanced_Ads_Plugin::user_cap( 'advanced_ads_edit_ads') ) ){
556 ob_start();
557 include ADVADS_BASE_PATH . 'public/views/ad-edit-bar.php';
558 $output = ob_get_clean() . $output;
559 }
560
561 // build wrapper around the ad
562 $output = $this->add_wrapper( $output );
563
564 // add a clearfix, if set
565 if ( isset($this->output['clearfix']) && $this->output['clearfix'] ){
566 $output .= '<br style="clear: both; display: block; float: none;"/>';
567 }
568 }
569
570
571 // apply a custom filter by ad type
572 $output = apply_filters( 'advanced-ads-ad-output', $output, $this );
573
574 return $output;
575 }
576
577 /**
578 * sanitize ad display conditions when saving the ad
579 *
580 * @param array $conditions conditions array send via the dashboard form for an ad
581 * @return array with sanitized conditions
582 * @since 1.0.0
583 */
584 public function sanitize_conditions_on_save($conditions = array()){
585
586 global $advanced_ads_ad_conditions;
587
588 if ( ! is_array( $conditions ) || $conditions == array() ) { return array(); }
589
590 foreach ( $conditions as $_key => $_condition ){
591 if ( $_key == 'postids' ){
592 // sanitize single post conditions
593 if ( empty($_condition['ids']) ){ // remove, if empty
594 $_condition['include'] = array();
595 $_condition['exclude'] = array();
596 } elseif( isset( $_condition['method'] ) ) {
597 switch ( $_condition['method'] ){
598 case 'include' :
599 $_condition['include'] = $_condition['ids'];
600 $_condition['exclude'] = array();
601 break;
602 case 'exclude' :
603 $_condition['include'] = array();
604 $_condition['exclude'] = $_condition['ids'];
605 break;
606 }
607 }
608 } else {
609 if ( ! is_array( $_condition ) ) {
610 $_condition = trim( $_condition ); }
611 if ( $_condition == '' ) {
612 $conditions[$_key] = $_condition;
613 continue;
614 }
615 }
616 $type = ! empty($advanced_ads_ad_conditions[$_key]['type']) ? $advanced_ads_ad_conditions[$_key]['type'] : 0;
617 if ( empty($type) ) { continue; }
618
619 // dynamically apply filters for each condition used
620 $conditions[$_key] = apply_filters( 'advanced-ads-sanitize-condition-' . $type, $_condition );
621 }
622 return $conditions;
623 }
624
625 /**
626 * sanitize id input field(s) for pattern /1,2,3,4/
627 *
628 * @pararm array/string $cond input string/array
629 * @return array/string $cond sanitized string/array
630 */
631 public static function sanitize_condition_idfield($cond = ''){
632 // strip anything that is not comma or number
633
634 if ( is_array( $cond ) ){
635 foreach ( $cond as $_key => $_cond ){
636 $cond[$_key] = preg_replace( '#[^0-9,]#', '', $_cond );
637 }
638 } else {
639 $cond = preg_replace( '#[^0-9,]#', '', $cond );
640 }
641 return $cond;
642 }
643
644 /**
645 * sanitize radio input field
646 *
647 * @pararm string $string input string
648 * @return string $string sanitized string
649 */
650 public static function sanitize_condition_radio($string = ''){
651 // only allow 0, 1 and empty
652 return $string = preg_replace( '#[^01]#', '', $string );
653 }
654
655 /**
656 * sanitize comma seperated text input field
657 *
658 * @pararm array/string $cond input string/array
659 * @return array/string $cond sanitized string/array
660 */
661 public static function sanitize_condition_textvalues($cond = ''){
662 // strip anything that is not comma, alphanumeric, minus and underscore
663 if ( is_array( $cond ) ){
664 foreach ( $cond as $_key => $_cond ){
665 $cond[$_key] = preg_replace( '#[^0-9,A-Za-z-_]#', '', $_cond );
666 }
667 } else {
668 $cond = preg_replace( '#[^0-9,A-Za-z-_]#', '', $cond );
669 }
670 return $cond;
671 }
672
673 /**
674 * load wrapper options set with the ad
675 *
676 * @since 1.3
677 * @return arr $wrapper options array ready to be use in add_wrapper() function
678 */
679 protected function load_wrapper_options(){
680 $wrapper = array();
681
682 // print_r($this->output);
683
684 $position = ! empty( $this->output['position'] ) ? $this->output['position'] : '';
685 $use_placement_pos = false;
686
687 if ( ! isset( $this->args['previous_method'] ) || 'group' !== $this->args['previous_method'] ) {
688 if ( isset($this->output['class'] ) && is_array( $this->output['class'] ) ) {
689 $wrapper['class'] = $this->output['class'];
690 }
691
692 if ( ! empty( $this->args['placement_position'] ) ) {
693 $use_placement_pos = true;
694 $position = $this->args['placement_position'];
695 }
696 }
697
698 switch ( $position ) {
699 case 'left' :
700 $wrapper['style']['float'] = 'left';
701 break;
702 case 'right' :
703 $wrapper['style']['float'] = 'right';
704 break;
705 case 'center' :
706 if ( ! empty ( $this->output['add_wrapper_sizes'] ) && ! $use_placement_pos ) {
707 $wrapper['style']['margin-left'] = 'auto';
708 $wrapper['style']['margin-right'] = 'auto';
709 } else {
710 $wrapper['style']['text-align'] = 'center';
711 }
712
713 // add css rule after wrapper to center the ad
714 // add_filter( 'advanced-ads-output-wrapper-after-content', array( $this, 'center_ad_content' ), 10, 2 );
715 break;
716 case 'clearfix' :
717 $wrapper['style']['clear'] = 'both';
718 break;
719 }
720
721 // add manual classes
722 if ( isset($this->output['wrapper-class']) && '' !== $this->output['wrapper-class'] ) {
723 $classes = explode( ' ', $this->output['wrapper-class'] );
724
725 foreach( $classes as $_class ){
726 $wrapper['class'][] = sanitize_text_field( $_class );
727 }
728 }
729
730 if ( ! empty($this->output['margin']['top']) ) {
731 $wrapper['style']['margin-top'] = intval( $this->output['margin']['top'] ) . 'px';
732 }
733 if ( ! empty($this->output['margin']['right']) ) {
734 $wrapper['style']['margin-right'] = intval( $this->output['margin']['right'] ) . 'px';
735 }
736 if ( ! empty($this->output['margin']['bottom']) ) {
737 $wrapper['style']['margin-bottom'] = intval( $this->output['margin']['bottom'] ) . 'px';
738 }
739 if ( ! empty($this->output['margin']['left']) ) {
740 $wrapper['style']['margin-left'] = intval( $this->output['margin']['left'] ) . 'px';
741 }
742
743 if ( ! empty ($this->output['add_wrapper_sizes'] ) ) {
744 $wrapper['style']['width'] = intval( $this->width ) . 'px';
745 $wrapper['style']['height'] = intval( $this->height ) . 'px';
746 }
747
748 if ( ! empty( $this->output['clearfix_before'] ) ) {
749 $wrapper['style']['clear'] = 'both';
750 }
751
752
753 return $wrapper;
754 }
755
756 /**
757 * add a wrapper arount the ad content if wrapper information are given
758 *
759 * @since 1.1.4
760 * @param str $ad_content content of the ad
761 * @return str $wrapper ad within the wrapper
762 */
763 protected function add_wrapper($ad_content = ''){
764 $wrapper_options = apply_filters( 'advanced-ads-output-wrapper-options', $this->wrapper, $this );
765
766 if ( ( ! isset( $this->output['wrapper-id'] ) || '' === $this->output['wrapper-id'] )
767 && $wrapper_options == array() || ! is_array( $wrapper_options ) ) { return $ad_content; }
768
769 // create unique id if not yet given
770 if ( empty($wrapper_options['id']) ){
771 $this->wrapper['id'] = $wrapper_options['id'] = $this->create_wrapper_id();
772 }
773
774 // build the box
775 $wrapper = '<div' . Advanced_Ads_Utils::build_html_attributes( $wrapper_options ) . '>';
776 $wrapper .= apply_filters( 'advanced-ads-output-wrapper-before-content', '', $this );
777 $wrapper .= $ad_content;
778 $wrapper .= apply_filters( 'advanced-ads-output-wrapper-after-content', '', $this );
779 $wrapper .= '</div>';
780
781 return $wrapper;
782 }
783
784 /**
785 * function to add css rule after the ad to center its content
786 *
787 * @since 1.6.9.5
788 * @param str $output additional output in wrapper after content
789 * @param obj $ad Advanced_Ads_Ad object
790 * @return str $output
791 *
792 */
793 /*public function center_ad_content( $output, Advanced_Ads_Ad $ad ){
794
795 // no additional check needed, because the hook is only called when the ad is centered
796 if( isset( $ad->wrapper['id'] )){
797 // does not work with most div elements, so actually not used now
798 $output .= '<style type="text/css">#'. $ad->wrapper['id'] . ' img, #'. $ad->wrapper['id'] . ' div { display: inline !important; }</style>';
799 }
800
801 return $output;
802 }*/
803
804 /**
805 * create a random wrapper id
806 *
807 * @since 1.1.4
808 * @return string $id random id string
809 */
810 private function create_wrapper_id(){
811
812 if( isset( $this->output['wrapper-id'] )){
813 $id = sanitize_key( $this->output['wrapper-id'] );
814 if( '' !== $id ){
815 return $id;
816 }
817 }
818
819 $prefix = Advanced_Ads_Plugin::get_instance()->get_frontend_prefix();
820
821 return $prefix . mt_rand();
822 }
823
824 /**
825 * Create an "Advertisement" label if conditions are met.
826 */
827 public function maybe_create_label() {
828 $placement_state = isset( $this->args['ad_label'] ) ? $this->args['ad_label'] : 'default';
829
830 if ( $this->type !== 'group' &&
831 $label = Advanced_Ads::get_instance()->get_label( $placement_state )
832 ) {
833 $this->label = $label;
834 }
835 }
836
837
838
839 }
840