PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.8.1
Jetpack – WP Security, Backup, Speed, & Growth v14.8.1
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 2 years ago class-wordads-api.php 4 years ago class-wordads-array-utils.php 2 years ago class-wordads-california-privacy.php 3 years ago class-wordads-ccpa-do-not-sell-link-widget.php 3 years ago class-wordads-consent-management-provider.php 2 years ago class-wordads-cron.php 5 years ago class-wordads-formats.php 1 year ago class-wordads-params.php 1 year ago class-wordads-shortcode.php 1 year ago class-wordads-sidebar-widget.php 1 year ago class-wordads-smart.php 1 year ago
class-wordads-smart.php
346 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 // phpcs:disable WordPress.WP.EnqueuedResources.NonEnqueuedScript
11
12 require_once WORDADS_ROOT . '/php/class-wordads-array-utils.php';
13
14 /**
15 * Contains all the implementation details for Smart ads
16 */
17 class WordAds_Smart {
18
19 /**
20 * The single instance of the class.
21 *
22 * @var WordAds_Smart
23 */
24 protected static $instance = null;
25
26 /**
27 * The parameters for WordAds.
28 *
29 * @var WordAds_Params
30 */
31 private $params;
32
33 /**
34 * Has Smart asset been enqueued?
35 *
36 * @var bool True if Smart asset has been enqueued.
37 */
38 private $is_asset_enqueued = false;
39
40 /**
41 * Supported formats.
42 * sidebar_widget formats represents the legacy Jetpack sidebar widget.
43 *
44 * @var array
45 */
46 private $formats = array(
47 'top' => array(
48 'enabled' => false,
49 ),
50 'inline' => array(
51 'enabled' => false,
52 ),
53 'belowpost' => array(
54 'enabled' => false,
55 ),
56 'bottom_sticky' => array(
57 'enabled' => false,
58 ),
59 'sidebar_sticky_right' => array(
60 'enabled' => false,
61 ),
62 'gutenberg_rectangle' => array(
63 'enabled' => false,
64 ),
65 'gutenberg_leaderboard' => array(
66 'enabled' => false,
67 ),
68 'gutenberg_mobile_leaderboard' => array(
69 'enabled' => false,
70 ),
71 'gutenberg_skyscraper' => array(
72 'enabled' => false,
73 ),
74 'sidebar_widget_mediumrectangle' => array(
75 'enabled' => false,
76 ),
77 'sidebar_widget_leaderboard' => array(
78 'enabled' => false,
79 ),
80 'sidebar_widget_wideskyscraper' => array(
81 'enabled' => false,
82 ),
83 'shortcode' => array(
84 'enabled' => false,
85 ),
86 );
87
88 /**
89 * Private constructor.
90 */
91 private function __construct() {
92 }
93
94 /**
95 * Main Class Instance.
96 *
97 * Ensures only one instance of WordAds_Smart is loaded or can be loaded.
98 *
99 * @return WordAds_Smart
100 */
101 public static function instance(): self {
102 if ( null === self::$instance ) {
103 self::$instance = new self();
104 }
105 return self::$instance;
106 }
107
108 /**
109 * Initialize the ads.
110 *
111 * @param WordAds_Params $params Object containing WordAds settings.
112 *
113 * @return void
114 */
115 public function init( WordAds_Params $params ) {
116 $this->params = $params;
117
118 $this->enable_formats();
119 $this->override_formats_from_query_string();
120
121 if ( $this->has_any_format_enabled() ) {
122 $this->insert_ads();
123 }
124 }
125
126 /**
127 * Enqueue any front-end CSS and JS.
128 *
129 * @return void
130 */
131 public function enqueue_assets() {
132
133 if ( $this->is_asset_enqueued ) {
134 return;
135 }
136
137 add_action( 'wp_head', array( $this, 'insert_config' ) );
138
139 Assets::register_script(
140 'adflow_script_loader',
141 '_inc/build/wordads/js/adflow-loader.min.js',
142 JETPACK__PLUGIN_FILE,
143 array(
144 'nonmin_path' => 'modules/wordads/js/adflow-loader.js',
145 'dependencies' => array(),
146 'enqueue' => true,
147 'version' => JETPACK__VERSION,
148 )
149 );
150
151 wp_enqueue_script(
152 'adflow_config',
153 $this->get_config_url(), // The URL is not escaped because we need two parameters to pass.
154 array( 'adflow_script_loader' ),
155 JETPACK__VERSION,
156 false
157 );
158
159 $this->is_asset_enqueued = true;
160 }
161
162 /**
163 * Inserts ad tags on the page.
164 *
165 * @return void
166 */
167 private function insert_ads() {
168 if ( $this->params->is_amp ) {
169 return;
170 }
171
172 // Don't run on not found pages.
173 if ( is_404() ) {
174 return;
175 }
176
177 // Add the resource hints.
178 add_filter( 'wp_resource_hints', array( $this, 'resource_hints' ), 10, 2 );
179
180 // Enqueue JS assets.
181 $this->enqueue_assets();
182
183 $is_static_front_page = is_front_page() && 'page' === get_option( 'show_on_front' );
184
185 if ( ! ( $is_static_front_page || is_home() ) ) {
186 if ( $this->formats['inline']['enabled'] ) {
187 add_filter(
188 'the_content',
189 array( $this, 'insert_inline_marker' ),
190 10
191 );
192 }
193 }
194
195 if ( $this->formats['bottom_sticky']['enabled'] ) {
196 // Disable IPW slot.
197 add_filter( 'wordads_iponweb_bottom_sticky_ad_disable', '__return_true', 10 );
198 }
199
200 if ( $this->formats['sidebar_sticky_right']['enabled'] ) {
201 // Disable IPW slot.
202 add_filter( 'wordads_iponweb_sidebar_sticky_right_ad_disable', '__return_true', 10 );
203 }
204 }
205
206 /**
207 * Inserts JS configuration used by watl.js.
208 *
209 * @return void
210 */
211 public function insert_config() {
212 global $post;
213
214 $config = array(
215 'post_id' => ( $post instanceof WP_Post ) && is_singular( 'post' ) ? $post->ID : null,
216 'origin' => 'jetpack',
217 'theme' => get_stylesheet(),
218 'target' => $this->target_keywords(),
219 ) + $this->formats;
220
221 // Do conversion.
222 $js_config = WordAds_Array_Utils::array_to_js_object( $config );
223
224 // Output script.
225 wp_print_inline_script_tag( "var wa_smart = $js_config; wa_smart.cmd = [];" );
226 }
227
228 /**
229 * Add the Smart resource hints.
230 *
231 * @param array $hints Domains for hinting.
232 * @param string $relation_type Resource type.
233 *
234 * @return array Domains for hinting.
235 */
236 public function resource_hints( $hints, $relation_type ) {
237 if ( 'dns-prefetch' === $relation_type ) {
238 $hints[] = '//af.pubmine.com';
239 }
240
241 return $hints;
242 }
243
244 /**
245 * Gets the URL to a JSONP endpoint with configuration data.
246 *
247 * @return string The URL.
248 */
249 private function get_config_url(): string {
250 return sprintf(
251 'https://public-api.wordpress.com/wpcom/v2/sites/%1$d/adflow/conf/?_jsonp=a8c_adflow_callback&is_singular_post=%2$d&',
252 $this->params->blog_id,
253 (int) is_singular( 'post' )
254 );
255 }
256
257 /**
258 * Places marker at the end of the content so inline can identify the post content container.
259 *
260 * @param string|null $content The post content.
261 * @return string|null The post content with the marker appended.
262 */
263 public function insert_inline_marker( ?string $content ): ?string {
264 if ( null === $content ) {
265 return null;
266 }
267 $inline_ad_marker = '<span id="wordads-inline-marker" style="display: none;"></span>';
268
269 // Append the ad to the post content.
270 return $content . $inline_ad_marker;
271 }
272
273 /**
274 * Gets a formatted list of target keywords.
275 *
276 * @return string Formatted list of target keywords.
277 */
278 private function target_keywords(): string {
279 $target_keywords = array_merge(
280 $this->get_blog_keywords(),
281 $this->get_language_keywords()
282 );
283
284 return implode( ';', $target_keywords );
285 }
286
287 /**
288 * Gets a formatted list of blog keywords.
289 *
290 * @return array The list of blog keywords.
291 */
292 private function get_blog_keywords(): array {
293 return array( 'wp_blog_id=' . $this->params->blog_id );
294 }
295
296 /**
297 * Gets the site language formatted as a keyword.
298 *
299 * @return array The language as a keyword.
300 */
301 private function get_language_keywords(): array {
302 return array( 'language=' . explode( '-', get_locale() )[0] );
303 }
304
305 /**
306 * Enable formats by post types and the display options.
307 *
308 * @return void
309 */
310 private function enable_formats(): void {
311 $this->formats['top']['enabled'] = $this->params->options['enable_header_ad'];
312 $this->formats['inline']['enabled'] = is_singular( 'post' ) && $this->params->options['wordads_inline_enabled'];
313 $this->formats['belowpost']['enabled'] = $this->params->should_show();
314 $this->formats['bottom_sticky']['enabled'] = $this->params->options['wordads_bottom_sticky_enabled'];
315 $this->formats['sidebar_sticky_right']['enabled'] = $this->params->options['wordads_sidebar_sticky_right_enabled'];
316 }
317
318 /**
319 * Allow format enabled override from query string, eg. ?inline=true.
320 *
321 * @return void
322 */
323 private function override_formats_from_query_string(): void {
324 // phpcs:disable WordPress.Security.NonceVerification.Recommended
325 if ( ! isset( $_GET['wordads-logging'] ) ) {
326 return;
327 }
328
329 foreach ( $this->formats as $format_type => $_ ) {
330 // phpcs:disable WordPress.Security.NonceVerification.Recommended
331 if ( isset( $_GET[ $format_type ] ) && 'true' === $_GET[ $format_type ] ) {
332 $this->formats[ $format_type ]['enabled'] = true;
333 }
334 }
335 }
336
337 /**
338 * Check if has any format enabled.
339 *
340 * @return bool True if enabled, false otherwise.
341 */
342 private function has_any_format_enabled(): bool {
343 return in_array( true, array_column( $this->formats, 'enabled' ), true );
344 }
345 }
346