HEX
Server: nginx/1.22.1
System: Linux VM-16-9-centos 3.10.0-1160.99.1.el7.x86_64 #1 SMP Wed Sep 13 14:19:20 UTC 2023 x86_64
User: www (1001)
PHP: 7.3.31
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/softfox.com.cn/wp-content/plugins/wpjam-basic/extends/wpjam-rewrites.php
<?php
/*
Name: Rewrite 优化
URI: https://blog.wpjam.com/m/wpjam-rewrite/
Description: Rewrites 扩展让可以优化现有 Rewrites 规则和添加额外的 Rewrite 规则。
Version: 1.0
*/
class WPJAM_Rewrite{
	public static function get_primary_key(){
		return 'rewrite_id';
	}

	public static function get_all(){
		return get_option('rewrite_rules') ?: [];
	}

	public static function get_rewrites(){
		return wpjam_basic_get_setting('rewrites', []);
	}

	public static function update_rewrites($rewrites){
		WPJAM_Basic::update_setting('rewrites', array_values($rewrites));
		flush_rewrite_rules();
		return true;
	}

	public static function is_added($id){
		if($current	= self::get($id)){
			foreach(self::get_rewrites() as $i => $rewrite){
				if($rewrite['regex'] == $current['regex']){
					return $i;
				}
			}
		}

		return false;
	}

	public static function get($id){
		$rewrites	= self::get_all();
		$regex_arr	= array_keys($rewrites);
		$i			= $id-1;

		if($regex = $regex_arr[$i] ?? ''){
			return ['rewrite_id'=>$id, 'regex'=>$regex, 'query'=>$rewrites[$regex]];
		}

		return [];
	}

	public static function validate_data($data, $id=''){
		if(empty($data['regex']) || empty($data['query'])){
			wp_die('Rewrite 规则不能为空');
		}

		if(is_numeric($data['regex'])){
			wp_die('无效的 Rewrite 规则');
		}

		$rewrites	= self::get_all();

		if($id){
			$current	= self::get($id);

			if(empty($current)){
				wp_die('该 Rewrite 规则不存在');
			}elseif($current['regex'] != $data['regex'] && isset($rewrites[$data['regex']])){
				wp_die('该 Rewrite 规则已使用');
			}
		}else{
			if(isset($rewrites[$data['regex']])){
				wp_die('该 Rewrite 规则已存在');
			}
		}

		return $data;
	}

	public static function insert($data){
		$data	= self::validate_data($data);

		if(is_wp_error($data)){
			return $data;
		}

		$rewrites	= self::get_rewrites();
		$rewrites	= array_merge([$data], $rewrites);

		self::update_rewrites($rewrites);

		return 1;
	}

	public static function update($id, $data){
		$data	= self::validate_data($data, $id);

		if(is_wp_error($data)){
			return $data;
		}

		$i	= self::is_added($id);

		if($i !== false){
			$rewrites		= self::get_rewrites();
			$rewrites[$i]	= $data;

			return self::update_rewrites($rewrites);
		}

		return true;
	}

	public static function bulk_delete($ids){
		$rewrites	= self::get_rewrites();

		foreach($ids as $id){
			$current	= self::get($id);

			if(empty($current)){
				wp_die('该 Rewrite 规则不存在');
			}

			$i	= self::is_added($id);

			if($i !== false){
				$rewrites	= array_except($rewrites, $i);
			}
		}

		return self::update_rewrites($rewrites);
	}
	
	public static function delete($id){
		$current	= self::get($id);

		if(empty($current)){
			wp_die('该 Rewrite 规则不存在');
		}

		$i	= self::is_added($id);

		if($i !== false){
			$rewrites	= self::get_rewrites();
			$rewrites	= array_except($rewrites, $i);

			return self::update_rewrites($rewrites);
		}

		return true;
	}

	public static function reset(){
		WPJAM_Basic::delete_setting('rewrites');
		flush_rewrite_rules();
		return true;
	}

	public static function query_items($limit, $offset){
		$items		= [];
		$rewrite_id	= 0;

		foreach(self::get_all() as $regex => $query) {
			$rewrite_id++;
			$items[]	= compact('rewrite_id', 'regex', 'query');
		}

		return ['items'=>$items, 'total'=>count($items)];
	}

	public static function render_item($item){
		$item['regex']	= wpautop($item['regex']);
		$item['query']	= wpautop($item['query']);

		return $item;
	}

	public static function get_actions(){
		return [
			'add'		=> ['title'=>'新建',	'first'=>true,	'response'=>'list'],
			'edit'		=> ['title'=>'编辑'],
			'delete'	=> ['title'=>'删除',	'direct'=>true,	'bulk'=>true,		'response'=>'list'],
			'reset'		=> ['title'=>'重置',	'direct'=>true,	'confirm'=>true,	'overall'=>'true',	'response'=>'list'],
		];
	}

	public static function get_fields($action_key='', $id=0){
		return [
			'regex'		=> ['title'=>'正则',		'type'=>'text',	'show_admin_column'=>true],
			'query'		=> ['title'=>'查询',		'type'=>'text',	'show_admin_column'=>true],
		];
	}

