PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / wordads / php / class-wordads-smart.php
jetpack / modules / wordads / php Last commit date
networks 5 years ago class-wordads-admin.php 7 months ago class-wordads-api.php 7 months ago class-wordads-array-utils.php 7 months ago class-wordads-california-privacy.php 6 months ago class-wordads-ccpa-do-not-sell-link-widget.php 7 months ago class-wordads-consent-management-provider.php 6 months ago class-wordads-cron.php 7 months ago class-wordads-formats.php 7 months ago class-wordads-params.php 7 months ago class-wordads-shortcode.php 7 months ago class-wordads-sidebar-widget.php 7 months ago class-wordads-smart.php 2 weeks ago
class-wordads-smart.php
347 lines
1 <?php
2 /**
3 * An implementation for ads served through Equativ Smart Ad Server.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Assets;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit( 0 );
12 }
13
14 require_once WORDADS_ROOT . '/php/class-wordads-array-utils.php';
15
16 /**
17 * Contains all the implementation details for Smart ads
18 */
19 class WordAds_Smart {
20
21 /**
22 * The single instance of the class.
23 *
24 * @var WordAds_Smart
25 */
26 protected static $instance = null;
27
28 /**
29 * The parameters for WordAds.
30 *
31 * @var WordAds_Params
32 */
33 private $params;
34
35 /**
36 * Has Smart asset been enqueued?
37 *
38 * @var bool True if Smart asset has been enqueued.
39 */
40 private $is_asset_enqueued = false;
41
42 /**
43 * Supported formats.
44 * sidebar_widget formats represents the legacy Jetpack sidebar widget.
45 *
46 * @var array
47 */
48 private $formats = array(
49 'top' => array(
50 'enabled' => false,
51 ),
52 'inline' => array(
53 'enabled' => false,
54 ),
55 'belowpost' => array(
56 'enabled' => false,
57 ),
58 'bottom_sticky' => array(
59 'enabled' => false,
60 ),
61 'sidebar_sticky_right' => array(
62 'enabled' => false,
63 ),
64 'gutenberg_rectangle' => array(
65 'enabled' => false,
66 ),
67 'gutenberg_leaderboard' => array(
68 'enabled' => false,
69 ),
70 'gutenberg_mobile_leaderboard' => array(
71 'enabled' => false,
72 ),
73 'gutenberg_skyscraper' => array(
74 'enabled' => false,
75 ),
76 'sidebar_widget_mediumrectangle' => array(
77 'enabled' => false,
78 ),
79 'sidebar_widget_leaderboard' => array(
80 'enabled' => false,
81 ),
82 'sidebar_widget_wideskyscraper' => array(
83 'enabled' => false,
84 ),
85 'shortcode' => array(
86 'enabled' => false,
87 ),
88 );
89
90 /**
91 * Private constructor.
92 */
93 private function __construct() {
94 }
95
96 /**
97 * Main Class Instance.
98 *
99 * Ensures only one instance of WordAds_Smart is loaded or can be loaded.
100 *
101 * @return WordAds_Smart
102 */
103 public static function instance(): self {
104 if ( null === self::$instance ) {
105 self::$instance = new self();
106 }
107 return self::$instance;
108 }
109
110 /**
111 * Initialize the ads.
112 *
113 * @param WordAds_Params $params Object containing WordAds settings.
114 *
115 * @return void
116 */
117 public function init( WordAds_Params $params ) {
118 $this->params = $params;
119
120 $this->enable_formats();
121 $this->override_formats_from_query_string();
122
123 if ( $this->has_any_format_enabled() ) {
124 $this->insert_ads();
125 }
126 }
127
128 /**
129 * Enqueue any front-end CSS and JS.
130 *
131 * @return void
132 */
133 public function enqueue_assets() {
134
135 if ( $this->is_asset_enqueued ) {
136 return;
137 }
138
139 add_action( 'wp_head', array( $this, 'insert_config' ) );
140
141 Assets::register_script(
142 'adflow_script_loader',
143 '_inc/build/wordads/js/adflow-loader.min.js',
144 JETPACK__PLUGIN_FILE,
145 array(
146 'nonmin_path' => 'modules/wordads/js/adflow-loader.js',
147 'dependencies' => array(),
148 'enqueue' => true,
149 'version' => JETPACK__VERSION,
150 )
151 );
152
153 wp_enqueue_script(
154 'adflow_config',
155 esc_url( $this->get_config_url() ),
156 array( 'adflow_script_loader' ),
157 JETPACK__VERSION,
158 false
159 );
160
161 $this->is_asset_enqueued = true;
162 }
163
164 /**
165 * Inserts ad tags on the page.
166 *
167 * @return void
168 */
169 private function insert_ads() {
170 if ( $this->params->is_amp ) {
171 return;
172 }
173
174 // Don't run on not found pages.
175 if ( is_404() ) {
176 return;
177 }
178
179 // Add the resource hints.
180 add_filter( 'wp_resource_hints', array( $this, 'resource_hints' ), 10, 2 );
181
182 // Enqueue JS assets.
183 $this->enqueue_assets();
184
185 $is_static_front_page = is_front_page() && 'page' === get_option( 'show_on_front' );
186
187 if ( ! ( $is_static_front_page || is_home() ) ) {
188 if ( $this->formats['inline']['enabled'] ) {
189 add_filter(
190 'the_content',
191 array( $this, 'insert_inline_marker' ),
192 10
193 );
194 }
195 }
196
197 if ( $this->formats['bottom_sticky']['enabled'] ) {
198 // Disable IPW slot.
199 add_filter( 'wordads_iponweb_bottom_sticky_ad_disable', '__return_true', 10 );
200 }
201
202 if ( $this->formats['sidebar_sticky_right']['enabled'] ) {
203 // Disable IPW slot.
204 add_filter( 'wordads_iponweb_sidebar_sticky_right_ad_disable', '__return_true', 10 );
205 }
206 }
207
208 /**
209 * Inserts JS configuration used by watl.js.
210 *
211 * @return void
212 */
213 public function insert_config() {
214 global $post;
215
216 $config = array(
217 'post_id' => ( $post instanceof WP_Post ) && is_singular( 'post' ) ? $post->ID : null,
218 'origin' => 'jetpack',
219 'theme' => get_stylesheet(),
220 'target' => $this->target_keywords(),
221 ) + $this->formats;
222
223 // Do conversion.
224 $js_config = WordAds_Array_Utils::array_to_js_object( $config );
225
226 // Output script.
227 wp_print_inline_script_tag( "var wa_smart = $js_config; wa_smart.cmd = [];" );
228 }
229
230 /**
231 * Add the Smart resource hints.
232 *
233 * @param array $hints Domains for hinting.
234 * @param string $relation_type Resource type.
235 *
236 * @return array Domains for hinting.
237 */
238 public function resource_hints( $hints, $relation_type ) {
239 if ( 'dns-prefetch' === $relation_type ) {
240 $hints[] = '//af.pubmine.com';
241 }
242
243 return $hints;
244 }
245
246 /**
247 * Gets the URL to a JSONP endpoint with configuration data.
248 *
249 * @return string The URL.
250 */
251 private function get_config_url(): string {
252 return sprintf(
253 'https://public-api.wordpress.com/wpcom/v2/sites/%1$d/adflow/conf/?_jsonp=a8c_adflow_callback',
254 $this->params->blog_id
255 );
256 }
257
258 /**
259 * Places marker at the end of the content so inline can identify the post content container.
260 *
261 * @param string|null $content The post content.
262 * @return string|null The post content with the marker appended.
263 */
264 public function insert_inline_marker( ?string $content ): ?string {
265 if ( null === $content ) {
266 return null;
267 }
268 $inline_ad_marker = '<span id="wordads-inline-marker" style="display: none;"></span>';
269
270 // Append the ad to the post content.
271 return $content . $inline_ad_marker;
272 }
273
274 /**
275 * Gets a formatted list of target keywords.
276 *
277 * @return string Formatted list of target keywords.
278 */
279 private function target_keywords(): string {
280 $target_keywords = array_merge(
281 $this->get_blog_keywords(),
282 $this->get_language_keywords()
283 );
284
285 return implode( ';', $target_keywords );
286 }
287
288 /**
289 * Gets a formatted list of blog keywords.
290 *
291 * @return array The list of blog keywords.
292 */
293 private function get_blog_keywords(): array {
294 return array( 'wp_blog_id=' . $this->params->blog_id );
295 }
296
297 /**
298 * Gets the site language formatted as a keyword.
299 *
300 * @return array The language as a keyword.
301 */
302 private function get_language_keywords(): array {
303 return array( 'language=' . explode( '-', get_locale() )[0] );
304 }
305
306 /**
307 * Enable formats by post types and the display options.
308 *
309 * @return void
310 */
311 private function enable_formats(): void {
312 $this->formats['top']['enabled'] = $this->params->options['enable_header_ad'];
313 $this->formats['inline']['enabled'] = is_singular( 'post' ) && $this->params->options['wordads_inline_enabled'];
314 $this->formats['belowpost']['enabled'] = $this->params->should_show();
315 $this->formats['bottom_sticky']['enabled'] = $this->params->options['wordads_bottom_sticky_enabled'];
316 $this->formats['sidebar_sticky_right']['enabled'] = $this->params->options['wordads_sidebar_sticky_right_enabled'];
317 }
318
319 /**
320 * Allow format enabled override from query string, eg. ?inline=true.
321 *
322 * @return void
323 */
324 private function override_formats_from_query_string(): void {
325 // phpcs:disable WordPress.Security.NonceVerification.Recommended
326 if ( ! isset( $_GET['wordads-logging'] ) ) {
327 return;
328 }
329
330 foreach ( $this->formats as $format_type => $_ ) {
331 // phpcs:disable WordPress.Security.NonceVerification.Recommended
332 if ( isset( $_GET[ $format_type ] ) && 'true' === $_GET[ $format_type ] ) {
333 $this->formats[ $format_type ]['enabled'] = true;
334 }
335 }
336 }
337
338 /**
339 * Check if has any format enabled.
340 *
341 * @return bool True if enabled, false otherwise.
342 */
343 private function has_any_format_enabled(): bool {
344 return in_array( true, array_column( $this->formats, 'enabled' ), true );
345 }
346 }
347