PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.8.3
Jetpack – WP Security, Backup, Speed, & Growth v12.8.3
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 4 years ago goodreads 5 years ago google-translate 4 years ago image-widget 8 years ago instagram 6 years ago internet-defense-league 3 years ago migrate-to-core 3 years ago milestone 2 years ago my-community 8 years ago simple-payments 4 years ago social-icons 4 years ago social-media-icons 5 years ago top-posts 8 years ago wordpress-post-widget 3 years ago authors.php 3 years ago blog-stats.php 2 years ago class-jetpack-eu-cookie-law-widget.php 3 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 3 years ago flickr.php 3 years ago gallery.php 3 years ago goodreads.php 3 years ago google-translate.php 2 years ago gravatar-profile.css 10 years ago gravatar-profile.php 3 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 3 years ago top-posts.php 2 years ago twitter-timeline-admin.js 6 years ago twitter-timeline.php 3 years ago upcoming-events.php 3 years ago wordpress-post-widget.php 4 years ago
goodreads.php
222 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 )
39 );
40 // For user input sanitization and display.
41 $this->shelves = array(
42 'read' => _x( 'Read', 'past participle: books I have read', 'jetpack' ),
43 'currently-reading' => __( 'Currently Reading', 'jetpack' ),
44 'to-read' => _x( 'To Read', 'my list of books to read', 'jetpack' ),
45 );
46
47 if ( is_active_widget( '', '', 'wpcom-goodreads' ) || is_customize_preview() ) {
48 add_action( 'wp_print_styles', array( $this, 'enqueue_style' ) );
49 }
50 }
51
52 /**
53 * Enqueue widget styles.
54 */
55 public function enqueue_style() {
56 wp_enqueue_style(
57 'goodreads-widget',
58 plugins_url( 'goodreads/css/goodreads.css', __FILE__ ),
59 array(),
60 JETPACK__VERSION
61 );
62 wp_style_add_data( 'goodreads-widget', 'rtl', 'replace' );
63 }
64
65 /**
66 * Display the widget.
67 *
68 * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget.
69 * @param array $instance The settings for the particular instance of the widget.
70 */
71 public function widget( $args, $instance ) {
72 /** This action is documented in modules/widgets/gravatar-profile.php */
73 do_action( 'jetpack_stats_extra', 'widget_view', 'goodreads' );
74
75 /** This filter is documented in core/src/wp-includes/default-widgets.php */
76 $title = apply_filters( 'widget_title', isset( $instance['title'] ) ? $instance['title'] : '' );
77
78 if ( empty( $instance['user_id'] ) || 'invalid' === $instance['user_id'] ) {
79 if ( current_user_can( 'edit_theme_options' ) ) {
80 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
81 echo '<p>' . sprintf(
82 wp_kses(
83 /* translators: %1$s: link to the widget settings page. %2$s: support article URL for Goodreads widget. */
84 __( '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' ),
85 array(
86 'a' => array(
87 'href' => array(),
88 'target' => array(),
89 ),
90 )
91 ),
92 esc_url( admin_url( 'widgets.php' ) ),
93 'https://wordpress.com/support/widgets/goodreads-widget/#set-up-the-widget'
94 ) . '</p>';
95 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
96 }
97 return;
98 }
99
100 if ( ! array_key_exists( $instance['shelf'], $this->shelves ) ) {
101 return;
102 }
103
104 $instance['user_id'] = absint( $instance['user_id'] );
105
106 // Set widget ID based on shelf.
107 $this->goodreads_widget_id = $instance['user_id'] . '_' . $instance['shelf'];
108 $this->goodreads_widget_id = str_replace( '-', '_', $this->goodreads_widget_id ); // Goodreads' custom widget does not like dashes.
109
110 if ( empty( $title ) ) {
111 $title = esc_html__( 'Goodreads', 'jetpack' );
112 }
113
114 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
115 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
116
117 $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 );
118
119 echo '<div class="gr_custom_widget" id="gr_custom_widget_' . esc_attr( $this->goodreads_widget_id ) . '"></div>' . "\n";
120 echo '<script src="' . esc_url( $goodreads_url ) . '"></script>' . "\n"; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
121
122 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
123 }
124
125 /**
126 * Check if given Goodreads user ID exists.
127 *
128 * @param string $user_id User ID.
129 */
130 public function goodreads_user_id_exists( $user_id ) {
131 $url = "https://www.goodreads.com/user/show/$user_id/";
132 $response = wp_remote_head(
133 $url,
134 array(
135 'httpversion' => '1.1',
136 'timeout' => 10,
137 'redirection' => 2,
138 )
139 );
140 if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
141 return true;
142 } else {
143 return false;
144 }
145 }
146
147 /**
148 * Update widget.
149 *
150 * @see WP_Widget::update()
151 *
152 * @param array $new_instance New widget instance data.
153 * @param array $old_instance Old widget instance data.
154 */
155 public function update( $new_instance, $old_instance ) {
156 $instance = $old_instance;
157
158 $instance['user_id'] = trim( wp_kses( stripslashes( $new_instance['user_id'] ), array() ) );
159 if ( ! empty( $instance['user_id'] ) && ( ! isset( $old_instance['user_id'] ) || $instance['user_id'] !== $old_instance['user_id'] ) ) {
160 if ( ! $this->goodreads_user_id_exists( $instance['user_id'] ) ) {
161 $instance['user_id'] = 'invalid';
162 }
163 }
164 $instance['title'] = wp_kses( stripslashes( $new_instance['title'] ), array() );
165 $shelf = wp_kses( stripslashes( $new_instance['shelf'] ), array() );
166 if ( array_key_exists( $shelf, $this->shelves ) ) {
167 $instance['shelf'] = $shelf;
168 }
169
170 return $instance;
171 }
172
173 /**
174 * Outputs the widget settings form.
175 *
176 * @param array $instance Current settings.
177 */
178 public function form( $instance ) {
179 // Defaults.
180 $instance = wp_parse_args(
181 (array) $instance,
182 array(
183 'user_id' => '',
184 'title' => 'Goodreads',
185 'shelf' => 'read',
186 )
187 );
188
189 echo '<p><label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">' . esc_html__( 'Title:', 'jetpack' ) . '
190 <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'] ) . '" />
191 </label></p>
192 <p><label for="' . esc_attr( $this->get_field_id( 'user_id' ) ) . '">';
193 printf(
194 wp_kses(
195 /* translators: %s: support article URL for Goodreads widget. */
196 __( 'Goodreads numeric user ID <a href="%s" target="_blank">(instructions)</a>:', 'jetpack' ),
197 array(
198 'a' => array(
199 'href' => array(),
200 'target' => array(),
201 ),
202 )
203 ),
204 'https://wordpress.com/support/widgets/goodreads-widget/#set-up-the-widget'
205 );
206 if ( 'invalid' === $instance['user_id'] ) {
207 printf( '<br /><small class="error">%s</small>&nbsp;', esc_html( __( 'Invalid User ID, please verify and re-enter your Goodreads numeric user ID.', 'jetpack' ) ) );
208 $instance['user_id'] = '';
209 }
210 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'] ) . '" />
211 </label></p>
212 <p><label for="' . esc_attr( $this->get_field_id( 'shelf' ) ) . '">' . esc_html__( 'Shelf:', 'jetpack' ) . '
213 <select class="widefat" id="' . esc_attr( $this->get_field_id( 'shelf' ) ) . '" name="' . esc_attr( $this->get_field_name( 'shelf' ) ) . '" >';
214 foreach ( $this->shelves as $_shelf_value => $_shelf_display ) {
215 echo "\t<option value='" . esc_attr( $_shelf_value ) . "'" . selected( $_shelf_value, $instance['shelf'], false ) . '>' . $_shelf_display . "</option>\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
216 }
217 echo '</select>
218 </label></p>
219 ';
220 }
221 }
222