PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 11.4.1
Jetpack – WP Security, Backup, Speed, & Growth v11.4.1
16.2-beta 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 All 501 releases
jetpack / modules / infinite-scroll.php
infinite-scroll.php
242 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Module Name: Infinite Scroll
4 * Module Description: Automatically load new content when a visitor scrolls
5 * Sort Order: 26
6 * First Introduced: 2.0
7 * Requires Connection: No
8 * Auto Activate: No
9 * Module Tags: Appearance
10 * Feature: Appearance
11 * Additional Search Queries: scroll, infinite, infinite scroll
12 */
13
14 /**
15 * Jetpack-specific elements of Infinite Scroll
16 */
17 class Jetpack_Infinite_Scroll_Extras {
18 /**
19 * Class variable singleton.
20 *
21 * @var Jetpack_Infinite_Scroll_Extras
22 */
23 private static $instance = null;
24
25 /**
26 * Option names.
27 *
28 * @var string
29 */
30 private $option_name_google_analytics = 'infinite_scroll_google_analytics';
31
32 /**
33 * Singleton implementation
34 *
35 * @return object
36 */
37 public static function instance() {
38 if ( ! self::$instance instanceof Jetpack_Infinite_Scroll_Extras ) {
39 self::$instance = new Jetpack_Infinite_Scroll_Extras();
40 }
41
42 return self::$instance;
43 }
44
45 /**
46 * Register actions and filters
47 *
48 * @uses add_action, add_filter
49 */
50 private function __construct() {
51 add_action( 'jetpack_modules_loaded', array( $this, 'action_jetpack_modules_loaded' ) );
52
53 add_action( 'admin_init', array( $this, 'action_admin_init' ), 11 );
54
55 add_action( 'after_setup_theme', array( $this, 'action_after_setup_theme' ), 5 );
56
57 add_filter( 'infinite_scroll_js_settings', array( $this, 'filter_infinite_scroll_js_settings' ) );
58
59 add_action( 'wp_enqueue_scripts', array( $this, 'action_wp_enqueue_scripts' ) );
60 }
61
62 /**
63 * Enable "Configure" button on module card
64 *
65 * @uses Jetpack::enable_module_configurable
66 * @action jetpack_modules_loaded
67 */
68 public function action_jetpack_modules_loaded() {
69 Jetpack::enable_module_configurable( __FILE__ );
70 }
71
72 /**
73 * Register Google Analytics setting
74 *
75 * @uses add_settings_field, __, register_setting
76 * @action admin_init
77 */
78 public function action_admin_init() {
79 if ( ! Jetpack_Plan::supports( 'google-analytics' ) ) {
80 return;
81 }
82
83 add_settings_field( $this->option_name_google_analytics, '<span id="infinite-scroll-google-analytics">' . __( 'Use Google Analytics with Infinite Scroll', 'jetpack' ) . '</span>', array( $this, 'setting_google_analytics' ), 'reading' );
84 register_setting( 'reading', $this->option_name_google_analytics, array( $this, 'sanitize_boolean_value' ) );
85 }
86
87 /**
88 * Render Google Analytics option
89 *
90 * @uses checked, get_option, __
91 */
92 public function setting_google_analytics() {
93 echo '<label><input name="infinite_scroll_google_analytics" type="checkbox" value="1" ' . checked( true, (bool) get_option( $this->option_name_google_analytics, false ), false ) . ' /> ' . esc_html__( 'Track each scroll load (7 posts by default) as a page view in Google Analytics', 'jetpack' ) . '</label>';
94 echo '<p class="description">' . esc_html__( 'Check the box above to record each new set of posts loaded via Infinite Scroll as a page view in Google Analytics.', 'jetpack' ) . '</p>';
95 }
96
97 /**
98 * Sanitize value as a boolean
99 *
100 * @param mixed $value - the value we're sanitizing.
101 * @return bool
102 */
103 public function sanitize_boolean_value( $value ) {
104 return (bool) $value;
105 }
106
107 /**
108 * Load theme's infinite scroll annotation file, if present in the IS plugin.
109 * The `setup_theme` action is used because the annotation files should be using `after_setup_theme` to register support for IS.
110 *
111 * As released in Jetpack 2.0, a child theme's parent wasn't checked for in the plugin's bundled support, hence the convoluted way the parent is checked for now.
112 *
113 * @uses is_admin, wp_get_theme, apply_filters
114 * @action setup_theme
115 * @return null
116 */
117 public function action_after_setup_theme() {
118 $theme = wp_get_theme();
119
120 if ( ! $theme instanceof WP_Theme && ! is_array( $theme ) ) {
121 return;
122 }
123
124 /** This filter is already documented in modules/infinite-scroll/infinity.php */
125 $customization_file = apply_filters( 'infinite_scroll_customization_file', __DIR__ . "/infinite-scroll/themes/{$theme['Stylesheet']}.php", $theme['Stylesheet'] );
126
127 if ( is_readable( $customization_file ) ) {
128 require_once $customization_file;
129 } elseif ( ! empty( $theme['Template'] ) ) {
130 $customization_file = __DIR__ . "/infinite-scroll/themes/{$theme['Template']}.php";
131
132 if ( is_readable( $customization_file ) ) {
133 require_once $customization_file;
134 }
135 }
136 }
137
138 /**
139 * Modify Infinite Scroll configuration information
140 *
141 * @uses Jetpack::get_active_modules, is_user_logged_in, stats_get_options, Jetpack_Options::get_option, get_option, JETPACK__API_VERSION, JETPACK__VERSION
142 * @filter infinite_scroll_js_settings
143 *
144 * @param array $settings - the settings.
145 * @return array
146 */
147 public function filter_infinite_scroll_js_settings( $settings ) {
148 // Provide WP Stats info for tracking Infinite Scroll loads
149 // Abort if Stats module isn't active
150 if ( in_array( 'stats', Jetpack::get_active_modules(), true ) ) {
151 // Abort if user is logged in but logged-in users shouldn't be tracked.
152 if ( is_user_logged_in() && function_exists( 'stats_get_options' ) ) {
153 $stats_options = stats_get_options();
154 $track_loggedin_users = isset( $stats_options['reg_users'] ) ? (bool) $stats_options['reg_users'] : false;
155
156 if ( ! $track_loggedin_users ) {
157 return $settings;
158 }
159 }
160
161 // We made it this far, so gather the data needed to track IS views
162 $settings['stats'] = 'blog=' . Jetpack_Options::get_option( 'id' ) . '&host=' . wp_parse_url( get_option( 'home' ), PHP_URL_HOST ) . '&v=ext&j=' . JETPACK__API_VERSION . ':' . JETPACK__VERSION;
163
164 // Pagetype parameter
165 $settings['stats'] .= '&x_pagetype=infinite';
166 if ( 'click' === $settings['type'] ) {
167 $settings['stats'] .= '-click';
168 }
169
170 $settings['stats'] .= '-jetpack';
171 }
172
173 // Check if Google Analytics tracking is requested.
174 $settings['google_analytics'] = Jetpack_Plan::supports( 'google-analytics' ) && Jetpack_Options::get_option_and_ensure_autoload( $this->option_name_google_analytics, 0 );
175
176 return $settings;
177 }
178
179 /**
180 * Always load certain scripts when IS is enabled, as they can't be loaded after `document.ready` fires, meaning they can't leverage IS's script loader.
181 *
182 * @global $videopress
183 * @uses do_action()
184 * @uses apply_filters()
185 * @uses wp_enqueue_style()
186 * @uses wp_enqueue_script()
187 * @action wp_enqueue_scripts
188 * @return null
189 */
190 public function action_wp_enqueue_scripts() {
191 // Do not load scripts and styles on singular pages and static pages
192 $load_scripts_and_styles = ! ( is_singular() || is_page() );
193 if (
194 /**
195 * Allow plugins to enqueue all Infinite Scroll scripts and styles on singular pages as well.
196 *
197 * @module infinite-scroll
198 *
199 * @since 3.1.0
200 *
201 * @param bool $load_scripts_and_styles Should scripts and styles be loaded on singular pahes and static pages. Default to false.
202 */
203 ! apply_filters( 'jetpack_infinite_scroll_load_scripts_and_styles', $load_scripts_and_styles )
204 ) {
205 return;
206 }
207
208 // VideoPress stand-alone plugin
209 global $videopress;
210 if ( ! empty( $videopress ) && The_Neverending_Home_Page::archive_supports_infinity() && is_a( $videopress, 'VideoPress' ) && method_exists( $videopress, 'enqueue_scripts' ) ) {
211 $videopress->enqueue_scripts();
212 }
213
214 // VideoPress Jetpack module
215 if ( Jetpack::is_module_active( 'videopress' ) ) {
216 wp_enqueue_script( 'videopress' );
217 }
218
219 // Fire the post_gallery action early so Carousel scripts are present.
220 if ( Jetpack::is_module_active( 'carousel' ) ) {
221 /** This filter is already documented in core/wp-includes/media.php */
222 do_action( 'post_gallery', '', '', 0 );
223 }
224
225 // Always enqueue Tiled Gallery scripts when both IS and Tiled Galleries are enabled
226 if ( Jetpack::is_module_active( 'tiled-gallery' ) ) {
227 Jetpack_Tiled_Gallery::default_scripts_and_styles();
228 }
229 }
230 }
231 Jetpack_Infinite_Scroll_Extras::instance();
232
233 /**
234 * Load main IS file
235 */
236 require_once __DIR__ . '/infinite-scroll/infinity.php';
237
238 /**
239 * Remove the IS annotation loading function bundled with the IS plugin in favor of the Jetpack-specific version in Jetpack_Infinite_Scroll_Extras::action_after_setup_theme();
240 */
241 remove_action( 'after_setup_theme', 'the_neverending_home_page_theme_support', 5 );
242