	public static function get_list_table(){
		return [
			'plural'		=> 'rewrites',
			'singular'		=> 'rewrite',
			'model'			=> self::class,
			'capability'	=> 'manage_rewrites',
			'per_page'		=> 300
		];
	}
}

class WPJAM_Rewrite_Setting extends WPJAM_Option_Model{
	public static function cleanup(&$rules){
		$unuse_rewrite_keys = ['comment-page', 'feed=', 'attachment'];

		foreach ($unuse_rewrite_keys as $i=>$unuse_rewrite_key) {
			if(self::get_setting('remove_'.$unuse_rewrite_key.'_rewrite') == false){
				unset($unuse_rewrite_keys[$i]);
			}
		}

		if(self::get_setting('disable_post_embed')){
			$unuse_rewrite_keys[]	= '&embed=true';
		}

		if(self::get_setting('disable_trackbacks')){
			$unuse_rewrite_keys[]	= '&tb=1';
		}

		if($unuse_rewrite_keys){
			foreach ($rules as $key => $rule) {
				if($rule == 'index.php?&feed=$matches[1]'){
					continue;
				}

				foreach ($unuse_rewrite_keys as $unuse_rewrite_key) {
					if(strpos($key, $unuse_rewrite_key) !== false || strpos($rule, $unuse_rewrite_key) !== false){
						unset($rules[$key]);
					}
				}
			}
		}
	}

	public static function filter_attachment_link($link, $post_id){
		return wp_get_attachment_url($post_id);
	}

	public static function on_generate_rewrite_rules($wp_rewrite){
		self::cleanup($wp_rewrite->rules); 
		self::cleanup($wp_rewrite->extra_rules_top);

		$rewrites = self::get_setting('rewrites');

		if($rewrites){
			$wp_rewrite->rules = array_merge(array_column($rewrites, 'query', 'regex'), $wp_rewrite->rules);
		}
	}

	public static function map_meta_cap($user_id, $args){
		if($args && !empty($args[0]) && WPJAM_Rewrite::is_added($args[0]) === false){
			return ['do_not_allow'];
		}else{
			return is_multisite() ? ['manage_sites'] : ['manage_options'];
		}
	}

	public static function get_fields(){
		return [
			'remove_date_rewrite'			=> ['type'=>'checkbox',	'description'=>'移除日期 Rewrite 规则'],
			'remove_comment_rewrite'		=> ['type'=>'checkbox',	'description'=>'移除留言 Rewrite 规则'],
			'remove_comment-page_rewrite'	=> ['type'=>'checkbox',	'description'=>'移除留言分页 Rewrite 规则'],
			'remove_feed=_rewrite'			=> ['type'=>'checkbox',	'description'=>'移除分类 Feed Rewrite 规则'],
			'remove_attachment_rewrite'		=> ['type'=>'checkbox',	'description'=>'移除附件 Rewrite 规则']
		];
	}

	public static function get_tabs(){
		$tabs	= [];

		$tabs['rules']	= [
			'title'			=> 'Rewrite 规则',
			'capability'	=> 'manage_rewrites',
			'map_meta_cap'	=> [self::class, 'map_meta_cap'],
			'function'		=> 'list',
			'list_table'	=> 'WPJAM_Rewrite',
			'network'		=> false
		];

		$tabs['optimize']	= [
			'title'			=> 'Rewrites 优化',
			'summary'		=> '如果你的网站没有使用以下页面,可以移除相关功能的的 Rewrites 规则以提高网站效率!',
			'function'		=> 'option',
			'option_name'	=> 'wpjam-basic',
		];

		return $tabs;
	}

	public static function get_menu_page(){
		return [
			'parent'		=> 'wpjam-basic',
			'menu_slug'		=> 'wpjam-rewrites',
			'menu_title'	=> 'Rewrites',
			'summary'		=> __FILE__,
			'function'		=> 'tab',
			'tabs'			=> [self::class, 'get_tabs']
		];	
	}

	public static function init(){
		if(self::get_setting('remove_date_rewrite')){
			remove_rewrite_tag('%year%');
			remove_rewrite_tag('%monthnum%');
			remove_rewrite_tag('%day%');
			remove_rewrite_tag('%hour%');
			remove_rewrite_tag('%minute%');
			remove_rewrite_tag('%second%');
		}
	}

	public static function add_hooks(){
		if(self::get_setting('remove_date_rewrite')){
			add_filter('date_rewrite_rules', '__return_empty_array');
		}

		if(self::get_setting('remove_attachment_rewrite')){
			add_filter('attachment_link',	[self::class, 'filter_attachment_link'], 10, 2);
		}

		if(self::get_setting('remove_comment_rewrite')){
			add_filter('comments_rewrite_rules', '__return_empty_array');
		}

		add_action('generate_rewrite_rules',	[self::class, 'on_generate_rewrite_rules']);
	}
}

wpjam_register_option('wpjam-basic', [
	'title'			=> 'Rewrites 优化',
	'plugin_page'	=> 'wpjam-rewrites',
	'current_tab'	=> 'optimize',
	'site_default'	=> true,
	'model'			=> 'WPJAM_Rewrite_Setting',
]);