PluginProbe
WPJAM Basic / trunk
WPJAM Basic vtrunk
wpjam-basic / extends / wpjam-rewrites.php

wpjam-rewrites.php in WPJAM Basic trunk, at extends/wpjam-rewrites.php

90 lines 3.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Name: Rewrite 优化
4 URI: https://blog.wpjam.com/m/wpjam-rewrite/
5 Description: Rewrites 扩展让可以优化现有 Rewrites 规则和添加额外的 Rewrite 规则。
6 Version: 2.0
7 */
8 class WPJAM_Rewrite{
9 public static function __callStatic($method, $args){
10 if(str_ends_with($method, '_setting')){
11 if($method == 'update_setting'){
12 flush_rewrite_rules();
13
14 $args = array_slice($args, 0, 2);
15 }
16
17 return WPJAM_Basic::$method(...$args);
18 }
19 }
20
21 public static function query_items($args){
22 return wpjam_reduce(get_option('rewrite_rules') ?: [], fn($carry, $regex, $query)=> [...$carry, ['regex'=>wpautop($regex), 'query'=>wpautop($query)]], []);
23 }
24
25 public static function get_actions(){
26 return [
27 'optimize' => ['title'=>'优化', 'update_setting'=>true, 'class'=>'button-primary'],
28 'custom' => ['title'=>'自定义', 'update_setting'=>true],
29 ];
30 }
31
32 public static function get_fields($action_key='', $id=0){
33 if($action_key == 'custom'){
34 return ['rewrites'=>['type'=>'mu-fields', 'fields'=>self::get_fields()]];
35 }elseif($action_key == 'optimize'){
36 return wpjam_array(['date'=>'日期', 'comment'=>'留言', 'feed='=>'分类 Feed'], fn($k, $v)=> ['remove_'.$k.'_rewrite', ['label'=>'移除'.$v.' Rewrite 规则']]);
37 }
38
39 return wpjam_map(['regex'=>'正则', 'query'=>'查询'], fn($v)=> ['title'=>$v, 'type'=>'text', 'show_admin_column'=>true, 'required']);
40 }
41
42 public static function cleanup(&$rules){
43 $remove = array_filter([
44 self::get_setting('remove_feed=_rewrite') ? 'feed=' : '',
45 get_option('wp_attachment_pages_enabled') ? '' : 'attachment',
46 get_option('page_comments') ? '' : 'comment-page',
47 self::get_setting('disable_post_embed') ? '&embed=true' : '',
48 self::get_setting('disable_trackbacks') ? '&tb=1' : ''
49 ]);
50
51 if($remove){
52 foreach($rules as $key => $rule){
53 if($rule == 'index.php?&feed=$matches[1]'){
54 continue;
55 }
56
57 foreach($remove as $r){
58 if(str_contains($key, $r) || str_contains($rule, $r)){
59 unset($rules[$key]);
60 }
61 }
62 }
63 }
64 }
65
66 public static function add_hooks(){
67 self::get_setting('remove_comment_rewrite') && wpjam_hook('comments_rewrite_rules', []);
68 self::get_setting('remove_date_rewrite') && wpjam_hook('date_rewrite_rules', []) && add_action('init', fn()=> array_map('remove_rewrite_tag', ['%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%']));
69
70 $custom = wpjam_array(self::get_setting('rewrites') ?: [], fn($k, $v)=> $v['regex'] && !is_numeric($v['regex']) ? [$v['regex'], $v['query']] : null);
71
72 return [
73 ['generate_rewrite_rules', fn($wp_rewrite)=> wpjam_map(['rules', 'extra_rules_top'], fn($k)=> self::cleanup($wp_rewrite->$k))],
74 $custom ? ['rewrite_rules_array', '+', $custom] : []
75 ];
76 }
77 }
78
79 wpjam_add_menu_page('wpjam-rewrites', [
80 'parent' => 'wpjam-basic',
81 'menu_title' => 'Rewrites',
82 'network' => false,
83 'summary' => __FILE__,
84 'capability' => is_multisite() ? 'manage_sites' : 'manage_options',
85 'model' => 'WPJAM_Rewrite',
86 'function' => 'list',
87 'list_table' => ['title'=>'Rewrite 规则', 'primary_key'=>'regex', 'numberable'=>true]
88 ]);
89
90