PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.5.1
Jetpack – WP Security, Backup, Speed, & Growth v14.5.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 / widgets / goodreads.php
jetpack / modules / widgets Last commit date
authors 8 years ago contact-info 5 years ago eu-cookie-law 1 year ago facebook-likebox 11 years ago flickr 2 years ago gallery 1 year ago goodreads 2 years ago google-translate 1 year ago image-widget 8 years ago instagram 6 years ago internet-defense-league 2 years ago milestone 1 year ago my-community 8 years ago simple-payments 1 year ago social-icons 1 year ago social-media-icons 5 years ago top-posts 8 years ago wordpress-post-widget 2 years ago authors.php 1 year ago blog-stats.php 1 year ago class-jetpack-eu-cookie-law-widget.php 1 year ago class-jetpack-instagram-widget.php 1 year ago contact-info.php 1 year ago customizer-controls.css 9 years ago customizer-utils.js 1 year ago facebook-likebox.php 2 years ago flickr.php 1 year ago gallery.php 1 year ago goodreads.php 1 year ago google-translate.php 1 year ago gravatar-profile.css 1 year ago gravatar-profile.php 1 year ago image-widget.php 1 year ago internet-defense-league.php 3 years ago mailchimp.php 3 years ago milestone.php 5 years ago my-community.php 1 year ago rsslinks-widget.php 3 years ago simple-payments.php 1 year ago social-icons.php 1 year ago social-media-icons.php 1 year ago top-posts.php 1 year ago twitter-timeline-admin.js 1 year ago twitter-timeline.php 1 year ago upcoming-events.php 2 years ago wordpress-post-widget.php 1 year 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 add_filter( 'widget_types_to_hide_from_legacy_widget_block', array( $this, 'hide_widget_in_block_editor' ) );
49 }
50
51 /**
52 * Remove the "Goodreads" widget from the Legacy Widget block
53 *
54 * @param array $widget_types List of widgets that are currently removed from the Legacy Widget block.
55 * @return array $widget_types New list of widgets that will be removed.
56 */
57 public function hide_widget_in_block_editor( $widget_types ) {
58 $widget_types[] = 'wpcom-goodreads';
59 return $widget_types;
60 }
61
62 /**
63 * Enqueue widget styles.
64 */
65 public function enqueue_style() {
66 wp_enqueue_style(
67 'goodreads-widget',
68 plugins_url( 'goodreads/css/goodreads.css', __FILE__ ),
69 array(),
70 JETPACK__VERSION
71 );
72 wp_style_add_data( 'goodreads-widget', 'rtl', 'replace' );
73 }
74
75 /**
76 * Display the widget.
77 *
78 * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget.
79 * @param array $instance The settings for the particular instance of the widget.
80 */
81 public function widget( $args, $instance ) {
82 /** This action is documented in modules/widgets/gravatar-profile.php */
83 do_action( 'jetpack_stats_extra', 'widget_view', 'goodreads' );
84
85 /** This filter is documented in core/src/wp-includes/default-widgets.php */
86 $title = apply_filters( 'widget_title', isset( $instance['title'] ) ? $instance['title'] : '' );
87
88 if ( empty( $instance['user_id'] ) || 'invalid' === $instance['user_id'] ) {
89 if ( current_user_can( 'edit_theme_options' ) ) {
90 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
91 echo '<p>' . sprintf(
92 wp_kses(
93 /* translators: %1$s: link to the widget settings page. %2$s: support article URL for Goodreads widget. */
94 __( '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' ),
95 array(
96 'a' => array(
97 'href' => array(),
98 'target' => array(),
99 ),
100 )
101 ),
102 esc_url( admin_url( 'widgets.php' ) ),
103 'https://wordpress.com/support/widgets/goodreads-widget/#set-up-the-widget'
104 ) . '</p>';
105 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
106 }
107 return;
108 }
109
110 if ( ! array_key_exists( $instance['shelf'], $this->shelves ) ) {
111 return;
112 }
113
114 // Enqueue front end assets.
115 $this->enqueue_style();
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