PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.9.2
Jetpack – WP Security, Backup, Speed, & Growth v13.9.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 / widgets / goodreads.php
jetpack / modules / widgets Last commit date
authors 8 years ago contact-info 5 years ago eu-cookie-law 2 years ago facebook-likebox 11 years ago flickr 2 years ago gallery 2 years ago goodreads 2 years ago google-translate 4 years ago image-widget 8 years ago instagram 6 years ago internet-defense-league 2 years ago migrate-to-core 3 years ago milestone 2 years ago my-community 8 years ago simple-payments 2 years ago social-icons 4 years ago social-media-icons 5 years ago top-posts 8 years ago wordpress-post-widget 2 years ago authors.php 3 years ago blog-stats.php 2 years ago class-jetpack-eu-cookie-law-widget.php 2 years ago class-jetpack-instagram-widget.php 2 years ago contact-info.php 2 years ago customizer-controls.css 9 years ago customizer-utils.js 6 years ago facebook-likebox.php 2 years ago flickr.php 2 years ago gallery.php 2 years ago goodreads.php 2 years ago google-translate.php 2 years ago gravatar-profile.css 10 years ago gravatar-profile.php 2 years ago image-widget.php 3 years ago internet-defense-league.php 3 years ago mailchimp.php 3 years ago milestone.php 5 years ago my-community.php 2 years ago rsslinks-widget.php 3 years ago simple-payments.php 2 years ago social-icons.php 2 years ago social-media-icons.php 2 years ago top-posts.php 2 years ago twitter-timeline-admin.js 6 years ago twitter-timeline.php 3 years ago upcoming-events.php 2 years ago wordpress-post-widget.php 4 years ago
goodreads.php
235 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
4
5 add_action( 'widgets_init', 'jetpack_goodreads_widget_init' );
6 /**
7 * Register the widget for use in Appearance -> Widgets
8 */
9 function jetpack_goodreads_widget_init() {
10 register_widget( 'WPCOM_Widget_Goodreads' );
11 }
12
13 /**
14 * Goodreads widget class
15 * Display a user's Goodreads shelf.
16 * Customize user_id, title, and shelf
17 */
18 class WPCOM_Widget_Goodreads extends WP_Widget {
19 /**
20 * Widget ID based on Goodreads user ID and shelf.
21 *
22 * @var int
23 */
24 private $goodreads_widget_id = 0;
25
26 /**
27 * WPCOM_Widget_Goodreads constructor.
28 */
29 public function __construct() {
30 parent::__construct(
31 'wpcom-goodreads',
32 /** This filter is documented in modules/widgets/facebook-likebox.php */
33 apply_filters( 'jetpack_widget_name', __( 'Goodreads', 'jetpack' ) ),
34 array(
35 'classname' => 'widget_goodreads',
36 'description' => __( 'Display your books from Goodreads', 'jetpack' ),
37 'customize_selective_refresh' => true,
38 'show_instance_in_rest' => true,
39 )
40 );
41 // For user input sanitization and display.
42 $this->shelves = array(
43 'read' => _x( 'Read', 'past participle: books I have read', 'jetpack' ),
44 'currently-reading' => __( 'Currently Reading', 'jetpack' ),
45 'to-read' => _x( 'To Read', 'my list of books to read', 'jetpack' ),
46 );
47
48 if ( is_active_widget( '', '', 'wpcom-goodreads' ) || is_customize_preview() ) {
49 add_action( 'wp_print_styles', array( $this, 'enqueue_style' ) );
50 }
51 add_filter( 'widget_types_to_hide_from_legacy_widget_block', array( $this, 'hide_widget_in_block_editor' ) );
52 }
53
54 /**
55 * Remove the "Goodreads" widget from the Legacy Widget block
56 *
57 * @param array $widget_types List of widgets that are currently removed from the Legacy Widget block.
58 * @return array $widget_types New list of widgets that will be removed.
59 */
60 public function hide_widget_in_block_editor( $widget_types ) {
61 $widget_types[] = 'wpcom-goodreads';
62 return $widget_types;
63 }
64
65 /**
66 * Enqueue widget styles.
67 */
68 public function enqueue_style() {
69 wp_enqueue_style(
70 'goodreads-widget',
71 plugins_url( 'goodreads/css/goodreads.css', __FILE__ ),
72 array(),
73 JETPACK__VERSION
74 );
75 wp_style_add_data( 'goodreads-widget', 'rtl', 'replace' );
76 }
77
78 /**
79 * Display the widget.
80 *
81 * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget.
82 * @param array $instance The settings for the particular instance of the widget.
83 */
84 public function widget( $args, $instance ) {
85 /** This action is documented in modules/widgets/gravatar-profile.php */
86 do_action( 'jetpack_stats_extra', 'widget_view', 'goodreads' );
87
88 /** This filter is documented in core/src/wp-includes/default-widgets.php */
89 $title = apply_filters( 'widget_title', isset( $instance['title'] ) ? $instance['title'] : '' );
90
91 if ( empty( $instance['user_id'] ) || 'invalid' === $instance['user_id'] ) {
92 if ( current_user_can( 'edit_theme_options' ) ) {
93 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
94 echo '<p>' . sprintf(
95 wp_kses(
96 /* translators: %1$s: link to the widget settings page. %2$s: support article URL for Goodreads widget. */
97 __( 'You need to enter your numeric user ID for the <a href="%1$s">Goodreads Widget</a> to work correctly. <a href="%2$s" target="_blank">Full instructions</a>.', 'jetpack' ),
98 array(
99 'a' => array(
100 'href' => array(),
101 'target' => array(),
102 ),
103 )
104 ),
105 esc_url( admin_url( 'widgets.php' ) ),
106 'https://wordpress.com/support/widgets/goodreads-widget/#set-up-the-widget'
107 ) . '</p>';
108 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
109 }
110 return;
111 }
112
113 if ( ! array_key_exists( $instance['shelf'], $this->shelves ) ) {
114 return;
115 }
116
117 $instance['user_id'] = absint( $instance['user_id'] );
118
119 // Set widget ID based on shelf.
120 $this->goodreads_widget_id = $instance['user_id'] . '_' . $instance['shelf'];
121 $this->goodreads_widget_id = str_replace( '-', '_', $this->goodreads_widget_id ); // Goodreads' custom widget does not like dashes.
122
123 if ( empty( $title ) ) {
124 $title = esc_html__( 'Goodreads', 'jetpack' );
125 }
126
127 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
128 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
129
130 $goodreads_url = 'https://www.goodreads.com/review/custom_widget/' . rawurlencode( $instance['user_id'] ) . '.' . rawurlencode( $instance['title'] ) . ':%20' . rawurlencode( $instance['shelf'] ) . '?cover_position=&cover_size=small&num_books=5&order=d&shelf=' . rawurlencode( $instance['shelf'] ) . '&sort=date_added&widget_bg_transparent=&widget_id=' . rawurlencode( $this->goodreads_widget_id );
131
132 echo '<div class="jetpack-goodreads-legacy-widget gr_custom_widget" id="gr_custom_widget_' . esc_attr( $this->goodreads_widget_id ) . '"></div>' . "\n";
133 echo '<script src="' . esc_url( $goodreads_url ) . '"></script>' . "\n"; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
134
135 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
136 }
137
138 /**
139 * Check if given Goodreads user ID exists.
140 *
141 * @param string $user_id User ID.
142 */
143 public function goodreads_user_id_exists( $user_id ) {
144 $url = "https://www.goodreads.com/user/show/$user_id/";
145 $response = wp_remote_head(
146 $url,
147 array(
148 'httpversion' => '1.1',
149 'timeout' => 10,
150 'redirection' => 2,
151 )
152 );
153 if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
154 return true;
155 } else {
156 return false;
157 }
158 }
159
160 /**
161 * Update widget.
162 *
163 * @see WP_Widget::update()
164 *
165 * @param array $new_instance New widget instance data.
166 * @param array $old_instance Old widget instance data.
167 */
168 public function update( $new_instance, $old_instance ) {
169 $instance = $old_instance;
170
171 $instance['user_id'] = trim( wp_kses( stripslashes( $new_instance['user_id'] ), array() ) );
172 if ( ! empty( $instance['user_id'] ) && ( ! isset( $old_instance['user_id'] ) || $instance['user_id'] !== $old_instance['user_id'] ) ) {
173 if ( ! $this->goodreads_user_id_exists( $instance['user_id'] ) ) {
174 $instance['user_id'] = 'invalid';
175 }
176 }
177 $instance['title'] = wp_kses( stripslashes( $new_instance['title'] ), array() );
178 $shelf = wp_kses( stripslashes( $new_instance['shelf'] ), array() );
179 if ( array_key_exists( $shelf, $this->shelves ) ) {
180 $instance['shelf'] = $shelf;
181 }
182
183 return $instance;
184 }
185
186 /**
187 * Outputs the widget settings form.
188 *
189 * @param array $instance Current settings.
190 */
191 public function form( $instance ) {
192 // Defaults.
193 $instance = wp_parse_args(
194 (array) $instance,
195 array(
196 'user_id' => '',
197 'title' => 'Goodreads',
198 'shelf' => 'read',
199 )
200 );
201
202 echo '<p><label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">' . esc_html__( 'Title:', 'jetpack' ) . '
203 <input class="widefat" id="' . esc_attr( $this->get_field_id( 'title' ) ) . '" name="' . esc_attr( $this->get_field_name( 'title' ) ) . '" type="text" value="' . esc_attr( $instance['title'] ) . '" />
204 </label></p>
205 <p><label for="' . esc_attr( $this->get_field_id( 'user_id' ) ) . '">';
206 printf(
207 wp_kses(
208 /* translators: %s: support article URL for Goodreads widget. */
209 __( 'Goodreads numeric user ID <a href="%s" target="_blank">(instructions)</a>:', 'jetpack' ),
210 array(
211 'a' => array(
212 'href' => array(),
213 'target' => array(),
214 ),
215 )
216 ),
217 'https://wordpress.com/support/widgets/goodreads-widget/#set-up-the-widget'
218 );
219 if ( 'invalid' === $instance['user_id'] ) {
220 printf( '<br /><small class="error">%s</small>&nbsp;', esc_html( __( 'Invalid User ID, please verify and re-enter your Goodreads numeric user ID.', 'jetpack' ) ) );
221 $instance['user_id'] = '';
222 }
223 echo '<input class="widefat" id="' . esc_attr( $this->get_field_id( 'user_id' ) ) . '" name="' . esc_attr( $this->get_field_name( 'user_id' ) ) . '" type="text" value="' . esc_attr( $instance['user_id'] ) . '" />
224 </label></p>
225 <p><label for="' . esc_attr( $this->get_field_id( 'shelf' ) ) . '">' . esc_html__( 'Shelf:', 'jetpack' ) . '
226 <select class="widefat" id="' . esc_attr( $this->get_field_id( 'shelf' ) ) . '" name="' . esc_attr( $this->get_field_name( 'shelf' ) ) . '" >';
227 foreach ( $this->shelves as $_shelf_value => $_shelf_display ) {
228 echo "\t<option value='" . esc_attr( $_shelf_value ) . "'" . selected( $_shelf_value, $instance['shelf'], false ) . '>' . $_shelf_display . "</option>\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
229 }
230 echo '</select>
231 </label></p>
232 ';
233 }
234 }
235