PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.7.1
Jetpack – WP Security, Backup, Speed, & Growth v14.7.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-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
345 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 esc_url( $this->get_config_url() ),
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',
252 $this->params->blog_id
253 );
254 }
255
256 /**
257 * Places marker at the end of the content so inline can identify the post content container.
258 *
259 * @param string|null $content The post content.
260 * @return string|null The post content with the marker appended.
261 */
262 public function insert_inline_marker( ?string $content ): ?string {
263 if ( null === $content ) {
264 return null;
265 }
266 $inline_ad_marker = '<span id="wordads-inline-marker" style="display: none;"></span>';
267
268 // Append the ad to the post content.
269 return $content . $inline_ad_marker;
270 }
271
272 /**
273 * Gets a formatted list of target keywords.
274 *
275 * @return string Formatted list of target keywords.
276 */
277 private function target_keywords(): string {
278 $target_keywords = array_merge(
279 $this->get_blog_keywords(),
280 $this->get_language_keywords()
281 );
282
283 return implode( ';', $target_keywords );
284 }
285
286 /**
287 * Gets a formatted list of blog keywords.
288 *
289 * @return array The list of blog keywords.
290 */
291 private function get_blog_keywords(): array {
292 return array( 'wp_blog_id=' . $this->params->blog_id );
293 }
294
295 /**
296 * Gets the site language formatted as a keyword.
297 *
298 * @return array The language as a keyword.
299 */
300 private function get_language_keywords(): array {
301 return array( 'language=' . explode( '-', get_locale() )[0] );
302 }
303
304 /**
305 * Enable formats by post types and the display options.
306 *
307 * @return void
308 */
309 private function enable_formats(): void {
310 $this->formats['top']['enabled'] = $this->params->options['enable_header_ad'];
311 $this->formats['inline']['enabled'] = is_singular( 'post' ) && $this->params->options['wordads_inline_enabled'];
312 $this->formats['belowpost']['enabled'] = $this->params->should_show();
313 $this->formats['bottom_sticky']['enabled'] = $this->params->options['wordads_bottom_sticky_enabled'];
314 $this->formats['sidebar_sticky_right']['enabled'] = $this->params->options['wordads_sidebar_sticky_right_enabled'];
315 }
316
317 /**
318 * Allow format enabled override from query string, eg. ?inline=true.
319 *
320 * @return void
321 */
322 private function override_formats_from_query_string(): void {
323 // phpcs:disable WordPress.Security.NonceVerification.Recommended
324 if ( ! isset( $_GET['wordads-logging'] ) ) {
325 return;
326 }
327
328 foreach ( $this->formats as $format_type => $_ ) {
329 // phpcs:disable WordPress.Security.NonceVerification.Recommended
330 if ( isset( $_GET[ $format_type ] ) && 'true' === $_GET[ $format_type ] ) {
331 $this->formats[ $format_type ]['enabled'] = true;
332 }
333 }
334 }
335
336 /**
337 * Check if has any format enabled.
338 *
339 * @return bool True if enabled, false otherwise.
340 */
341 private function has_any_format_enabled(): bool {
342 return in_array( true, array_column( $this->formats, 'enabled' ), true );
343 }
344 }
345