PluginProbe
Plus WebP or AVIF / 1.13
Plus WebP or AVIF v1.13
5.21 5.20 5.12 5.11 trunk 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 2.00 2.01 2.02 2.03 2.04 2.05 All 47 releases
plus-webp / lib / class-pluswebpadmin.php

class-pluswebpadmin.php in Plus WebP or AVIF 1.13, at lib/class-pluswebpadmin.php

457 lines 17.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plus WebP
4 *
5 * @package Plus WebP
6 * @subpackage PlusWebpAdmin Management screen
7 Copyright (c) 2019- Katsushi Kawamori (email : dodesyoswift312@gmail.com)
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; version 2 of the License.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 $pluswebpadmin = new PlusWebpAdmin();
23
24 /** ==================================================
25 * Management screen
26 */
27 class PlusWebpAdmin {
28
29 /** ==================================================
30 * Construct
31 *
32 * @since 1.00
33 */
34 public function __construct() {
35
36 add_action( 'admin_menu', array( $this, 'plugin_menu' ) );
37 add_action( 'admin_enqueue_scripts', array( $this, 'load_custom_wp_admin_style' ) );
38 add_filter( 'plugin_action_links', array( $this, 'settings_link' ), 10, 2 );
39 add_action( 'admin_notices', array( $this, 'generate_notice' ) );
40
41 add_action( 'AllImagesRegenerateHook', array( $this, 'allimages_regenerate' ), 10, 1 );
42
43 }
44
45 /** ==================================================
46 * Add a "Settings" link to the plugins page
47 *
48 * @param array $links links array.
49 * @param string $file file.
50 * @return array $links links array.
51 * @since 1.00
52 */
53 public function settings_link( $links, $file ) {
54 static $this_plugin;
55 if ( empty( $this_plugin ) ) {
56 $this_plugin = 'plus-webp/pluswebp.php';
57 }
58 if ( $file === $this_plugin ) {
59 $links[] = '<a href="' . admin_url( 'tools.php?page=pluswebp' ) . '">' . esc_html__( 'Bulk Generate', 'plus-webp' ) . '</a>';
60 }
61 return $links;
62 }
63
64 /** ==================================================
65 * Settings page
66 *
67 * @since 1.00
68 */
69 public function plugin_menu() {
70 add_management_page( 'Plus WebP', 'Plus WebP', 'manage_options', 'pluswebp', array( $this, 'plugin_options' ) );
71 }
72
73 /** ==================================================
74 * Add Css and Script
75 *
76 * @since 1.00
77 */
78 public function load_custom_wp_admin_style() {
79 if ( $this->is_my_plugin_screen() ) {
80 wp_enqueue_style( 'jquery-responsiveTabs', plugin_dir_url( __DIR__ ) . 'css/responsive-tabs.css', array(), '1.4.0' );
81 wp_enqueue_style( 'jquery-responsiveTabs-style', plugin_dir_url( __DIR__ ) . 'css/style.css', array(), '1.4.0' );
82 wp_enqueue_script( 'jquery' );
83 wp_enqueue_script( 'jquery-responsiveTabs', plugin_dir_url( __DIR__ ) . 'js/jquery.responsiveTabs.min.js', array(), '1.4.0', false );
84 wp_enqueue_script( 'pluswebp-admin-js', plugin_dir_url( __DIR__ ) . 'js/jquery.pluswebp.admin.js', array( 'jquery' ), array(), '1.00', false );
85 }
86 }
87
88 /** ==================================================
89 * For only admin style
90 *
91 * @since 1.00
92 */
93 private function is_my_plugin_screen() {
94 $screen = get_current_screen();
95 if ( is_object( $screen ) && 'tools_page_pluswebp' === $screen->id ) {
96 return true;
97 } else {
98 return false;
99 }
100 }
101
102 /** ==================================================
103 * Settings page
104 *
105 * @since 1.00
106 */
107 public function plugin_options() {
108
109 if ( ! current_user_can( 'manage_options' ) ) {
110 wp_die( esc_html__( 'You do not have sufficient permissions to access this page.' ) );
111 }
112
113 $this->options_updated();
114 $pluswebp_settings = get_option( 'pluswebp' );
115
116 if ( isset( $_POST['Generatewebp'] ) && ! empty( $_POST['Generatewebp'] ) ) {
117 if ( check_admin_referer( 'pwp_gnt', 'pluswebp_gnt' ) ) {
118 if ( ! empty( $pluswebp_settings['types'] ) ) {
119 $user = wp_get_current_user();
120 $to = $user->user_email;
121 $userid = $user->ID;
122 if ( ! wp_next_scheduled( 'AllImagesRegenerateHook', array( $to ) ) ) {
123 wp_schedule_single_event( time(), 'AllImagesRegenerateHook', array( $to ) );
124 echo '<div class="notice notice-success is-dismissible"><ul><li>' . esc_html__( 'Background generation starts.', 'plus-webp' ) . '</li></ul></div>';
125 } else {
126 echo '<div class="notice notice-error is-dismissible"><ul><li>' . esc_html__( 'Currently, there is a process that is being bulk generated.', 'plus-webp' ) . '</li></ul></div>';
127 }
128 } else {
129 echo '<div class="notice notice-error is-dismissible"><ul><li>' . esc_html__( 'The image type for creating WebP is not specified.', 'plus-webp' ) . '</li></ul></div>';
130 }
131 }
132 }
133
134 $scriptname = admin_url( 'tools.php?page=pluswebp' );
135
136 ?>
137 <div class="wrap">
138 <h2>Plus WebP</h2>
139
140 <div id="pluswebp-admin-tabs">
141 <ul>
142 <li><a href="#pluswebp-admin-tabs-1"><?php esc_html_e( 'Bulk Generate', 'plus-webp' ); ?></a></li>
143 <li><a href="#pluswebp-admin-tabs-2"><?php esc_html_e( 'Settings' ); ?></a></li>
144 <li><a href="#pluswebp-admin-tabs-3"><?php esc_html_e( 'Donate to this plugin &#187;' ); ?></a></li>
145 </ul>
146 <div id="pluswebp-admin-tabs-1">
147 <div class="wrap">
148 <h2><?php esc_html_e( 'Bulk Generate', 'plus-webp' ); ?></h2>
149
150 <div style="margin: 5px; padding: 5px;">
151 <p class="description">
152 <?php esc_html_e( 'Press the following button to start WebP generation in the background. When finished, you will receive an email.', 'plus-webp' ); ?>
153 </p>
154 </div>
155
156 <form method="post" action="<?php echo esc_url( $scriptname ); ?>">
157 <?php wp_nonce_field( 'pwp_gnt', 'pluswebp_gnt' ); ?>
158 <?php submit_button( __( 'Generate', 'plus-webp' ), 'primary', 'Generatewebp', true ); ?>
159 </form>
160 </div>
161 </div>
162
163 <div id="pluswebp-admin-tabs-2">
164 <div class="wrap">
165 <h2><?php esc_html_e( 'Settings' ); ?></h2>
166
167 <form method="post" action="<?php echo esc_url( $scriptname ) . '#pluswebp-admin-tabs-2'; ?>">
168 <?php wp_nonce_field( 'pwp_set', 'pluswebp_set' ); ?>
169
170 <div style="width: 100%; height: 100%; margin: 5px; padding: 5px; border: #CCC 2px solid;">
171 <h3><?php esc_html_e( 'Quality', 'plus-webp' ); ?></h3>
172 <div style="margin: 5px; padding: 5px;">
173 <?php esc_html_e( 'low resolution', 'plus-webp' ); ?>
174 <input type="range" style="vertical-align:middle;" name="quality" value="<?php echo esc_attr( $pluswebp_settings['quality'] ); ?>" min="0" max="100" step="1">
175 <?php esc_html_e( 'high resolution', 'plus-webp' ); ?>
176 <div style="margin: 5px; padding: 5px;">
177 <p class="description">
178 <?php esc_html_e( 'Specifies the quality of WebP. The higher the resolution, the larger the file size.', 'plus-webp' ); ?>
179 </p>
180 </div>
181 </div>
182 </div>
183
184 <div style="width: 100%; height: 100%; margin: 5px; padding: 5px; border: #CCC 2px solid;">
185 <h3><?php esc_html_e( 'Type' ); ?></h3>
186 <?php
187 $list_types = array(
188 'image/jpeg',
189 'image/png',
190 'image/bmp',
191 'image/gif',
192 );
193 foreach ( $list_types as $value ) {
194 if ( in_array( $value, $pluswebp_settings['types'] ) ) {
195 $check = 1;
196 } else {
197 $check = 0;
198 }
199 ?>
200 <div style="display: block;padding:5px 5px"><input type="checkbox" name="list_types[<?php echo esc_attr( $value ); ?>]" value="1" <?php checked( '1', $check ); ?> /><?php echo esc_html( $value ); ?></div>
201 <?php
202 }
203 ?>
204 <div style="margin: 5px; padding: 5px;">
205 <p class="description">
206 <?php esc_html_e( 'Check the images you want to convert to WebP.', 'plus-webp' ); ?>
207 </p>
208 </div>
209 </div>
210
211 <div style="width: 100%; height: 100%; margin: 5px; padding: 5px; border: #CCC 2px solid;">
212 <h3><?php esc_html_e( 'Append the webp extension to the original filename', 'plus-webp' ); ?></h3>
213 <div style="margin: 5px; padding: 5px;">
214 <input type="checkbox" name="addext" value="1" <?php checked( $pluswebp_settings['addext'], true ); ?>><?php esc_html_e( 'Apply' ); ?>
215 <div style="margin: 5px; padding: 5px;">
216 <p class="description">
217 <?php esc_html_e( 'Checking this setting, the extension webp will be appended to the name of the file, including the extension. Not checking, only the extension is changed.', 'plus-webp' ); ?>
218 </p>
219 </div>
220 </div>
221 </div>
222
223 <div style="width: 100%; height: 100%; margin: 5px; padding: 5px; border: #CCC 2px solid;">
224 <h3><?php esc_html_e( 'WebP replacement of images and contents', 'plus-webp' ); ?></h3>
225 <div style="margin: 5px; padding: 5px;">
226 <input type="checkbox" name="replace" value="1" <?php checked( $pluswebp_settings['replace'], true ); ?>><?php esc_html_e( 'Apply' ); ?>
227 <div style="margin: 5px; padding: 5px;">
228 <p class="description">
229 <?php esc_html_e( 'Checking this setting will replace image files with WebP when adding new media, and delete the original image file. Also, when generating all images, the original image file ID will be overwritten as WebP and the original image file will be deleted. All URLs in the content are also replaced.', 'plus-webp' ); ?>
230 </p>
231 </div>
232 </div>
233 </div>
234
235 <?php submit_button( __( 'Save Changes' ), 'large', 'Manageset', false ); ?>
236 </form>
237 </div>
238 </div>
239
240 <div id="pluswebp-admin-tabs-3">
241 <div class="wrap">
242 <?php $this->credit(); ?>
243 </div>
244 </div>
245
246 </div>
247
248 </div>
249 <?php
250 }
251
252 /** ==================================================
253 * Credit
254 *
255 * @since 1.00
256 */
257 private function credit() {
258
259 $plugin_name = null;
260 $plugin_ver_num = null;
261 $plugin_path = plugin_dir_path( __DIR__ );
262 $plugin_dir = untrailingslashit( $plugin_path );
263 $slugs = explode( '/', $plugin_dir );
264 $slug = end( $slugs );
265 $files = scandir( $plugin_dir );
266 foreach ( $files as $file ) {
267 if ( '.' === $file || '..' === $file || is_dir( $plugin_path . $file ) ) {
268 continue;
269 } else {
270 $exts = explode( '.', $file );
271 $ext = strtolower( end( $exts ) );
272 if ( 'php' === $ext ) {
273 $plugin_datas = get_file_data(
274 $plugin_path . $file,
275 array(
276 'name' => 'Plugin Name',
277 'version' => 'Version',
278 )
279 );
280 if ( array_key_exists( 'name', $plugin_datas ) && ! empty( $plugin_datas['name'] ) && array_key_exists( 'version', $plugin_datas ) && ! empty( $plugin_datas['version'] ) ) {
281 $plugin_name = $plugin_datas['name'];
282 $plugin_ver_num = $plugin_datas['version'];
283 break;
284 }
285 }
286 }
287 }
288 $plugin_version = __( 'Version:' ) . ' ' . $plugin_ver_num;
289 /* translators: FAQ Link & Slug */
290 $faq = sprintf( esc_html__( 'https://wordpress.org/plugins/%s/faq', '%s' ), $slug );
291 $support = 'https://wordpress.org/support/plugin/' . $slug;
292 $review = 'https://wordpress.org/support/view/plugin-reviews/' . $slug;
293 $translate = 'https://translate.wordpress.org/projects/wp-plugins/' . $slug;
294 $facebook = 'https://www.facebook.com/katsushikawamori/';
295 $twitter = 'https://twitter.com/dodesyo312';
296 $youtube = 'https://www.youtube.com/channel/UC5zTLeyROkvZm86OgNRcb_w';
297 $donate = sprintf( esc_html__( 'https://shop.riverforest-wp.info/donate/', '%s' ), $slug );
298
299 ?>
300 <span style="font-weight: bold;">
301 <div>
302 <?php echo esc_html( $plugin_version ); ?> |
303 <a style="text-decoration: none;" href="<?php echo esc_url( $faq ); ?>" target="_blank"><?php esc_html_e( 'FAQ' ); ?></a> | <a style="text-decoration: none;" href="<?php echo esc_url( $support ); ?>" target="_blank"><?php esc_html_e( 'Support Forums' ); ?></a> | <a style="text-decoration: none;" href="<?php echo esc_url( $review ); ?>" target="_blank"><?php sprintf( esc_html_e( 'Reviews', '%s' ), $slug ); ?></a>
304 </div>
305 <div>
306 <a style="text-decoration: none;" href="<?php echo esc_url( $translate ); ?>" target="_blank">
307 <?php
308 /* translators: Plugin translation link */
309 echo sprintf( esc_html__( 'Translations for %s' ), esc_html( $plugin_name ) );
310 ?>
311 </a> | <a style="text-decoration: none;" href="<?php echo esc_url( $facebook ); ?>" target="_blank"><span class="dashicons dashicons-facebook"></span></a> | <a style="text-decoration: none;" href="<?php echo esc_url( $twitter ); ?>" target="_blank"><span class="dashicons dashicons-twitter"></span></a> | <a style="text-decoration: none;" href="<?php echo esc_url( $youtube ); ?>" target="_blank"><span class="dashicons dashicons-video-alt3"></span></a>
312 </div>
313 </span>
314
315 <div style="width: 250px; height: 180px; margin: 5px; padding: 5px; border: #CCC 2px solid;">
316 <h3><?php sprintf( esc_html_e( 'Please make a donation if you like my work or would like to further the development of this plugin.', '%s' ), $slug ); ?></h3>
317 <div style="text-align: right; margin: 5px; padding: 5px;"><span style="padding: 3px; color: #ffffff; background-color: #008000">Plugin Author</span> <span style="font-weight: bold;">Katsushi Kawamori</span></div>
318 <button type="button" style="margin: 5px; padding: 5px;" onclick="window.open('<?php echo esc_url( $donate ); ?>')"><?php esc_html_e( 'Donate to this plugin &#187;' ); ?></button>
319 </div>
320
321 <?php
322
323 }
324
325 /** ==================================================
326 * Regenerate All Images
327 *
328 * @param string $to mail address.
329 * @since 1.00
330 */
331 public function allimages_regenerate( $to ) {
332
333 $pluswebp_settings = get_option( 'pluswebp' );
334
335 global $wpdb;
336
337 $mime_types = null;
338 foreach ( $pluswebp_settings['types'] as $value ) {
339 $mime_types .= "'" . $value . "'" . ',';
340 }
341 $mime_types = rtrim( $mime_types, ',' );
342
343 $wpdb->plus_webp_mime_type = 'AND post_mime_type IN (' . $mime_types . ')';
344
345 $post_ids = $wpdb->get_col(
346 "
347 SELECT ID
348 FROM $wpdb->posts
349 WHERE post_type = 'attachment'
350 $wpdb->plus_webp_mime_type
351 AND post_status = 'inherit'
352 "
353 );
354
355 if ( ! empty( $post_ids ) ) {
356 delete_option( 'pluswebp_generate' );
357 include_once ABSPATH . 'wp-admin/includes/image.php';
358 /* Generate WebP */
359 foreach ( $post_ids as $attach_id ) {
360 $metadata = wp_get_attachment_metadata( $attach_id );
361 do_action( 'wp_generate_attachment_metadata', $metadata, $attach_id );
362 }
363 /* Mail send */
364 do_action( 'pluswebp_mail_send', $to );
365 } else {
366 ?>
367 <div class="notice notice-error is-dismissible"><ul><li><?php esc_html_e( 'There are no images to convert. Generation stopped.', 'plus-webp' ); ?></li></ul></div>';
368 <?php
369 }
370
371 }
372
373 /** ==================================================
374 * Update wp_options table.
375 *
376 * @since 1.02
377 */
378 private function options_updated() {
379
380 if ( isset( $_POST['Manageset'] ) && ! empty( $_POST['Manageset'] ) ) {
381 if ( check_admin_referer( 'pwp_set', 'pluswebp_set' ) ) {
382 $pluswebp_settings = get_option( 'pluswebp' );
383 $list_types = array();
384 if ( isset( $_POST['list_types'] ) && ! empty( $_POST['list_types'] ) ) {
385 $tmps = filter_var(
386 wp_unslash( $_POST['list_types'] ),
387 FILTER_CALLBACK,
388 [
389 'options' => function( $value ) {
390 return sanitize_text_field( $value );
391 },
392 ]
393 );
394 foreach ( $tmps as $key => $value ) {
395 $list_types[] = $key;
396 }
397 $pluswebp_settings['types'] = $list_types;
398 } else {
399 $pluswebp_settings['types'] = $list_types;
400 }
401 if ( isset( $_POST['addext'] ) && ! empty( $_POST['addext'] ) ) {
402 $pluswebp_settings['addext'] = true;
403 } else {
404 $pluswebp_settings['addext'] = false;
405 }
406 if ( isset( $_POST['replace'] ) && ! empty( $_POST['replace'] ) ) {
407 $pluswebp_settings['replace'] = true;
408 } else {
409 $pluswebp_settings['replace'] = false;
410 }
411 if ( isset( $_POST['quality'] ) ) {
412 $pluswebp_settings['quality'] = intval( $_POST['quality'] );
413 }
414 update_option( 'pluswebp', $pluswebp_settings );
415 echo '<div class="notice notice-success is-dismissible"><ul><li>' . esc_html__( 'Settings' ) . ' --> ' . esc_html__( 'Settings saved.' ) . '</li></ul></div>';
416 }
417 }
418
419 }
420
421 /** ==================================================
422 * Generate notice
423 *
424 * @since 1.09
425 */
426 public function generate_notice() {
427
428 if ( get_option( 'pluswebp_generate_mail' ) ) {
429 $pluswebp_mail_send = get_option( 'pluswebp_generate_mail' );
430 if ( 0 < $pluswebp_mail_send['count'] ) {
431 ?>
432 <div class="notice notice-success is-dismissible"><ul><li><strong>Plus WebP</strong>
433 <?php
434 /* translators: %1$s Date Time, %2$d File Count */
435 echo wp_kses_post( sprintf( __( ' : %1$s : %2$d WebP files and their thumbnails have been generated. Details have been sent by e-mail.', 'plus-webp' ), $pluswebp_mail_send['datetime'], $pluswebp_mail_send['count'] ) );
436 ?>
437 </li></ul></div>
438 <?php
439 } else {
440 ?>
441 <div class="notice notice-error is-dismissible"><ul><li><strong>Plus WebP</strong>
442 <?php
443 /* translators: %1$s Date Time %2$s error message */
444 echo wp_kses_post( sprintf( __( ' : %1$s : %2$s', 'plus-webp' ), $pluswebp_mail_send['datetime'], __( 'WebP was not generated. A file with the same name already exists.', 'plus-webp' ) ) );
445 ?>
446 </li></ul></div>
447 <?php
448 }
449 delete_option( 'pluswebp_generate_mail' );
450 }
451
452 }
453
454 }
455
456
457