Completed
Push — update/only-hide-cards-if-rewi... ( 1d27cc...55885e )
by
unknown
215:14 queued 204:17
created

WordAds::insert_head_iponweb()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 2
nop 0
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
1
<?php
2
3
define( 'WORDADS_ROOT', dirname( __FILE__ ) );
4
define( 'WORDADS_BASENAME', plugin_basename( __FILE__ ) );
5
define( 'WORDADS_FILE_PATH', WORDADS_ROOT . '/' . basename( __FILE__ ) );
6
define( 'WORDADS_URL', plugins_url( '/', __FILE__ ) );
7
define( 'WORDADS_API_TEST_ID', '26942' );
8
define( 'WORDADS_API_TEST_ID2', '114160' );
9
10
require_once( WORDADS_ROOT . '/php/widgets.php' );
11
require_once( WORDADS_ROOT . '/php/api.php' );
12
require_once( WORDADS_ROOT . '/php/cron.php' );
13
14
class WordAds {
15
16
	public $params = null;
17
18
	/**
19
	 * The different supported ad types.
20
	 * v0.1 - mrec only for now
21
	 * @var array
22
	 */
23
	public static $ad_tag_ids = array(
24
		'mrec' => array(
25
			'tag'       => '300x250_mediumrectangle',
26
			'height'    => '250',
27
			'width'     => '300',
28
		),
29
		'lrec' => array(
30
			'tag'       => '336x280_largerectangle',
31
			'height'    => '280',
32
			'width'     => '336',
33
		),
34
		'leaderboard' => array(
35
			'tag'       => '728x90_leaderboard',
36
			'height'    => '90',
37
			'width'     => '728',
38
		),
39
		'wideskyscraper' => array(
40
			'tag'       => '160x600_wideskyscraper',
41
			'height'    => '600',
42
			'width'     => '160',
43
		),
44
	);
45
46
	/**
47
	 * Convenience function for grabbing options from params->options
48
	 * @param  string $option the option to grab
49
	 * @param  mixed  $default (optional)
50
	 * @return option or $default if not set
51
	 *
52
	 * @since 4.5.0
53
	 */
54
	function option( $option, $default = false ) {
55
		if ( ! isset( $this->params->options[ $option ] ) ) {
56
			return $default;
57
		}
58
59
		return $this->params->options[ $option ];
60
	}
61
62
	/**
63
	 * Instantiate the plugin
64
	 *
65
	 * @since 4.5.0
66
	 */
67
	function __construct() {
68
		add_action( 'init', array( $this, 'init' ) );
69
	}
70
71
	/**
72
	 * Code to run on WordPress 'init' hook
73
	 *
74
	 * @since 4.5.0
75
	 */
76
	function init() {
77
		// bail on infinite scroll
78
		if ( self::is_infinite_scroll() ) {
79
			return;
80
		}
81
82
		require_once( WORDADS_ROOT . '/php/params.php' );
83
		$this->params = new WordAds_Params();
84
85
		if ( is_admin() ) {
86
			require_once( WORDADS_ROOT . '/php/admin.php' );
87
			return;
88
		}
89
90
		if ( $this->should_bail() ) {
91
			return;
92
		}
93
94
		$this->insert_adcode();
95
	}
96
97
	/**
98
	 * Check for Jetpack's The_Neverending_Home_Page and use got_infinity
99
	 * @return boolean true if load came from infinite scroll
100
	 *
101
	 * @since 4.5.0
102
	 */
103
	public static function is_infinite_scroll() {
104
		return class_exists( 'The_Neverending_Home_Page' ) && The_Neverending_Home_Page::got_infinity();
105
	}
106
107
	/**
108
	 * Add the actions/filters to insert the ads. Checks for mobile or desktop.
109
	 *
110
	 * @since 4.5.0
111
	 */
112
	private function insert_adcode() {
113
		add_action( 'wp_head', array( $this, 'insert_head_meta' ), 20 );
114
		add_action( 'wp_head', array( $this, 'insert_head_iponweb' ), 30 );
115
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
116
117
		/**
118
		 * Filters enabling ads in `the_content` filter
119
		 *
120
		 * @see https://jetpack.com/support/ads/
121
		 *
122
		 * @module wordads
123
		 *
124
		 * @since 5.8.0
125
		 *
126
		 * @param bool True to disable ads in `the_content`
127
		 */
128
		if ( ! apply_filters( 'wordads_content_disable', false ) ) {
129
			add_filter( 'the_content', array( $this, 'insert_ad' ) );
130
		}
131
132
		/**
133
		 * Filters enabling ads in `the_excerpt` filter
134
		 *
135
		 * @see https://jetpack.com/support/ads/
136
		 *
137
		 * @module wordads
138
		 *
139
		 * @since 5.8.0
140
		 *
141
		 * @param bool True to disable ads in `the_excerpt`
142
		 */
143
		if ( ! apply_filters( 'wordads_excerpt_disable', false ) ) {
144
			add_filter( 'the_excerpt', array( $this, 'insert_ad' ) );
145
		}
146
147
		if ( $this->option( 'enable_header_ad', true ) ) {
148
			switch ( get_stylesheet() ) {
149
				case 'twentyseventeen':
150
				case 'twentyfifteen':
151
				case 'twentyfourteen':
152
					add_action( 'wp_footer', array( $this, 'insert_header_ad_special' ) );
153
					break;
154
				default:
155
					add_action( 'wp_head', array( $this, 'insert_header_ad' ), 100 );
156
					break;
157
			}
158
		}
159
	}
160
161
	/**
162
	 * Register desktop scripts and styles
163
	 *
164
	 * @since 4.5.0
165
	 */
166
	function enqueue_scripts() {
167
		wp_enqueue_style(
168
			'wordads',
169
			WORDADS_URL . 'css/style.css',
170
			array(),
171
			'2015-12-18'
172
		);
173
	}
174
175
	/**
176
	 * IPONWEB metadata used by the various scripts
177
	 * @return [type] [description]
0 ignored issues
show
Documentation introduced by
The doc-type [type] could not be parsed: Unknown type name "" at position 0. [(view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
178
	 */
179
	function insert_head_meta() {
180
		$themename = esc_js( get_stylesheet() );
181
		$pagetype = intval( $this->params->get_page_type_ipw() );
182
		$data_tags = ( $this->params->cloudflare ) ? ' data-cfasync="false"' : '';
183
		echo <<<HTML
184
		<script$data_tags type="text/javascript">
185
			var __ATA_PP = { pt: $pagetype, ht: 2, tn: '$themename', amp: false };
186
			var __ATA = __ATA || {};
187
			__ATA.cmd = __ATA.cmd || [];
188
			__ATA.criteo = __ATA.criteo || {};
189
			__ATA.criteo.cmd = __ATA.criteo.cmd || [];
190
		</script>
191
HTML;
192
	}
193
194
	/**
195
	 * IPONWEB scripts in <head>
196
	 *
197
	 * @since 4.5.0
198
	 */
199
	function insert_head_iponweb() {
200
		$data_tags = ( $this->params->cloudflare ) ? ' data-cfasync="false"' : '';
201
		echo <<<HTML
202
		<link rel='dns-prefetch' href='//s.pubmine.com' />
203
		<link rel='dns-prefetch' href='//x.bidswitch.net' />
204
		<link rel='dns-prefetch' href='//static.criteo.net' />
205
		<link rel='dns-prefetch' href='//ib.adnxs.com' />
206
		<link rel='dns-prefetch' href='//aax.amazon-adsystem.com' />
207
		<link rel='dns-prefetch' href='//bidder.criteo.com' />
208
		<link rel='dns-prefetch' href='//cas.criteo.com' />
209
		<link rel='dns-prefetch' href='//gum.criteo.com' />
210
		<link rel='dns-prefetch' href='//ads.pubmatic.com' />
211
		<link rel='dns-prefetch' href='//gads.pubmatic.com' />
212
		<link rel='dns-prefetch' href='//tpc.googlesyndication.com' />
213
		<link rel='dns-prefetch' href='//ad.doubleclick.net' />
214
		<link rel='dns-prefetch' href='//googleads.g.doubleclick.net' />
215
		<link rel='dns-prefetch' href='//www.googletagservices.com' />
216
		<link rel='dns-prefetch' href='//cdn.switchadhub.com' />
217
		<link rel='dns-prefetch' href='//delivery.g.switchadhub.com' />
218
		<link rel='dns-prefetch' href='//delivery.swid.switchadhub.com' />
219
		<script$data_tags async type="text/javascript" src="//s.pubmine.com/head.js"></script>
220
HTML;
221
	}
222
223
	/**
224
	 * Insert the ad onto the page
225
	 *
226
	 * @since 4.5.0
227
	 */
228
	function insert_ad( $content ) {
229
		// Ad JS won't work in XML feeds.
230
		if ( is_feed() ) {
231
			return $content;
232
		}
233
		/**
234
		 * Allow third-party tools to disable the display of in post ads.
235
		 *
236
		 * @module wordads
237
		 *
238
		 * @since 4.5.0
239
		 *
240
		 * @param bool true Should the in post unit be disabled. Default to false.
241
		 */
242
		$disable = apply_filters( 'wordads_inpost_disable', false );
243
		if ( ! $this->params->should_show() || $disable ) {
244
			return $content;
245
		}
246
247
		$ad_type = $this->option( 'wordads_house' ) ? 'house' : 'iponweb';
248
		return $content . $this->get_ad( 'belowpost', $ad_type );
249
	}
250
251
	/**
252
	 * Inserts ad into header
253
	 *
254
	 * @since 4.5.0
255
	 */
256
	function insert_header_ad() {
257
		/**
258
		 * Allow third-party tools to disable the display of header ads.
259
		 *
260
		 * @module wordads
261
		 *
262
		 * @since 4.5.0
263
		 *
264
		 * @param bool true Should the header unit be disabled. Default to false.
265
		 */
266
		if ( apply_filters( 'wordads_header_disable', false ) ) {
267
			return;
268
		}
269
270
		$ad_type = $this->option( 'wordads_house' ) ? 'house' : 'iponweb';
271
		echo $this->get_ad( 'top', $ad_type );
272
	}
273
274
	/**
275
	 * Special cases for inserting header unit via jQuery
276
	 *
277
	 * @since 4.5.0
278
	 */
279
	function insert_header_ad_special() {
280
		/**
281
		 * Allow third-party tools to disable the display of header ads.
282
		 *
283
		 * @module wordads
284
		 *
285
		 * @since 4.5.0
286
		 *
287
		 * @param bool true Should the header unit be disabled. Default to false.
288
		 */
289
		if ( apply_filters( 'wordads_header_disable', false ) ) {
290
			return;
291
		}
292
293
		$selector = '#content';
294
		switch ( get_stylesheet() ) {
295
			case 'twentyseventeen':
296
				$selector = '#content';
297
				break;
298
			case 'twentyfifteen':
299
				$selector = '#main';
300
				break;
301
			case 'twentyfourteen':
302
				$selector = 'article:first';
303
				break;
304
		}
305
306
		$ad_type = $this->option( 'wordads_house' ) ? 'house' : 'iponweb';
307
		echo $this->get_ad( 'top', $ad_type );
308
		echo <<<HTML
309
		<script type="text/javascript">
310
			jQuery('.wpcnt-header').insertBefore('$selector');
311
		</script>
312
HTML;
313
	}
314
315
	/**
316
	 * Get the ad for the spot and type.
317
	 * @param  string $spot top, side, or belowpost
318
	 * @param  string $type iponweb or adsense
319
	 */
320
	function get_ad( $spot, $type = 'iponweb' ) {
321
		$snippet = '';
322
		$blocker_unit = 'mrec';
0 ignored issues
show
Unused Code introduced by
$blocker_unit is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
323
		if ( 'iponweb' == $type ) {
324
			$section_id = WORDADS_API_TEST_ID;
0 ignored issues
show
Unused Code introduced by
$section_id is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
325
			$width = 300;
0 ignored issues
show
Unused Code introduced by
$width is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
326
			$height = 250;
0 ignored issues
show
Unused Code introduced by
$height is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
327
			$second_belowpost = '';
0 ignored issues
show
Unused Code introduced by
$second_belowpost is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
328
			$snippet = '';
329
			if ( 'top' == $spot ) {
330
				// mrec for mobile, leaderboard for desktop
331
				$section_id = 0 === $this->params->blog_id ? WORDADS_API_TEST_ID : $this->params->blog_id . '2';
332
				$width = $this->params->mobile_device ? 300 : 728;
333
				$height = $this->params->mobile_device ? 250 : 90;
334
				$blocker_unit = $this->params->mobile_device ? 'top_mrec' : 'top';
335
				$snippet = $this->get_ad_snippet( $section_id, $height, $width, $blocker_unit );
336
			} else if ( 'belowpost' == $spot ) {
337
				$section_id = 0 === $this->params->blog_id ? WORDADS_API_TEST_ID : $this->params->blog_id . '1';
338
				$width = 300;
339
				$height = 250;
340
341
				$snippet = $this->get_ad_snippet( $section_id, $height, $width, 'mrec', 'float:left;margin-right:5px;margin-top:0px;' );
342
				if ( $this->option( 'wordads_second_belowpost', true ) ) {
343
					$section_id2 = 0 === $this->params->blog_id ? WORDADS_API_TEST_ID2 : $this->params->blog_id . '4';
344
					$snippet .= $this->get_ad_snippet( $section_id2, $height, $width, 'mrec2', 'float:left;margin-top:0px;' );
345
				}
346
			}
347
		} else if ( 'house' == $type ) {
348
			$leaderboard = 'top' == $spot && ! $this->params->mobile_device;
349
			$snippet = $this->get_house_ad( $leaderboard ? 'leaderboard' : 'mrec' );
350
			if ( 'belowpost' == $spot && $this->option( 'wordads_second_belowpost', true ) ) {
351
				$snippet .= $this->get_house_ad( $leaderboard ? 'leaderboard' : 'mrec' );
352
			}
353
		}
354
355
		$header = 'top' == $spot ? 'wpcnt-header' : '';
356
		$about = __( 'Advertisements', 'jetpack' );
357
		return <<<HTML
358
		<div class="wpcnt $header">
359
			<div class="wpa">
360
				<span class="wpa-about">$about</span>
361
				<div class="u $spot">
362
					$snippet
363
				</div>
364
			</div>
365
		</div>
366
HTML;
367
	}
368
369
370
	/**
371
	 * Returns the snippet to be inserted into the ad unit
372
	 * @param  int $section_id
373
	 * @param  int $height
374
	 * @param  int $width
375
	 * @param  string $css
376
	 * @return string
377
	 *
378
	 * @since 5.7
379
	 */
380
	function get_ad_snippet( $section_id, $height, $width, $adblock_unit = 'mrec', $css = '' ) {
381
		$this->ads[] = array( 'id' => $section_id, 'width' => $width, 'height' => $height );
0 ignored issues
show
Bug introduced by
The property ads does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
382
		$data_tags = $this->params->cloudflare ? ' data-cfasync="false"' : '';
383
		$adblock_ad = $this->get_adblocker_ad( $adblock_unit );
384
385
		return <<<HTML
386
		<div style="padding-bottom:15px;width:{$width}px;height:{$height}px;$css">
387
			<div id="atatags-{$section_id}">
388
				<script$data_tags type="text/javascript">
389
				__ATA.cmd.push(function() {
390
					__ATA.initSlot('atatags-{$section_id}',  {
391
						collapseEmpty: 'before',
392
						sectionId: '{$section_id}',
393
						width: {$width},
394
						height: {$height}
395
					});
396
				});
397
				</script>
398
				$adblock_ad
399
			</div>
400
		</div>
401
HTML;
402
	}
403
404
	/**
405
	 * Get Criteo Acceptable Ad unit
406
	 * @param  string $unit mrec, mrec2, widesky, top, top_mrec
407
	 *
408
	 * @since 5.3
409
	 */
410
	public function get_adblocker_ad( $unit = 'mrec' ) {
411
		$data_tags = $this->params->cloudflare ? ' data-cfasync="false"' : '';
412
		$criteo_id = mt_rand();
413
		$height = 250;
414
		$width = 300;
415
		$zone_id = 388248;
416
		if ( 'mrec2' == $unit ) { // 2nd belowpost
417
			$zone_id = 837497;
418
		} else if ( 'widesky' == $unit ) { // sidebar
419
			$zone_id = 563902;
420
			$width = 160;
421
			$height= 600;
422
		} else if ( 'top' == $unit ) { // top leaderboard
423
			$zone_id = 563903;
424
			$width = 728;
425
			$height = 90;
426
		} else if ( 'top_mrec' == $unit ) { // top mrec
427
			$zone_id = 563903;
428
		}
429
430
		return <<<HTML
431
		<div id="crt-$criteo_id" style="width:{$width}px;height:{$height}px;display:none !important;"></div>
432
		<script$data_tags type="text/javascript">
433
		(function(){var c=function(){var a=document.getElementById("crt-{$criteo_id}");window.Criteo?(a.parentNode.style.setProperty("display","inline-block","important"),a.style.setProperty("display","block","important"),window.Criteo.DisplayAcceptableAdIfAdblocked({zoneid:{$zone_id},containerid:"crt-{$criteo_id}",collapseContainerIfNotAdblocked:!0,callifnotadblocked:function(){a.style.setProperty("display","none","important");a.style.setProperty("visbility","hidden","important")}})):(a.style.setProperty("display","none","important"),a.style.setProperty("visibility","hidden","important"))};if(window.Criteo)c();else{if(!__ATA.criteo.script){var b=document.createElement("script");b.src="//static.criteo.net/js/ld/publishertag.js";b.onload=function(){for(var a=0;a<__ATA.criteo.cmd.length;a++){var b=__ATA.criteo.cmd[a];"function"===typeof b&&b()}};(document.head||document.getElementsByTagName("head")[0]).appendChild(b);__ATA.criteo.script=b}__ATA.criteo.cmd.push(c)}})();
434
		</script>
435
HTML;
436
	}
437
438
	/**
439
	 * Check the reasons to bail before we attempt to insert ads.
440
	 * @return true if we should bail (don't insert ads)
441
	 *
442
	 * @since 4.5.0
443
	 */
444
	public function should_bail() {
445
		return ! $this->option( 'wordads_approved' );
446
	}
447
448
	/**
449
	 * Returns markup for HTML5 house ad base on unit
450
	 * @param  string $unit mrec, widesky, or leaderboard
451
	 * @return string       markup for HTML5 house ad
452
	 *
453
	 * @since 4.7.0
454
	 */
455
	public function get_house_ad( $unit = 'mrec' ) {
456
		if ( ! in_array( $unit, array( 'mrec', 'widesky', 'leaderboard' ) ) ) {
457
			$unit = 'mrec';
458
		}
459
460
		$width  = 300;
461
		$height = 250;
462
		if ( 'widesky' == $unit ) {
463
			$width  = 160;
464
			$height = 600;
465
		} else if ( 'leaderboard' == $unit ) {
466
			$width  = 728;
467
			$height = 90;
468
		}
469
470
		return <<<HTML
471
		<iframe
472
			src="https://s0.wp.com/wp-content/blog-plugins/wordads/house/html5/$unit/index.html"
473
			width="$width"
474
			height="$height"
475
			frameborder="0"
476
			scrolling="no"
477
			marginheight="0"
478
			marginwidth="0">
479
		</iframe>
480
HTML;
481
	}
482
483
	/**
484
	 * Activation hook actions
485
	 *
486
	 * @since 4.5.0
487
	 */
488
	public static function activate() {
489
		WordAds_API::update_wordads_status_from_api();
490
	}
491
}
492
493
add_action( 'jetpack_activate_module_wordads', array( 'WordAds', 'activate' ) );
494
add_action( 'jetpack_activate_module_wordads', array( 'WordAds_Cron', 'activate' ) );
495
add_action( 'jetpack_deactivate_module_wordads', array( 'WordAds_Cron', 'deactivate' ) );
496
497
global $wordads;
498
$wordads = new WordAds();
499