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