PluginProbe
Plugin Load Filter / 4.4.0
Plugin Load Filter v4.4.0
trunk 2.0.0 2.0.1 2.1.0 2.2.0 2.2.1 2.3.0 2.3.1 2.4.0 2.4.1 2.5.1 3.3.0 4.0.6 4.1.1 4.2.0 4.3.0 4.3.1 4.4.0
← All changes | plugin-load-filter.php +1131 -439 2.0.04.4.0 View file →
@@ -1,34 +1,115 @@
1 1 <?php
2 2 /*
3 3 Plugin Name: plugin load filter
4 4 Description: Dynamically activate the selected plugins for each page. Response will be faster by filtering plugins.
5 - Version: 2.0.0
6 - Plugin URI: http://celtislab.net/wp_plugin_load_filter
5 + Version: 4.4.0
6 + Plugin URI: https://celtislab.net/en/wp-plugin-load-filter
7 7 Author: enomoto@celtislab
8 - Author URI: http://celtislab.net/
8 + Author URI: https://celtislab.net/
9 + Requires at least: 6.3
10 + Tested up to: 7.0
11 + Requires PHP: 8.1
9 12 License: GPLv2
10 13 Text Domain: plf
11 14 Domain Path: /languages
12 15 */
13 16
17 +defined( 'ABSPATH' ) || exit;
18 +
19 +/***************************************************************************
20 + * plugin activation / deactivation / uninstall
21 + **************************************************************************/
22 +if(is_admin()){
23 + //deactivation
24 + function plugin_load_filter_deactivation( $network_deactivating ) {
25 + $act = false;
26 + if (is_multisite()) {
27 + if(! $network_deactivating){
28 + global $wpdb;
29 + $current_blog_id = get_current_blog_id();
30 + $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
31 + foreach ( $blog_ids as $blog_id ) {
32 + if($blog_id == $current_blog_id){
33 + //current site
34 + }
35 + else {
36 + //other site active check
37 + switch_to_blog( $blog_id );
38 + if ( is_plugin_active( plugin_basename( __FILE__ )))
39 + $act = true;
40 + }
41 + }
42 + switch_to_blog( $current_blog_id );
43 + }
44 + }
45 + if($act === false){
46 + flush_rewrite_rules(); //options data 'rewrite_rules' clear for remake.
47 + if ( file_exists( WPMU_PLUGIN_DIR . "/plf-filter.php" )) {
48 + @unlink( WPMU_PLUGIN_DIR . '/plf-filter.php' );
49 + }
50 + }
51 + }
52 + register_deactivation_hook( __FILE__, 'plugin_load_filter_deactivation' );
53 +
54 + //uninstall
55 + function plugin_load_filter_uninstall() {
56 +
57 + if ( !is_multisite()) {
58 + delete_option('plf_queryvars');
59 + delete_option('plf_option' );
60 + delete_option('plf_addon_options');
61 + } else {
62 + global $wpdb;
63 + $current_blog_id = get_current_blog_id();
64 + $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
65 + foreach ( $blog_ids as $blog_id ) {
66 + switch_to_blog( $blog_id );
67 + delete_option('plf_queryvars');
68 + delete_option('plf_option' );
69 + delete_option('plf_addon_options');
70 + }
71 + switch_to_blog( $current_blog_id );
72 + }
73 + if ( file_exists( WPMU_PLUGIN_DIR . "/plf-filter.php" )) {
74 + @unlink( WPMU_PLUGIN_DIR . '/plf-filter.php' );
75 + }
76 + }
77 + register_uninstall_hook(__FILE__, 'plugin_load_filter_uninstall');
78 +
79 +}
80 +
14 81 $Plf_setting = new Plf_setting();
15 82
16 83 class Plf_setting {
17 84
18 - private $plugins_inf = ''; //active plugin/module infomation
19 - private $editem = false;
20 - private $filter = array(); //filter option data
85 + static $plugins_inf = ''; //active plugin/module infomation
86 + static $filter = array(); //filter option data
21 87 private $tab_num = 0;
22 -
88 +
23 89 /***************************************************************************
24 90 * Style Sheet
25 91 **************************************************************************/
26 92 function plf_css() { ?>
27 93 <style type="text/css">
28 - .plugins-list { max-width : 480px; min-height: 80px; max-height: 320px; overflow: auto; border: 1px solid #CEE1EF; padding:0.5em 0.5em;}
29 - ul.plugins-list ul { margin-left: 20px; }
30 - ul.plugins-list li { margin: 0; padding: 0; line-height: 22px; word-wrap: break-word;}
94 + #plugin-filter-select {margin-top: 12px;}
95 + #plugin-filter-select p {margin: 1em 0;}
96 + #page-filter-stat { margin-top: 12px;}
97 + #activation-table { padding-bottom: 8px; border: 1px solid #eee;}
98 + #activation-table th { text-align: center;}
99 + #activation-table td { font-size: 97%;}
100 + #activation-table input[type=checkbox] { height: 25px; width: 25px; opacity: 0;}
101 + #plf-post-locale-select { margin-top: 16px;}
102 + thead .plugins-name { background-color: aliceblue;}
103 + thead .device-type { background-color: oldlace;}
104 + thead .plugins-name, tbody .plugins-name { min-width: 144px; max-width: 200px; padding: 3px 3px 3px 5px;}
105 + thead .device-type, tbody .device-type { min-width: 40px; max-width: 40px; text-align: center; padding: 5px 1px 2px;}
106 + .dashicons-yes:before { font-size: 20px; border: 1px solid #eee; background-color: whitesmoke;}
107 + .device-type label { color: whitesmoke; }
108 + input.altcheckbox[type="checkbox"] { -webkit-appearance: none; appearance: none; position: absolute;}
109 + .device-type input.altcheckbox[type="checkbox"]:checked + span.dashicons-yes:before { background-color: yellowgreen; }
110 + .plf-option-info { font-size:12px; margin:10px 0; padding:3px; background-color:#fff8e5;}
111 + .edit-post-locale-link span.dashicons { width: 0.8em; height: 0.8em; margin: -0.4em 0.1em 0; vertical-align: middle; text-decoration: initial;}
31 112 </style>
32 113 <?php }
33 114
34 115 function jquery_tab_css() { ?>
@@ -49,102 +130,151 @@
49 130 .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus { border: 1px solid #0073ea; background-color: #0073ea; font-weight: bold; color: #ffffff; }
50 131 .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #dddddd; background-color: #0073ea; font-weight: bold; color: #ffffff; }
51 132 .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #ffffff; text-decoration: none; }
52 133 .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; }
134 +
135 + #wrap_registration-table, #wrap_activation-table { overflow:auto; height:600px; position: relative;}
136 + #registration-table input[type=radio], #registration-table input[type=checkbox], #activation-table input[type=checkbox] { height: 25px; width: 25px; opacity: 0;}
137 + #registration-table th {text-align: center;}
138 + thead, tbody { display: block;}
139 + .widefat * { word-wrap: break-word !important;}
140 + .widefat thead { position:sticky; top:0px; z-index:1;}
141 + .widefat tr:first-of-type th:first-of-type {position: sticky; left: 0px; text-align: left; background-color: aliceblue; z-index:3;}
142 + .widefat th { padding: 8px;}
143 + .widefat td { padding: 8px;}
144 + .widefat td:first-of-type { position: sticky; left: 0px; text-align: left; background-color: white;}
145 + thead .filter-plugins-name, thead .plugins-name { background-color: aliceblue;}
146 + thead .urlfilter { background-color: lavenderblush;}
147 + .filter-none, .filter-admin, .filter-tmpl { background-color: honeydew;}
148 + thead .device-type { background-color: oldlace;}
149 + thead .ckbox-type { background-color: lavender;}
150 + thead .pformat { background-color: honeydew;}
151 + thead .tmpl-embed { background-color: lightyellow;}
152 + thead .tmpl-custom { background-color: lavenderblush;}
153 + thead .filter-plugins-name, tbody .filter-plugins-name { min-width: 240px; max-width: 240px;}
154 + thead .plugins-name, tbody .plugins-name { min-width: 180px; max-width: 180px;}
155 + thead .device-type, tbody .device-type, thead .ckbox-type, tbody .ckbox-type, thead .deny-type, tbody .deny-type { min-width: 40px; max-width: 40px; text-align: center;}
156 + thead .filter-type, tbody .filter-type { min-width: 56px; max-width: 56px; text-align:center;}
157 + .urlfilter-description { padding: 0 10px 15px;}
158 + .grid-row { display: flex; flex-flow: row wrap;}
159 + .filter-description { padding: 0 10px; width:62%;}
160 + .side-info { width: 30%; padding-left: 24px;}
161 + .ckbox-list { padding: 4px 0 12px}
162 + .ckbox-list label { white-space:nowrap;}
163 + .ckbox-list span { margin-right: 12px; }
164 + .dashicons:before { font-size: 24px; }
165 + .radio-green label, .radio-red label { color: #ddd; margin-left: -32px; }
166 + .ckbox-type label { color: #ddd;}
167 + .radio-green input[type="radio"]:checked + span { color: #8bc34a; }
168 + .radio-red input[type="radio"]:checked + span { color: tomato; }
169 + .ckbox-type input[type="checkbox"]:checked + span { color: #4caf50; }
170 + .deny-type label { color: #4caf50;}
171 + .deny-type input.altcheckbox[type="checkbox"]:checked + span { color: #ddd; }
172 + .dashicons-yes:before { font-size: 20px; border: 1px solid #eee; }
173 + .device-type input.altcheckbox[type="checkbox"]:checked + span.dashicons-yes:before { background-color: yellowgreen; }
174 + .option-item { margin-bottom: 28px; }
53 175 </style>
54 176 <?php }
55 -
177 +
56 178 /***************************************************************************
57 179 * Plugin Load Filter Option Setting
58 180 **************************************************************************/
59 181
60 182 public function __construct() {
61 -
62 - load_plugin_textdomain('plf', false, basename( dirname( __FILE__ ) ).'/languages' );
63 -
64 - $this->filter = get_option('plf_option');
183 +
184 + self::$filter = get_option('plf_option', array());
185 + if(empty(self::$filter['optver']) || self::$filter['optver'] < '2'){
186 + self::$filter['optver'] = '2';
187 + //ここにデータフォーマットが変わった場合の変換処理を記述
188 + }
189 + if(!empty(self::$filter['language'])){
190 + add_action( 'wp_head', array('Plf_setting', 'altenate_hreflang') );
191 + }
192 +
65 193 if(is_admin()) {
66 194 add_action( 'plugins_loaded', array(&$this, 'plf_admin_start'), 9999 );
67 - add_action( 'update_option_plf_option', array(&$this, 'plf_transient_clear') );
68 - add_action( 'update_option_active_plugins', array(&$this, 'plf_transient_clear') );
69 - add_action( 'update_option_jetpack_active_modules', array(&$this, 'plf_transient_clear') );
70 - add_action( 'update_option_celtispack_active_modules', array(&$this, 'plf_transient_clear') );
195 + add_action( 'admin_init', array(&$this, 'action_posts'));
71 196 add_action( 'add_meta_boxes', array(&$this, 'load_meta_boxes'), 10, 2 );
72 - //plf-filter must-use plagin activete check
73 - if(wp_mkdir_p( WPMU_PLUGIN_DIR )){
74 - if ( !file_exists( WPMU_PLUGIN_DIR . "/plf-filter.php" )) {
75 - @copy(__DIR__ . '/mu-plugins/plf-filter.php', WPMU_PLUGIN_DIR . '/plf-filter.php');
76 - }
77 - }
78 - register_deactivation_hook( __FILE__, 'Plf_setting::deactivation' );
79 - register_uninstall_hook(__FILE__, 'Plf_setting::uninstall');
80 197 }
81 - add_action( 'save_post', array(&$this, 'plf_transient_clear') );
82 - add_action( 'deleted_post', array(&$this, 'plf_transient_clear') );
83 198 add_action( 'wp_ajax_plugin_load_filter', array(&$this, 'plf_ajax_postidfilter'));
84 199 }
85 200
86 - //Plugin Deactivate
87 - public static function deactivation() {
88 - if ( file_exists( WPMU_PLUGIN_DIR . "/plf-filter.php" )) {
89 - @unlink( WPMU_PLUGIN_DIR . '/plf-filter.php' );
90 - }
91 - }
92 - //Plugin Uninstall
93 - public static function uninstall() {
94 - delete_option('plf_queryvars');
95 - delete_option('plf_option' );
96 - }
97 -
98 - //Disable the transient cache by changing the update time
99 - public function plf_transient_clear() {
100 - $this->filter['updated'] = strtotime("now");
101 - update_option('plf_option', $this->filter );
102 - }
103 -
104 201 //Plugin Load Filter admin setting start
105 202 public function plf_admin_start() {
106 203 require_once(ABSPATH . 'wp-admin/includes/plugin.php');
107 204
108 - $this->plugins_inf = get_plugins();
109 - $packplug = array();
110 - foreach ( $this->plugins_inf as $plugin_key => $a_plugin ) {
111 - if(is_plugin_inactive( $plugin_key )){
112 - unset($this->plugins_inf[$plugin_key]);
205 + self::$plugins_inf = get_plugins();
206 + //Ver4.0.0 でしか呼び出せないメソッドを呼び出さないよう新設した switch_theme があるかどうかで判定
207 + if(method_exists('Plf_filter', 'switch_theme')){
208 + if(class_exists('Plf_filter')){
209 + if ( is_multisite() )
210 + remove_filter('pre_site_option_active_sitewide_plugins', array('Plf_filter', 'active_sitewide_plugins'));
211 + remove_filter('pre_option_active_plugins', array('Plf_filter', 'active_plugins'));
113 212 }
114 - }
115 - //jetpack active module
116 - if(method_exists('Jetpack', 'get_module')){
117 - $modules = Jetpack::get_active_modules();
118 - $modules = array_diff( $modules, array( 'vaultpress' ) );
119 - foreach ( $modules as $key => $module_name ) {
120 - if(!empty($module_name)){
121 - $module = Jetpack::get_module( $module_name );
122 - if(!empty($module))
123 - $this->plugins_inf['jetpack_module/' . $module_name] = $module;
213 + foreach ( self::$plugins_inf as $plugin_key => $a_plugin ) {
214 + if(is_plugin_inactive( $plugin_key )){
215 + unset(self::$plugins_inf[$plugin_key]);
124 216 }
125 217 }
126 - }
127 - //celtispack active module
128 - if(method_exists('Celtispack', 'get_module')){
129 - $modules = Celtispack::get_active_modules();
130 - foreach ( $modules as $key => $module_name ) {
131 - if(!empty($module_name)){
132 - $this->plugins_inf['celtispack_module/' . $module_name] = Celtispack::get_module( $module_name );
218 + if(class_exists('Plf_filter')){
219 + if ( is_multisite() )
220 + add_filter('pre_site_option_active_sitewide_plugins', array('Plf_filter', 'active_sitewide_plugins'));
221 + add_filter('pre_option_active_plugins', array('Plf_filter', 'active_plugins'));
222 + }
223 +
224 + //jetpack active module
225 + if(method_exists('Jetpack', 'get_module')){
226 + if(class_exists('Plf_filter')){
227 + remove_filter('pre_option_jetpack_active_modules', array('Plf_filter', 'active_jetmodules'));
133 228 }
229 + $modules = Jetpack::get_active_modules();
230 + $modules = array_diff( $modules, array( 'vaultpress' ) );
231 + foreach ( $modules as $key => $module_name ) {
232 + if(!empty($module_name)){
233 + $module = Jetpack::get_module( $module_name );
234 + if(!empty($module))
235 + self::$plugins_inf['jetpack_module/' . $module_name] = $module;
236 + }
237 + }
238 + if(class_exists('Plf_filter')){
239 + add_filter('pre_option_jetpack_active_modules', array('Plf_filter', 'active_jetmodules'));
240 + }
134 241 }
242 + //celtispack active module
243 + if(method_exists('Celtispack', 'get_module')){
244 + if(class_exists('Plf_filter')){
245 + remove_filter('pre_option_celtispack_active_modules', array('Plf_filter', 'active_celtismodules'));
246 + }
247 + $modules = Celtispack::get_active_modules();
248 + foreach ( $modules as $key => $module_name ) {
249 + if(!empty($module_name)){
250 + self::$plugins_inf['celtispack_module/' . $module_name] = Celtispack::get_module( $module_name );
251 + }
252 + }
253 + if(class_exists('Plf_filter')){
254 + add_filter('pre_option_celtispack_active_modules', array('Plf_filter', 'active_celtismodules'));
255 + }
256 + }
257 + if ( empty( self::$plugins_inf ) )
258 + return;
135 259 }
136 - if ( empty( $this->plugins_inf ) )
137 - return;
138 260
139 - $this->action_posts(); //POST, GET Request Action
140 261 add_action('admin_menu', array(&$this, 'plf_option_menu'));
141 262 }
142 263
264 + static function get_plugins_inf() {
265 + $inf = (!empty(self::$plugins_inf))? self::$plugins_inf : false;
266 + return $inf;
267 + }
268 +
143 269 //Plugins sub menu add
144 270 public function plf_option_menu() {
145 - $page = add_plugins_page( 'Plugin Load Filter', __('Plugin Load Filter', 'plf'), 'manage_options', 'plugin_load_filter_admin_manage_page', array(&$this,'plf_option_page'));
146 - add_action('admin_print_scripts-'.$page, array(&$this, 'plf_scripts'));
271 + if(current_user_can( 'activate_plugins' )){
272 + $page = add_menu_page( 'Plugin Load FIlter Settings', esc_html__('Plugin Load Filter', 'plf'), 'manage_options', 'plugin_load_filter_admin_manage_page', array(&$this, 'plf_option_page'), 'dashicons-filter', '65.1');
273 + add_submenu_page( 'plugin_load_filter_admin_manage_page', 'Plugin Load FIlter Settings', esc_html__('General Settings', 'plf'), 'manage_options', 'plugin_load_filter_admin_manage_page', array(&$this, 'plf_option_page') );
274 + add_action( 'admin_print_scripts-'.$page, array(&$this, 'plf_scripts') );
275 + add_action( 'admin_print_scripts-'.$page, array(&$this, 'deploy_mu_plugins'));
276 + }
147 277 }
148 278
149 279 //Plugin Load Filter setting page script
150 280 function plf_scripts() {
@@ -154,222 +284,631 @@
154 284 wp_enqueue_script( 'jquery-ui-tabs' );
155 285 add_action( 'admin_head', array(&$this, 'plf_css' ));
156 286 add_action( 'admin_head', array(&$this, 'jquery_tab_css' ));
157 287 add_action( 'admin_footer', array(&$this, 'activetab_script' ));
288 + add_action( 'admin_notices', array('Plf_setting', 'plf_notice'));
158 289 }
290 +
291 + //plf-filter.php mu-plugins module set
292 + public function deploy_mu_plugins() {
293 + if(wp_mkdir_p( WPMU_PLUGIN_DIR )){
294 + if ( !file_exists( WPMU_PLUGIN_DIR . "/plf-filter.php" )) {
295 + @copy(__DIR__ . '/mu-plugins/plf-filter.php', WPMU_PLUGIN_DIR . '/plf-filter.php');
296 + }
297 + else {
298 + require_once(ABSPATH . 'wp-admin/includes/plugin.php');
299 + $dp = get_plugin_data( WPMU_PLUGIN_DIR . "/plf-filter.php", false, false );
300 + $sp = get_plugin_data( __DIR__ . '/mu-plugins/plf-filter.php', false, false );
301 + if(version_compare( $dp['Version'], $sp['Version'], '!=')){
302 + @copy(__DIR__ . '/mu-plugins/plf-filter.php', WPMU_PLUGIN_DIR . '/plf-filter.php');
303 + }
304 + }
305 + }
306 + }
307 +
308 + //Notice Message display
309 + static function plf_notice() {
310 + $notice = get_transient('plf_notice');
311 + if(!empty($notice)){
312 + echo '<div class="notice notice-warning"><p>Plugin Load Filter : ' . esc_html($notice) . '</p></div>';
313 + delete_transient('plf_notice');
314 + }
315 + }
159 316
160 317 //plugin filter option action request (add, update, delete)
161 318 function action_posts() {
162 - if (current_user_can( 'edit_plugins' )) {
319 + if (current_user_can( 'activate_plugins' )) {
163 320 if( isset($_POST['edit_regist_filter']) ) {
164 - if(isset($_POST['plf_option']['_tag'])){
321 + if(isset($_POST['plfregist'])){
165 322 check_admin_referer('plugin_load_filter');
166 - $option["plugins"] = '';
167 - if(isset($_POST['plf_option']['plugins'])){
323 + //url filter
324 + $groupkeys = (method_exists('Plf_filter', 'get_active_group'))? Plf_filter::get_active_group() : array();
325 + if(!empty($groupkeys) && isset($_POST['plfurlkey'])){
326 + $plfurlkey = $_POST['plfurlkey']; //array
327 + foreach( $groupkeys as $item){
328 + if(empty( $plfurlkey[$item])){
329 + self::$filter['plfurlkey'][$item]['plugins'] = '';
330 + } else {
331 + $plugins = array();
332 + foreach ( $plfurlkey[$item] as $p_key => $val ) {
333 + if($val == '1')
334 + $plugins[] = sanitize_text_field($p_key);
335 + }
336 + $option["plugins"] = implode(",", $plugins);
337 + self::$filter['plfurlkey'][$item] = $option;
338 + }
339 + }
340 + }
341 + //page type filter
342 + foreach( array('_admin', '_pagefilter') as $item){
168 343 $plugins = array();
169 - foreach($_POST['plf_option']['plugins'] as $plugin => $val) {
170 - $plugins[] = $plugin;
344 + $plfregist = $_POST['plfregist']; //array
345 + foreach ( $plfregist as $p_key => $val ) {
346 + if($val == $item){
347 + $p_key = sanitize_text_field($p_key);
348 + $plugins[$p_key] = sanitize_text_field($val);
349 + }
171 350 }
172 - $option["plugins"] = implode(",", $plugins);
351 + if($item == '_pagefilter'){
352 + //If all modules is specified filter, in some cases you want to deactivate plugin itself.
353 + $jbase = $cbase = '';
354 + $jall = $call = true;
355 + foreach ( $plfregist as $p_key => $val ) {
356 + $p_key = sanitize_text_field($p_key);
357 + if(strpos($p_key, 'jetpack/') !== false)
358 + $jbase = $p_key;
359 + else if(strpos($p_key, 'celtispack/') !== false)
360 + $cbase = $p_key;
361 + else if(strpos($p_key, 'jetpack_module/') !== false){
362 + if($val != '_pagefilter' && $val != '_admin'){
363 + $jall = false;
364 + }
365 + }
366 + else if(strpos($p_key, 'celtispack_module/') !== false){
367 + if($val != '_pagefilter' && $val != '_admin')
368 + $call = false;
369 + }
370 + }
371 + if(!empty($jbase) && $jall === false)
372 + unset($plugins[$jbase]);
373 + if(!empty($cbase) && $call === false)
374 + unset($plugins[$cbase]);
375 + }
376 + $option["plugins"] = implode(",", array_keys($plugins));
377 + self::$filter[$item] = $option;
173 378 }
174 - $this->filter[$_POST['plf_option']['_tag']] = $option;
175 - $this->filter['updated'] = strtotime("now");
176 - update_option('plf_option', $this->filter );
379 + //exclude option
380 + if(isset($_POST['plf_option']['exclude'])){
381 + $exclude = array();
382 + $optexcl = $_POST['plf_option']['exclude']; //array
383 + foreach ( $optexcl as $ft => $v ) {
384 + if(!empty($v)){
385 + $ft = sanitize_text_field($ft);
386 + $exclude[$ft] = true;
387 + }
388 + }
389 + self::$filter['exclude'] = $exclude;
390 + } else {
391 + self::$filter['exclude'] = array();
392 + }
393 +
394 + //hide singlr post filter for custom post type
395 + if(isset($_POST['plf_option']['hidecpt'])){
396 + $hidecpt = array();
397 + $optcpt = $_POST['plf_option']['hidecpt']; //array
398 + foreach ( $optcpt as $ft => $v ) {
399 + if(!empty($v)){
400 + $ft = sanitize_text_field($ft);
401 + $hidecpt[$ft] = true;
402 + }
403 + }
404 + self::$filter['hidecpt'] = $hidecpt;
405 + } else {
406 + self::$filter['hidecpt'] = array();
407 + }
408 +
409 + //admin bar (filtered stat)
410 + self::$filter['admin_bar'] = (isset($_POST['plf_option']['admin_bar']))? 1 : 0;
411 +
412 + //Language option
413 + self::$filter['language'] = (isset($_POST['plf_option']['language']))? 1 : 0;
414 +
415 + //Ajax acceleration plugin filter (for plugin developers)
416 + self::$filter['ajax_accelfilter'] = (isset($_POST['plf_option']['ajax_accelfilter']))? 1 : 0;
417 +
418 + update_option('plf_option', self::$filter, 'no' );
177 419 }
178 420 header('Location: ' . admin_url('plugins.php?page=plugin_load_filter_admin_manage_page'));
179 421 exit;
180 - }
181 - elseif( isset($_POST['clear_regist_filter']) ) {
422 +
423 + } elseif( isset($_POST['clear_regist_filter']) ) {
424 + check_admin_referer('plugin_load_filter');
425 + if(!empty(self::$filter['plfurlkey'])){
426 + foreach (self::$filter['plfurlkey'] as $key => $val) {
427 + unset(self::$filter['plfurlkey'][$key]);
428 + }
429 + }
430 + foreach( array('_admin', '_pagefilter') as $item){
431 + self::$filter[$item] = array();
432 + }
433 + self::$filter['exclude'] = array();
434 + self::$filter['hidecpt'] = array();
435 +
436 + //old data unset
437 + if(isset(self::$filter['urlkey'])){
438 + unset(self::$filter['urlkey']);
439 + }
440 + if(isset(self::$filter['urlkeylist'])){
441 + unset(self::$filter['urlkeylist']);
442 + }
443 +
444 + self::$filter['admin_bar'] = 0;
445 + self::$filter['language'] = 0;
446 + self::$filter['ajax_accelfilter'] = 0;
447 + update_option('plf_option', self::$filter, 'no' );
182 448 header('Location: ' . admin_url('plugins.php?page=plugin_load_filter_admin_manage_page'));
183 449 exit;
184 - }
185 - else if( isset($_POST['new_page_filter']) || isset($_POST['edit_page_filter']) ) {
186 - if(isset($_POST['plf_option']['tag'])){
450 +
451 + } else if(isset($_POST['edit_activate_page_filter']) ) {
452 + if(isset($_POST['plfactive'])){
187 453 check_admin_referer('plugin_load_filter');
188 - $option["plugins"] = '';
189 - if(isset($_POST['plf_option']['plugins'])){
454 + self::$filter['group'] = array();
455 + $plfactive = $_POST['plfactive']; //array
456 + $group = array_keys($plfactive);
457 + foreach( $group as $item){
190 458 $plugins = array();
191 - foreach($_POST['plf_option']['plugins'] as $plugin => $val) {
192 - $plugins[] = $plugin;
193 - }
459 + foreach ( $plfactive[$item] as $p_key => $val ) {
460 + if($val == '1')
461 + $plugins[] = sanitize_text_field($p_key);
462 + }
194 463 $option["plugins"] = implode(",", $plugins);
464 + self::$filter['group'][$item] = $option;
195 465 }
196 - $this->filter['group'][$_POST['plf_option']['tag']] = $option;
197 - $this->filter['updated'] = strtotime("now");
198 - update_option('plf_option', $this->filter );
466 + update_option('plf_option', self::$filter, 'no' );
199 467 }
200 468 header('Location: ' . admin_url('plugins.php?page=plugin_load_filter_admin_manage_page&action=tab_1'));
201 469 exit;
202 - }
203 - elseif( isset($_POST['clear_page_filter']) ) {
470 +
471 + } elseif( isset($_POST['clear_activate_page_filter']) ) {
472 + check_admin_referer('plugin_load_filter');
473 + self::$filter['group'] = array();
474 + update_option('plf_option', self::$filter, 'no' );
204 475 header('Location: ' . admin_url('plugins.php?page=plugin_load_filter_admin_manage_page&action=tab_1'));
205 476 exit;
206 477 }
207 - else if (!empty($_GET['action'])) {
208 - if( $_GET['action']=='edit_filter_table') {
209 - $this->editem = $_GET['item'];
210 - $this->tab_num = (0 === strpos($_GET['item'], '_'))? 0 : 1;
211 - }
212 - elseif( $_GET['action']=='del_filter_table') {
213 - if( !empty( $_GET['item'])){
214 - check_admin_referer( 'plugin_load_filter' );
215 - $tab_action = '';
216 - if(0 === strpos($_GET['item'], '_')){
217 - unset($this->filter[$_GET['item']]);
218 - }
219 - else {
220 - unset($this->filter['group'][$_GET['item']]);
221 - $tab_action = '&action=tab_1';
222 - }
223 - $this->filter['updated'] = strtotime("now");
224 - update_option('plf_option', $this->filter );
225 - }
226 - header('Location: ' . admin_url('plugins.php?page=plugin_load_filter_admin_manage_page'.$tab_action));
227 - exit;
228 - }
229 - elseif( $_GET['action']=='tab_1') {
230 - $this->tab_num = 1;
231 - }
478 + if(!empty($_GET['action']) && $_GET['action']=='tab_1') {
479 + $this->tab_num = 1;
232 480 }
233 481 }
234 482 }
235 483
236 - public function filter_stat( $sw, $stat) {
237 - if( $sw === 'exclude') {
238 - if(empty($stat))
239 - $str = '<span style="color: #339966;">"Page filter plugins Activate"</span>';
240 - else
241 - $str = '<span style="color: #ff0000;">' . $stat. '</span>';
242 - }
243 - elseif( $sw === 'include') {
244 - if(empty($stat))
245 - $str = '<span style="color: #ff0000;">"Page filter plugins Deactivate"</span>';
246 - else
247 - $str = '<span style="color: #339966;">' . $stat. '</span>';
248 - }
249 - else
250 - $str = $stat;
251 - return $str;
252 - }
253 -
254 484 //Plugin or Module key to name
255 - // $type : smart/csv/list/tree
256 - public function pluginkey_to_name( $infkey, $type='smart') {
257 -
485 + // $type : list/smart/tree
486 + static function pluginkey_to_name( $infkey, $type='list') {
258 487 $name = '';
259 488 if(strpos($infkey, 'jetpack_module/') !== false){
260 - if(!empty($this->plugins_inf[$infkey]['name'])){
489 + if(!empty(self::$plugins_inf[$infkey]['name'])){
261 490 $m_mark = ($type !== 'list')? '-' : 'Jetpack-';
262 491 if($type === 'smart') {
263 - if(empty($this->filter['_pagefilter']['plugins']) || strpos($this->filter['_pagefilter']['plugins'], 'jetpack/') === false)
264 - $name = $m_mark . $this->plugins_inf[$infkey]['name'];
492 + if(empty(self::$filter['_pagefilter']['plugins']) || strpos(self::$filter['_pagefilter']['plugins'], 'jetpack/') === false)
493 + $name = $m_mark . self::$plugins_inf[$infkey]['name'];
494 + } else {
495 + $name = $m_mark . self::$plugins_inf[$infkey]['name'];
265 496 }
266 - else
267 - $name = $m_mark . $this->plugins_inf[$infkey]['name'];
268 497 }
269 - }
270 - elseif(strpos($infkey, 'celtispack_module/') !== false){
271 - if(!empty($this->plugins_inf[$infkey]['Name'])){
498 + } elseif(strpos($infkey, 'celtispack_module/') !== false){
499 + if(!empty(self::$plugins_inf[$infkey]['Name'])){
272 500 $m_mark = ($type !== 'list')? '-' : 'Celtispack-';
273 501 if($type === 'smart') {
274 - if(empty($this->filter['_pagefilter']['plugins']) || strpos($this->filter['_pagefilter']['plugins'], 'celtispack/') === false)
275 - $name = $m_mark . $this->plugins_inf[$infkey]['Name'];
502 + if(empty(self::$filter['_pagefilter']['plugins']) || strpos(self::$filter['_pagefilter']['plugins'], 'celtispack/') === false)
503 + $name = $m_mark . self::$plugins_inf[$infkey]['Name'];
504 + } else {
505 + $name = $m_mark . self::$plugins_inf[$infkey]['Name'];
276 506 }
277 - else
278 - $name = $m_mark . $this->plugins_inf[$infkey]['Name'];
279 507 }
508 + } else {
509 + if(!empty(self::$plugins_inf[$infkey]['Name']))
510 + $name = self::$plugins_inf[$infkey]['Name'];
280 511 }
281 - else {
282 - if(!empty($this->plugins_inf[$infkey]['Name']))
283 - $name = $this->plugins_inf[$infkey]['Name'];
284 - }
285 512 return($name);
286 513 }
287 514
288 - //Checkbox
515 + // wp_kses() サニタイズで form,input,select タグを許可
516 + public static function get_allowed_tags() {
517 + global $allowedposttags;
518 + $allowed_tags = $allowedposttags;
519 + $allowed_tags['form'] = array( 'action' => true, 'accept' => true, 'accept-charset' => true, 'enctype' => true, 'method' => true, 'name' => true, 'target' => true );
520 + $allowed_tags['label'] = array( 'for' => true );
521 + $allowed_tags['input'] = array( 'type' => true, 'name' => true, 'value' => true, 'checked' => true);
522 + $allowed_tags['select'] = array( 'name' => true, 'multiple' => true );
523 + $allowed_tags['option'] = array( 'value' => true, 'selected' => true );
524 + $allowed_tags['button'] = array( 'href' => true, 'onclick' => true);
525 + $allowed_tags['a']['onclick'] = true;
526 + $allowed_tags = array_map( '_wp_add_global_attributes', $allowed_tags );
527 + return $allowed_tags;
528 + }
529 + //Checkbox for addon
289 530 static function checkbox($name, $value, $label = '') {
290 531 return "<label><input type='checkbox' name='$name' value='1' " . checked( $value, 1, false ). "/> $label</label>";
291 532 }
292 - //DropdownList
293 - static function dropdown($name, $items, $selected, $args=null) {
294 - $defaults = array( 'id' => $name, 'class' => "", 'multiple' => false );
295 - foreach($items as $key => &$value) {
296 - if (is_array($value))
297 - $value = array_shift($value);
298 - }
299 - $opt = wp_parse_args($args, $defaults);
300 - $name = ($name) ? "name='$name'" : "";
301 - $id = ($opt['id']) ? "id='${opt['id']}'" : "";
302 - $class = ($opt['class']) ? "class='${opt['class']}'" : "";
303 - $multiple = ($opt['multiple']) ? "multiple='multiple'" : "";
533 + static function altcheckbox($name, $value, $label = '') {
534 + return "<label><input type='checkbox' name='$name' class='altcheckbox' value='1' " . checked( $value, 1, false ). "/> $label</label>";
535 + }
304 536
305 - $html = "<select $name $id $class $multiple >";
306 - foreach ((array)$items as $key => $label) {
307 - $key = esc_attr($key);
308 - $label = esc_attr($label);
309 - $html .= "<option value='$key' " . selected($selected, $key, false) . ">$label</option>";
310 - }
311 - $html .= "</select>";
312 - return $html;
313 - }
537 + //dropdown list for addon
538 + static function dropdown($name, $items, $selected, $args = null, $display = false) {
539 + $defaults = array(
540 + 'id' => $name,
541 + 'none' => false,
542 + 'class' => null,
543 + 'multiple' => false,
544 + );
545 +
546 + if (!is_array($items))
547 + return;
548 +
549 + if (empty($items))
550 + $items = array();
551 +
552 + // Items is in key => value format. If value is itself an array, use only the 1st column
553 + foreach ($items as $key => &$value) {
554 + if (is_array($value))
555 + $value = array_shift($value);
556 + }
557 +
558 + extract(wp_parse_args($args, $defaults));
559 +
560 + // If 'none' arg provided, prepend a blank entry
561 + if ($none) {
562 + if ($none === true)
563 + $none = '&nbsp;';
564 + $items = array('' => $none) + $items; // Note that array_merge() won't work because it renumbers indexes!
565 + }
566 +
567 + if (!$id)
568 + $id = $name;
569 +
570 + $name = ($name) ? ' name="' . esc_html($name) . '"' : '';
571 + $id = ($id) ? ' id="' . esc_html($id) . '"' : '';
572 + $class = ($class)? ' class="'. esc_html($class). '"' : '';
573 + $multiple = ($multiple) ? ' multiple="multiple"' : '';
574 +
575 + $html = '<select' . $name . $id . $class . $multiple .'>';
576 + foreach ((array) $items as $key => $label) {
577 + $html .= '<option value="' . esc_html($key) . '" ' . selected($selected, $key, false) . '>' . esc_html($label) . '</option>';
578 + }
579 + $html .= '</select>';
580 + if($display){
581 + echo wp_kses( $html, array(
582 + 'select' => array( 'name' => true, 'id' => true, 'class' => true, 'multiple' => true ),
583 + 'option' => array( 'value' => true, 'selected' => true )
584 + ));
585 + } else {
586 + return $html;
587 + }
588 + }
314 589
315 - //Plugin Select Checkbox (plugin-modules tree)
316 - // $plugins : array : all active plugins
317 - // $checked_cvplugins : csv string : checked plugins
318 - function plugins_checklist( $plugins, $checked_cvplugins ) {
590 + //安全な文字列から指定タグのみデコード(既存の翻訳ファイルへ影響せずにエスケープするために使用)
591 + //&lt;strong&gt;Type&lt;/strong&gt -> <strong>Type</strong>
592 + static function decode_safe_tag_e( $tag, $safe_str ) {
593 + $safe_str = preg_replace_callback( "|&lt;($tag.*)&gt;(.*)&lt;/($tag)&gt;|im", function($matches){
594 + $tag_attrs = str_replace( '&quot;', '"', $matches[1]);
595 + return '<' . $tag_attrs . '>' . $matches[2] . '</' . $matches[3] . '>';
596 + }, $safe_str);
597 + echo wp_kses_post($safe_str);
598 + }
599 +
600 + public function plfregist_item($key, $chklist, $filter) {
601 + $p_name = self::pluginkey_to_name($key);
602 + $opt_name = "plfregist[$key]";
603 + ?>
604 + <tr id="plfregist_<?php echo esc_html($key); ?>">
605 + <td class="filter-plugins-name"><?php echo esc_html($p_name); ?></td>
606 + <?php
607 + foreach($chklist as $urlkey){
608 + $name = "plfurlkey[$urlkey][$key]";
609 + $checked = (empty($filter['plfurlkey'][$urlkey]['plugins']) || false === strpos($filter['plfurlkey'][$urlkey]['plugins'], $key))? false : true;
610 + echo '<td class="deny-type filter-type"><label><input type="checkbox" name="' . esc_html($name) . '" class="altcheckbox" value="1" ' . checked( $checked, 1, false ). '/> <span class="dashicons dashicons-admin-plugins"></span></label></td>';
611 + }
612 + $radio = '';
613 + if(!empty($filter['_admin']['plugins']) && false !== strpos($filter['_admin']['plugins'], $key))
614 + $radio = '_admin';
615 + else if(!empty($filter['_pagefilter']['plugins']) && false !== strpos($filter['_pagefilter']['plugins'], $key))
616 + $radio = '_pagefilter';
617 + ?>
618 + <td class="radio-green filter-type"><label><input type="radio" name="<?php echo esc_html($opt_name); ?>" value='' <?php checked('', $radio); ?>/><span class="dashicons dashicons-admin-plugins"></span></label></td>
619 + <td class="radio-red filter-type"><label><input type="radio" name="<?php echo esc_html($opt_name); ?>" value="_admin" <?php checked('_admin', $radio); ?>/><span class="dashicons dashicons-admin-plugins"></span></label></td>
620 + <td class="radio-red filter-type"><label><input type="radio" name="<?php echo esc_html($opt_name); ?>" value="_pagefilter" <?php checked('_pagefilter', $radio); ?>/><span class="dashicons dashicons-admin-plugins"></span></label></td>
621 + </tr>
622 + <?php
623 + }
624 +
625 + //Filterring plugins select
626 + public function plfregist_table($plugins, $filter) {
627 + ?>
628 + <div id="wrap_registration-table">
629 + <table id="registration-table" class="widefat">
630 + <thead>
631 + <?php
632 + $groupkeys = (method_exists('Plf_filter', 'get_active_group'))? Plf_filter::get_active_group() : array();
633 + $urlnum = count($groupkeys);
634 + ?>
635 + <tr>
636 + <th class="filter-plugins-name" rowspan="2"><?php esc_html_e('Plugins', 'plf'); ?></th>
637 + <?php if($urlnum > 0) { ?>
638 + <th class="filter-type urlfilter" colspan="<?php echo esc_html($urlnum); ?>" style="font-weight:bold; font-size:smaller;"><?php esc_html_e('URL Group Filter', 'plf'); ?></th>
639 + <?php } ?>
640 + <th class="filter-type filter-tmpl" colspan="3" style="font-weight:bold; font-size:smaller;"><?php esc_html_e('Page Type Filter', 'plf'); ?></th>
641 + </tr>
642 + <tr>
643 + <?php //Addon URL filter group key
644 + if($urlnum > 0) {
645 + foreach ( $groupkeys as $v) {
646 + $_flt = (method_exists('Plf_filter', 'get_slug_filter'))? Plf_filter::get_slug_filter( $v ) : array();
647 + $hint = '';
648 + foreach ($_flt as $_v) {
649 + $hint .= '[' . $_v['slug'] . '] ' . $_v['summary'] . PHP_EOL;
650 +
651 + if((int)$_v['targetpage'] === 1) {
652 + $post_type = (!empty($_v['post_type']))? $_v['post_type'] : '';
653 + $taxonomy = '';
654 + if(!empty($_v['taxonomies']) && !empty($_v['term'])){
655 + $taxonomy = " : {$_v['taxonomies']}({$_v['term']})";
656 + }
657 + if(!empty($post_type)){
658 + $hint .= 'Singular (' . $post_type . ')' . $taxonomy . PHP_EOL;
659 + } else {
660 + $hint .= 'Singular ' . $taxonomy . PHP_EOL;
661 + }
662 + } elseif((int)$_v['targetpage'] === 2) {
663 + if(!empty($_v['ajax_action'])){
664 + $hint .= 'Ajax request (' . $_v['ajax_action'] . ')' . PHP_EOL;
665 + } else {
666 + $hint .= 'Ajax request' . PHP_EOL;
667 + }
668 + }
669 +
670 + $hint .= 'url filter : ';
671 + $urlkey = (!empty($_v['url_path']))? array_filter( array_map("trim", explode(PHP_EOL, $_v['url_path']))) : array();
672 + if(!empty($urlkey)){
673 + foreach ($urlkey as $key) {
674 + $hint .= $key . ' ';
675 + }
676 + }
677 + $urlkey = (!empty($_v['url_q_and']))? array_filter( array_map("trim", explode(PHP_EOL, $_v['url_q_and']))) : array();
678 + if(!empty($urlkey)){
679 + foreach ($urlkey as $key) {
680 + $hint .= ' AND ' . $key;
681 + }
682 + }
683 + $urlkey = (!empty($filter['url_q_not']))? array_filter( array_map("trim", explode(PHP_EOL, $filter['url_q_not']))) : array();
684 + if(!empty($urlkey)){
685 + foreach ($urlkey as $key) {
686 + $hint .= ' NOT ' . $key;
687 + }
688 + }
689 + $hint .= PHP_EOL . PHP_EOL;
690 + }
691 + echo '<th class="filter-type urlfilter"><span title="' . esc_html($hint) . '" style="font-size:smaller">' . esc_html($v) . '</span></th>';
692 + }
693 + } ?>
694 + <th class="filter-type filter-none"><span style="font-size:smaller"><?php esc_html_e('Normal', 'plf'); ?></span></th>
695 + <th class="filter-type filter-admin"><span style="font-size:smaller"><?php esc_html_e('Admin Type', 'plf'); ?></span></th>
696 + <th class="filter-type filter-tmpl"><span style="font-size:smaller"><?php esc_html_e('Page Type', 'plf'); ?></span></th>
697 + </tr>
698 + </thead>
699 + <tbody class="plugins-table-body">
700 + <?php
701 + //plugins filter registoration table
702 + $plist = array();
703 + foreach ( $plugins as $p_key => $val ) {
704 + $name = self::pluginkey_to_name($p_key);
705 + if(!empty($name))
706 + $plist[$p_key] = '';
707 + }
708 + $jlist = $clist = array();
709 + foreach ( $plist as $p_key => $val ) {
710 + if(strpos($p_key, 'jetpack_module/') !== false){
711 + $jlist[$p_key] = $plist[$p_key];
712 + unset($plist[$p_key]);
713 + }
714 + else if(strpos($p_key, 'celtispack_module/') !== false){
715 + $clist[$p_key] = $plist[$p_key];
716 + unset($plist[$p_key]);
717 + }
718 + }
719 + //Addon URL filter group key
720 + $chklist = array();
721 + if($urlnum > 0) {
722 + foreach ( $groupkeys as $key) {
723 + $chklist[] = $key;
724 + }
725 + }
319 726
320 - $nplugins = $jmodules = $cmodules = array();
321 - $type = 'tree';
322 - foreach ( $plugins as $p_key => $p_data ) {
323 - $p_name = $this->pluginkey_to_name($p_key, $type);
324 - if(empty($p_name))
325 - continue;
326 - if(strpos($p_key, 'jetpack_module/') !== false)
327 - $jmodules[] = $p_key;
328 - else if(strpos($p_key, 'celtispack_module/') !== false)
329 - $cmodules[] = $p_key;
330 - else
331 - $nplugins[] = $p_key;
332 - }
333 - $chkplugins = array_map("trim", explode(',', $checked_cvplugins));
334 - $html = '<ul class="plugins-list">';
335 - foreach ( $nplugins as $p_key ) {
336 - $p_name = $this->pluginkey_to_name($p_key, $type);
337 - $checked = in_array( $p_key, $chkplugins ) ? true : false;
338 - $html .= '<li>' . self::checkbox("plf_option[plugins][$p_key]", $checked, esc_attr($p_name)) . '</li>';
339 -
727 + foreach ( $plist as $p_key => $val ) {
340 728 $modules = array();
341 729 if(strpos($p_key, 'jetpack/') !== false)
342 - $modules = $jmodules;
730 + $modules = $jlist;
343 731 else if(strpos($p_key, 'celtispack/') !== false)
344 - $modules = $cmodules;
732 + $modules = $clist;
733 + else
734 + $this->plfregist_item($p_key, $chklist, $filter);
345 735 if(!empty($modules)){
346 - $html .= '<ul class="modules-list">';
347 - foreach ( $modules as $m_key ) {
348 - $m_name = $this->pluginkey_to_name($m_key, $type);
349 - $mchecked = ($checked || in_array( $m_key, $chkplugins )) ? true : false;
350 - $html .= '<li>' . self::checkbox("plf_option[plugins][$m_key]", $mchecked, esc_attr($m_name)) . '</li>';
736 + echo '<input type="hidden" name="plfregist[' . esc_html($p_key) . ']" value="_pagefilter">';
737 + foreach ( $modules as $m_key => $val) {
738 + $this->plfregist_item($m_key, $chklist, $filter);
351 739 }
352 - $html .= '</ul>';
353 740 }
354 741 }
355 - $html .= '</ul>';
356 - return $html;
742 + ?>
743 + </tbody>
744 + </table>
745 + </div>
746 + <p></p>
747 + <div class="grid-row">
748 + <div class="filter-description">
749 + <p><strong>[ <?php esc_html_e('Page Type Filter', 'plf'); ?> ]</strong></p>
750 + <?php self::decode_safe_tag_e( 'strong', esc_html__('<strong>Normal</strong> - Exclude plugin from Page Type filter', 'plf')); ?><br />
751 + <?php self::decode_safe_tag_e( 'strong', esc_html__('<strong>Admin Type</strong> - If you only use plugins for Admin pages.', 'plf')); ?><br />
752 + <?php self::decode_safe_tag_e( 'strong', esc_html__('<strong>Page Type</strong> - If you want to activate or deactivate plugins for each Page Type and Single page.', 'plf')); ?>
753 + <p>
754 + <?php
755 + $checked = (!empty(self::$filter['admin_bar']))? self::$filter['admin_bar'] : false;
756 + echo '<span class="admin-bar-option"><label><input type="checkbox" name="plf_option[admin_bar]" value="1" ' . checked( $checked, 1, false ) . '/> ' . esc_html__('Add a link to admin bar for displaying the plugins filtered status', 'plf') . '</label></span>';
757 + ?>
758 + </p>
759 + <p><?php esc_html_e('* Plugins with `Page Type Filter` selected are blocked, but you can Activate it for various Page type in the `Page Type Activation` and Single Page setting.', 'plf'); ?></p>
760 + <div class="ckbox-list">
761 + <p><?php self::decode_safe_tag_e( 'strong', esc_html__('<strong>Exclude Post Format Type</strong> - Choose Post Format Type you are not using. To exclude from Page Type item subject.', 'plf')); ?></p>
762 + <div>
763 + <?php
764 + $pformat = array('image', 'gallery', 'video', 'audio', 'aside', 'status', 'quote', 'link', 'chat' );
765 + foreach ( $pformat as $type ) {
766 + $check = !empty(self::$filter['exclude'][$type])? true : false;
767 + ?>
768 + <label><input type="checkbox" name="<?php echo esc_html("plf_option[exclude][$type]"); ?>" <?php checked($check); ?>/> <span><?php echo esc_html($type); ?></span></label>
769 + <?php
770 + }
771 + ?>
772 + </div>
773 + </div>
774 + <div class="ckbox-list">
775 + <p><?php self::decode_safe_tag_e( 'strong', esc_html__('<strong>Hide Single Post Filters</strong> - Hide single-post filter settings box for custom post type edit page', 'plf')); ?></p>
776 + <div>
777 + <?php
778 + $post_types = get_post_types( array('_builtin' => false), 'objects' );
779 + if(!empty($post_types)){
780 + foreach ( $post_types as $type ) {
781 + $check = !empty(self::$filter['hidecpt'][$type->name])? true : false;
782 + ?>
783 + <label><input type="checkbox" name="<?php echo esc_html("plf_option[hidecpt][$type->name]"); ?>" <?php checked($check); ?>/> <span><?php echo esc_html("{$type->labels->name} ({$type->name})"); ?></span></label>
784 + <?php
785 + }
786 + } else {
787 + esc_html_e('Custom post type not defined', 'plf');
788 + }
789 + ?>
790 + </div>
791 + </div>
792 + <p><strong>[ <?php esc_html_e('Post Language Locale', 'plf'); ?> ]</strong></p>
793 + <p><?php esc_html_e('A very simple multilingual feature that uses MO translation files for the selected locale per Post/Page editing screen.','plf'); ?></p>
794 + <?php
795 + $checked = (!empty(self::$filter['language']))? self::$filter['language'] : false;
796 + echo '<div class="option-item"><label><input type="checkbox" name="plf_option[language]" value="1" ' . checked( $checked, 1, false ) . '/> ' . esc_html__('Language switching per post', 'plf') . '</label></div>';
797 + ?>
798 +
799 + <?php //開発モード限定機能
800 + $devmode = wp_get_development_mode();
801 + if (!empty($devmode)) { ?>
802 + <p><strong>[ <?php esc_html_e('Ajax acceleration filter (Features for plugin developers)', 'plf'); ?> ]</strong></p>
803 + <p><?php esc_html_e('If you are implementing Ajax requests in your plugin development, you can deactivate unnecessary plugins and speed up Ajax by setting the plugin slugs to be activated to `_ajax_plf` in the request data.','plf'); ?></p>
804 + <?php
805 + $checked = (!empty(self::$filter['ajax_accelfilter']))? self::$filter['ajax_accelfilter'] : false;
806 + echo '<div class="option-item"><label><input type="checkbox" name="plf_option[ajax_accelfilter]" value="1" ' . checked( $checked, 1, false ) . '/> ' . esc_html__('Ajax acceleration filter', 'plf') . '</label></div>';
807 + } ?>
808 + </div>
809 + <div class="side-info">
810 + <?php if(! is_plugin_active('plugin-load-filter-addon/plugin-load-filter-addon.php')){ ?>
811 + <div style="background-color: #f0fff0; border:1px solid #70c370; padding:4px 20px; margin: 10px 0;" >
812 + <p><strong><?php esc_html_e('Introduction of Addon', 'plf'); ?></strong></p>
813 + <p><?php esc_html_e('Thank you for using Plugin Load Filter. We offer URL filtering as Addon. Please consider using Addon!', 'plf'); ?></p>
814 + <p><?php esc_html_e('See more information ', 'plf'); ?><a target="_blank" rel="noopener" href="https://celtislab.net/en/wp-plugin-load-filter-addon/"> Plugin Load Filter Addon</a></p>
815 + </div>
816 + <?php } ?>
817 + <?php if(! is_plugin_active('realtime-img-optimizer/realtime-img-optimizer.php')){ ?>
818 + <div style="background-color: #f0fff0; border:1px solid #70c370; padding:4px 20px; margin: 10px 0;" >
819 + <p><strong><?php esc_html_e('Introduction of Realtime Image Optimizer', 'plf'); ?></strong></p>
820 + <p><?php esc_html_e('We sell Image Optimization plugin. Reduce and speed up data size by converting to WebP / AVIF.', 'plf'); ?></p>
821 + <p><?php esc_html_e('See more information ', 'plf'); ?><a target="_blank" rel="noopener" href="https://celtislab.net/en/wp-realtime-image-optimizer/"> Realtime Image Optimizer</a></p>
822 + </div>
823 + <?php } ?>
824 + <?php if(! is_plugin_active('celtis-diff-monitor-backups/celtis-diff-monitor-backups.php')){ ?>
825 + <div style="background-color: #f0fff0; border:1px solid #70c370; padding:4px 20px; margin: 10px 0;" >
826 + <p><strong><?php esc_html_e('Introduction of DB/File Diff Monitor and Backups', 'plf'); ?></strong></p>
827 + <p><?php esc_html_e('A security and backup plugin that detects unauthorized changes and minimizes data loss with rapid recovery.', 'plf'); ?></p>
828 + <p><?php esc_html_e('See more information ', 'plf'); ?><a target="_blank" rel="noopener" href="https://celtislab.net/en/celtis-diff-monitor-backups/"> DB/File Diff Monitor and Backups</a></p>
829 + </div>
830 + <?php } ?>
831 + </div>
832 + </div>
833 + <?php
357 834 }
835 +
836 + //Activate plugins select from Page Filter
837 + public function _plfactive_checkbox_row($p_key, $select_cvplugins, $chklist, $filter) {
358 838
359 - //Plugin pagefilter Selected Checkbox (plugin and modules list)
360 - // $plugins : array : all active plugins
361 - // $select_cvplugins : csv string : pagefilter selected plugins
362 - // $checked_cvplugins : csv string : checked plugins
363 - function pagefilter_plugins_checklist( $plugins, $select_cvplugins, $checked_cvplugins ) {
364 -
839 + $selplugins = array_map("trim", explode(',', $select_cvplugins));
840 + $devlist = array('desktop','mobile');
841 + if(in_array( $p_key, $selplugins )){
842 + $p_name = self::pluginkey_to_name($p_key);
843 + echo '<tr><td class="plugins-name">' . esc_html($p_name) . '</td>';
844 + foreach($devlist as $devtype){
845 + $name = "plfactive[$devtype][$p_key]";
846 + $checked = (empty($filter['group'][$devtype]['plugins']) || false === strpos($filter['group'][$devtype]['plugins'], $p_key))? false : true;
847 + echo '<td class="device-type"><label><input type="checkbox" name="' . esc_html($name) . '" class="altcheckbox" value="1" ' . checked( $checked, 1, false ). '/> <span class="dashicons dashicons-yes"></span></label></td>';
848 + }
849 + foreach($chklist as $pgtype){
850 + $name = "plfactive[$pgtype][$p_key]";
851 + $checked = (empty($filter['group'][$pgtype]['plugins']) || false === strpos($filter['group'][$pgtype]['plugins'], $p_key))? false : true;
852 + echo '<td class="ckbox-type"><label><input type="checkbox" name="' . esc_html($name) . '" class="altcheckbox" value="1" ' . checked( $checked, 1, false ). '/> <span class="dashicons dashicons-admin-plugins"></span></label></td>';
853 + }
854 + echo "</tr>";
855 + }
856 + }
857 +
858 + public function plfactive_table($plugins, $select_cvplugins, $filter) {
365 859 if(empty($select_cvplugins))
366 - return __('Page Filter is not registered', 'plf');
860 + return;
367 861
862 + ?>
863 + <div id="wrap_activation-table">
864 + <table id="activation-table" class="widefat">
865 + <thead>
866 + <tr><th class="plugins-name"><?php esc_html_e('Plugins', 'plf'); ?></th>
867 + <th class="device-type"><span title="<?php esc_html_e('Desktop Device', 'plf'); ?>" class="dashicons dashicons-desktop"></span><br /><span style="font-size:xx-small">Desktop</span></th>
868 + <th class="device-type"><span title="<?php esc_html_e('Mobile Device', 'plf'); ?>" class="dashicons dashicons-smartphone"></span><br /><span style="font-size:xx-small">Mobile</span></th>
869 + <th class="ckbox-type"><span title="<?php esc_html_e('Home/Front-page', 'plf'); ?>" class="dashicons dashicons-admin-home"></span><br /><span style="font-size:xx-small">Home</span></th>
870 + <th class="ckbox-type"><span title="<?php esc_html_e('Archive page', 'plf'); ?>" class="dashicons dashicons-list-view"></span><br /><span style="font-size:xx-small">Archive</span></th>
871 + <th class="ckbox-type"><span title="<?php esc_html_e('Search page', 'plf'); ?>" class="dashicons dashicons-search"></span><br /><span style="font-size:xx-small">Search</span></th>
872 + <th class="ckbox-type"><span title="<?php esc_html_e('Attachment page', 'plf'); ?>" class="dashicons dashicons-media-default"></span><br /><span style="font-size:xx-small">Attach</span></th>
873 + <th class="ckbox-type"><span title="<?php esc_html_e('Page', 'plf'); ?>" class="dashicons dashicons-admin-page"></span><br /><span style="font-size:xx-small">Page</span></th>
874 + <th class="ckbox-type pformat"><span title="<?php esc_html_e('Post : ', 'plf'); esc_html_e('Standard', 'plf'); ?>" class="dashicons dashicons-admin-post"></span><br /><span style="font-size:xx-small">Post</span></th>
875 + <?php
876 + $pformat = array('image', 'gallery', 'video', 'audio', 'aside', 'status', 'quote', 'link', 'chat' );
877 + $exclude = array();
878 + if(!empty($filter['exclude'])){
879 + foreach ( $filter['exclude'] as $type => $v) {
880 + if(!empty($v)){
881 + $exclude[] = $type;
882 + }
883 + }
884 + }
885 + foreach ( $pformat as $type) {
886 + if(!in_array($type, $exclude)){
887 + $title = esc_html__('Post : ', 'plf') . $type;
888 + $icon = ($type === "link")? "dashicons-admin-links" : "dashicons-format-$type";
889 + echo '<th class="ckbox-type pformat"><span title="' . esc_html($title) . '" class="dashicons ' . esc_html($icon) .'"></span><br /><span style="font-size:xx-small">' . esc_html($type) .'</span></th>';
890 + }
891 + }
892 + if(function_exists('is_embed')){
893 + $title = esc_html__('WordPress Embed Content Card (API)', 'plf');
894 + echo '<th class="ckbox-type tmpl-embed"><span title="' . esc_html($title) . '" style="font-size:xx-small">Embed Content</span></th>';
895 + }
896 + $post_types = get_post_types( array('public' => true, '_builtin' => false) );
897 + foreach ( $post_types as $post_type ) {
898 + if(!empty($post_type)){
899 + $title = esc_html__('Custom Post : ', 'plf') . $post_type;
900 + echo '<th class="ckbox-type tmpl-custom"><span title="' . esc_html($title) . '" style="font-size:xx-small">' . esc_html($post_type) . '</span></th>';
901 + }
902 + }
903 + ?>
904 + </tr>
905 + </thead>
906 + <tbody class="plugins-table-body">
907 + <?php
368 908 $nplugins = $jmodules = $cmodules = $allmodule = array();
369 - $type = 'list';
370 909 foreach ( $plugins as $p_key => $p_data ) {
371 - $p_name = $this->pluginkey_to_name($p_key, $type);
910 + $p_name = self::pluginkey_to_name($p_key);
372 911 if(empty($p_name))
373 912 continue;
374 913 if(strpos($p_key, 'jetpack_module/') !== false)
375 914 $jmodules[] = $p_key;
@@ -374,210 +913,95 @@
374 913 if(strpos($p_key, 'jetpack_module/') !== false)
375 914 $jmodules[] = $p_key;
376 915 else if(strpos($p_key, 'celtispack_module/') !== false)
377 916 $cmodules[] = $p_key;
378 - else {
379 - if(strpos($p_key, 'jetpack/') !== false && strpos($select_cvplugins, $p_key) !== false)
380 - $allmodule['jetpack'] = $p_key;
381 - else if(strpos($p_key, 'celtispack/') !== false && strpos($select_cvplugins, $p_key) !== false)
382 - $allmodule['celtispack'] = $p_key;
383 - else
384 - $nplugins[] = $p_key;
385 - }
917 + else
918 + $nplugins[] = $p_key;
386 919 }
387 - $selplugins = array_map("trim", explode(',', $select_cvplugins));
388 - $chkplugins = array_map("trim", explode(',', $checked_cvplugins));
389 - $html = '<ul class="plugins-list">';
390 - foreach ( $nplugins as $p_key ) {
391 - if(in_array( $p_key, $selplugins )) {
392 - $p_name = $this->pluginkey_to_name($p_key, $type);
393 - $checked = in_array( $p_key, $chkplugins ) ? true : false;
394 - $html .= '<li>' . self::checkbox("plf_option[plugins][$p_key]", $checked, esc_attr($p_name)) . '</li>';
920 + $chklist = array('home', 'archive', 'search', 'attachment', 'page', 'post');
921 + foreach ( $pformat as $type) {
922 + if(!in_array($type, $exclude)){
923 + $chklist[] = "post-$type";
395 924 }
396 925 }
397 - foreach ( $jmodules as $p_key ) {
398 - if(!empty($allmodule['jetpack']) || in_array( $p_key, $selplugins )){
399 - $p_name = $this->pluginkey_to_name($p_key, $type);
400 - $checked = in_array( $p_key, $chkplugins ) ? true : false;
401 - $html .= '<li>' . self::checkbox("plf_option[plugins][$p_key]", $checked, esc_attr($p_name)) . '</li>';
402 - }
926 + if(function_exists('is_embed')){
927 + $chklist[] = 'content-card';
403 928 }
404 - foreach ( $cmodules as $p_key ) {
405 - if(!empty($allmodule['celtispack']) || in_array( $p_key, $selplugins )){
406 - $p_name = $this->pluginkey_to_name($p_key, $type);
407 - $checked = in_array( $p_key, $chkplugins ) ? true : false;
408 - $html .= '<li>' . self::checkbox("plf_option[plugins][$p_key]", $checked, esc_attr($p_name)) . '</li>';
409 - }
929 + $post_types = get_post_types( array('public' => true, '_builtin' => false) );
930 + foreach ( $post_types as $post_type ) {
931 + $chklist[] = $post_type;
410 932 }
411 - $html .= '</ul>';
412 - return $html;
413 - }
414 -
415 - //Plugin Filter Table
416 - public function plf_table($tags, $default) {
417 - ?>
418 - <table class="widefat">
419 - <thead>
420 - <tr><th width="12%"><?php _e('Type'); ?></th><th width="76%"><?php _e('Plugins'); ?></th><th width="12%" colspan="2">&nbsp;</th></tr>
421 - </thead>
422 - <tbody>
423 - <?php
424 - if(!empty($tags)){
425 - foreach( $tags as $ptag => $val ) {
426 - $opt = wp_parse_args( $val, $default);
427 - $plugins = array_map("trim", explode(',', $opt['plugins']));
428 - $plist = '';
429 - $type = ($ptag == '_pagefilter')? 'smart' : 'csv';
430 - foreach ( $plugins as $p_key ) {
431 - $p_name = $this->pluginkey_to_name($p_key, $type);
432 - if(!empty($p_name)){
433 - $sep = (empty($plist))? '' : ', ';
434 - $plist .= $sep . esc_attr($p_name);
435 - }
933 + foreach ( $nplugins as $p_key ) {
934 + if(strpos($p_key, 'jetpack/') !== false){
935 + foreach ( $jmodules as $p_key ) {
936 + $this->_plfactive_checkbox_row($p_key, $select_cvplugins, $chklist, $filter);
436 937 }
437 - if(!empty($ptag)){
438 - echo '<tr id="plf_filter_' .$ptag. '">';
439 - echo '<td>'.$ptag.'</td>';
440 - echo '<td>'. $this->filter_stat($opt['filter'], $plist).'</td>';
441 - echo '<td><a class="view" href="'. wp_nonce_url("plugins.php?page=plugin_load_filter_admin_manage_page&amp;action=edit_filter_table&amp;item=$ptag", "plugin_load_filter") . '">' . __( 'Edit' ) . '</a></td>';
442 - echo '<td><a class="delete" href="'. wp_nonce_url("plugins.php?page=plugin_load_filter_admin_manage_page&amp;action=del_filter_table&amp;item=$ptag", "plugin_load_filter") . '">' . __( 'Delete' ) . '</a></td>';
443 - echo '</tr>';
938 + }
939 + else if(strpos($p_key, 'celtispack/') !== false){
940 + foreach ( $cmodules as $p_key ) {
941 + $this->_plfactive_checkbox_row($p_key, $select_cvplugins, $chklist, $filter);
444 942 }
445 943 }
944 + else {
945 + $this->_plfactive_checkbox_row($p_key, $select_cvplugins, $chklist, $filter);
946 + }
446 947 }
447 948 ?>
448 949 </tbody>
449 950 </table>
951 + </div>
450 952 <?php
451 953 }
452 954
453 955 //Option Setting Form Display
454 956 public function plf_option_page() {
957 + $clear_dialog = __('Plugin Load Filter Settings\nClick OK to clear it.', 'plf');
455 958 ?>
456 - <h2><?php _e('Plugin Load Filter Settings', 'plf'); ?></h2>
959 + <h2><?php esc_html_e('Plugin Load Filter Settings', 'plf'); ?></h2>
457 960 <p></p>
458 961 <div id="plf-setting-tabs">
459 962 <ul>
460 - <li><a href="#plf-registration-tab" ><?php _e('Filter Registration', 'plf'); ?></a></li>
461 - <li><a href="#plf-activation-tab" ><?php _e('Page Filter Activation', 'plf'); ?></a></li>
963 + <li><a href="#plf-registration-tab" ><?php esc_html_e('Filter Registration', 'plf'); ?></a></li>
964 + <li><a href="#plf-activation-tab" ><?php esc_html_e('Page Type Activation', 'plf'); ?></a></li>
462 965 </ul>
463 - <form method="post" >
464 - <?php wp_nonce_field( 'plugin_load_filter'); ?>
465 - <div id="plf-registration-tab" >
466 - <?php
467 - $default = array( 'filter' => 'exclude', 'plugins' => '');
468 - $base = array();
469 - foreach($this->filter as $item => $val){
470 - if(0 === strpos($item, '_'))
471 - $base[$item] = $this->filter[$item];
472 - }
473 - $this->plf_table($base, $default);
474 -
475 - $itemtag = '';
476 - $option = $default;
477 - if( !empty($this->editem) ) {
478 - $itemtag = $this->editem;
479 - $option = $this->filter[$itemtag];
480 - }
481 - $option = wp_parse_args( $option, $default);
482 - ?>
483 - <br />
484 - <p><strong>[ Admin Filter ]</strong><br />
485 - <?php _e('Register the plugins to be used only in admin mode.', 'plf'); ?><br />
486 - </p>
487 - <p><strong>[ Desktop/Mobile Filter ]</strong><br />
488 - <?php _e('Register the plugins to be used only in desktop/moble device. (wp_is_mobile function use)', 'plf'); ?><br />
489 - </p>
490 - <p><strong>[ Page Filter ]</strong><br />
491 - <?php _e('Register the plugins for selecting whether to activate each Page type or Post.', 'plf'); ?><br />
492 - <?php _e('Page Filter registration plugins are once blocked, but is activated by "Page filter Activation" setting.', 'plf'); ?><br />
493 - </p>
494 - <p><?php _e('<strong>[Note]</strong> Running condition is unknown plugin, please do not register. Unregistered plugins are usually loaded.', 'plf') ?></p>
495 - <table width="100%" cellspacing="2" cellpadding="5" class="editform form-table">
496 - <tbody>
497 - <tr>
498 - <th valign="top" scope="row"><label for="plugin"><?php _e('Filter Type', 'plf'); ?>:</label></th>
499 - <td>
500 - <label><input type="radio" name="plf_option[_tag]" value="_admin" <?php checked('_admin', $itemtag); ?>/><?php _e('Admin', 'plf'); ?></label>
501 - <label><input type="radio" name="plf_option[_tag]" value="_desktop" <?php checked('_desktop', $itemtag); ?>/><?php _e('Desktop', 'plf'); ?></label>
502 - <label><input type="radio" name="plf_option[_tag]" value="_mobile" <?php checked('_mobile', $itemtag); ?>/><?php _e('Mobile', 'plf'); ?></label>
503 - <label><input type="radio" name="plf_option[_tag]" value="_pagefilter" <?php checked('_pagefilter', $itemtag); ?>/><?php _e('Page Filter', 'plf'); ?></label>
504 - <br />
505 - <?php echo $this->plugins_checklist( $this->plugins_inf, $option['plugins'] ); ?>
506 - </td>
507 - </tr>
508 - <tr>
509 - </tr>
510 - </tbody>
511 - </table>
512 - <p class="submit">
513 - <input type="submit" class="button-primary" name="clear_regist_filter" value="<?php _e('Clear', 'plf'); ?>" />&nbsp;&nbsp;&nbsp;
514 - <input type="submit" class="button-primary" name="edit_regist_filter" value="<?php _e('Entry &raquo;', 'plf'); ?>" />
515 - </p>
966 + <div id="plf-registration-tab" style="display : none;">
967 + <form method="post" autocomplete="off">
968 + <?php wp_nonce_field( 'plugin_load_filter'); ?>
969 + <?php $this->plfregist_table(self::$plugins_inf, self::$filter); ?>
970 + <p class="submit">
971 + <input type="submit" class="button-primary" name="clear_regist_filter" value="<?php esc_html_e('Clear', 'plf'); ?>" onclick="return confirm('<?php echo esc_html($clear_dialog); ?>')" />&nbsp;&nbsp;&nbsp;
972 + <input type="submit" class="button-primary" name="edit_regist_filter" value="<?php esc_html_e('Filter Entry &raquo;', 'plf'); ?>" />
973 + </p>
974 + </form>
516 975 </div>
517 - <div id="plf-activation-tab" >
518 - <?php
519 - $default = array( 'filter' => 'include', 'plugins' => '');
520 - $cgroup = (!empty($this->filter['group']))? $this->filter['group'] : array();
521 - $pgfilter = (!empty($this->filter['_pagefilter']['plugins']))? $this->filter['_pagefilter']['plugins'] : array();
522 - $this->plf_table( $cgroup, $default);
523 - $itemtag = '';
524 - $option = $default;
525 - $action = 'new_page_filter';
526 - if( !empty($this->editem) ) {
527 - $itemtag = $this->editem;
528 - $option = $cgroup[$itemtag];
529 - $action = 'edit_page_filter';
530 - }
531 - $option = wp_parse_args( $option, $default);
532 - ?>
533 - <br />
534 - <p><?php _e('Select the plugin from "Page Filter" registration to activate in each Page type.', 'plf') ?><br />
535 - <?php _e('Can be selected plugins to activate from Post content editing screen.', 'plf') ?>
536 - </p>
537 - <table width="100%" cellspacing="2" cellpadding="5" class="editform form-table">
538 - <tbody>
539 - <tr>
540 - <th valign="top" scope="row"><label for="plugintag"><?php _e( 'Page type', 'plf'); ?></label></th>
541 - <td><?php
542 - $slist = array('home' => __('Home/Front-page', 'plf'),
543 - 'archive' => __('Archive page', 'plf'),
544 - 'search' => __('Search page', 'plf'),
545 - 'attachment' => __('Attachment page', 'plf'),
546 - 'page' => __('Page', 'plf'),
547 - 'post' => __('Post : Standard', 'plf'),
548 - 'post-aside' => __('Post : Aside', 'plf'),
549 - 'post-image' => __('Post : Image', 'plf'),
550 - 'post-video' => __('Post : Video', 'plf'),
551 - 'post-quote' => __('Post : Quote', 'plf'),
552 - 'post-link' => __('Post : Link', 'plf'),
553 - 'post-gallery'=> __('Post : Gallery', 'plf'),
554 - 'post-status' => __('Post : Status', 'plf'),
555 - 'post-audio' => __('Post : Audio', 'plf'),
556 - 'post-chat' => __('Post : Chat', 'plf'));
557 - $post_types = get_post_types( array('public' => true, '_builtin' => false) );
558 - foreach ( $post_types as $post_type ) {
559 - if(!empty($post_type))
560 - $slist[$post_type] = __('Custom Post : ', 'plf') . $post_type;
561 - }
562 - echo self::dropdown('plf_option[tag]', $slist, $itemtag );
563 - ?>
564 - </td>
565 - </tr>
566 - <tr>
567 - <th valign="top" scope="row"><label for="plugin"><?php _e('Activate Plugins', 'plf'); ?>:</label></th>
568 - <td>
569 - <?php echo $this->pagefilter_plugins_checklist( $this->plugins_inf, $pgfilter, $option['plugins'] ); ?>
570 - </td>
571 - </tr>
572 - </tbody>
573 - </table>
574 - <p class="submit">
575 - <input type="submit" class="button-primary" name="clear_page_filter" value="<?php _e('Clear', 'plf'); ?>" />&nbsp;&nbsp;&nbsp;
576 - <input type="submit" class="button-primary" name="<?php echo $action ?>" value="<?php _e('Entry &raquo;', 'plf'); ?>" />
577 - </p>
976 + <div id="plf-activation-tab" style="display : none;">
977 + <form method="post" autocomplete="off">
978 + <?php wp_nonce_field( 'plugin_load_filter'); ?>
979 + <?php
980 + $pgfilter = (!empty(self::$filter['_pagefilter']['plugins']))? self::$filter['_pagefilter']['plugins'] : array();
981 + if(!empty($pgfilter)){
982 + $this->plfactive_table(self::$plugins_inf, $pgfilter, self::$filter);
983 + ?>
984 + <br />
985 + <p><?php
986 + self::decode_safe_tag_e( 'span', esc_html__('Select plugins to be activated for each page type by clicking on <span class="dashicons dashicons-admin-plugins"></span> mark from "page type filter" registered plugins.', 'plf'));
987 + ?><br />
988 + <?php esc_html_e('You can also select plugins to activate from Post/Page content editing screen.', 'plf') ?>
989 + </p>
990 + <p class="submit">
991 + <input type="submit" class="button-primary" name="clear_activate_page_filter" value="<?php esc_html_e('Clear', 'plf'); ?>" onclick="return confirm('<?php echo esc_html($clear_dialog); ?>')" />&nbsp;&nbsp;&nbsp;
992 + <input type="submit" class="button-primary" name="edit_activate_page_filter" value="<?php esc_html_e('Activate Plugin Entry &raquo;', 'plf'); ?>" />
993 + </p>
994 + <?php
995 + } else {
996 + ?>
997 + <br />
998 + <p><span style="color: #ff0000;"><?php esc_html_e('Page Filter is not registered', 'plf') ?></span></p>
999 + <?php
1000 + }
1001 + ?>
1002 + </form>
578 1003 </div>
579 - </form>
580 1004 </div>
581 1005 <?php
582 1006 }
583 1007
@@ -585,33 +1009,202 @@
585 1009 * Meta box
586 1010 * Individual of the plug-in filter meta box for Post/Page/CustomPost
587 1011 **************************************************************************/
588 1012 function load_meta_boxes( $post_type, $post ) {
589 - if ( current_user_can('edit_plugins', $post->ID) ) {
590 - add_meta_box( 'pluginfilterdiv', __( 'Page Filter Plugin', 'plf' ), array(&$this, 'plf_meta_box'), null, 'side' );
591 - add_action( 'admin_head', array(&$this, 'plf_css' ));
1013 + if ( current_user_can('activate_plugins', $post->ID) ) {
1014 + $type = get_post_type();
1015 + $post_types = get_post_types( array('public' => true, '_builtin' => true) );
1016 + if(!in_array($type, $post_types)){
1017 + $custom_types = get_post_types( array('_builtin' => false) );
1018 + if(!in_array($type, $custom_types) || !empty(self::$filter['hidecpt'][$type])){
1019 + return;
1020 + }
1021 + }
1022 + add_meta_box( 'pluginfilterdiv', esc_html__( 'Plugin Load Filter', 'plf' ), array(&$this, 'plf_meta_box'), null, 'side' );
592 1023 add_action( 'admin_footer', array(&$this, 'plf_meta_script' ));
593 1024 }
594 1025 }
595 1026
1027 + //Plugin pagefilter Selected Checkbox (plugin and modules list)
1028 + // $p_key
1029 + // $select_cvplugins : csv string : pagefilter selected plugins
1030 + // $checked_arcvplugins : array csv string : ['desktop']=desktop enable plugins, ['mobile']=mobile enable plugins
1031 + function _pagefilter_plugins_checklist( $p_key, $select_cvplugins, $checked_arcvplugins ) {
1032 +
1033 + $html = '';
1034 + $selplugins = array_map("trim", explode(',', $select_cvplugins));
1035 + $device['desktop'] = $checked_arcvplugins['desktop'];
1036 + $device['mobile'] = $checked_arcvplugins['mobile'];
1037 + $devlist = array('desktop','mobile');
1038 + if(in_array( $p_key, $selplugins )){
1039 + $p_name = self::pluginkey_to_name($p_key);
1040 + $html .= "<tr><td class='plugins-name'>$p_name</td>";
1041 + foreach($devlist as $devtype){
1042 + $name = "plf_option[$devtype][$p_key]";
1043 + $checked = (empty($device[$devtype]) || false === strpos($device[$devtype], $p_key))? false : true;
1044 + $html .= '<td class="device-type ' . esc_html($devtype) . '"><label><input type="checkbox" name="' . esc_html($name) . '" class="altcheckbox" value="1" ' . checked( $checked, 1, false ). '/> <span class="dashicons dashicons-yes"></span></label></td>';
1045 + }
1046 + $html .= "</tr>";
1047 + }
1048 + return $html;
1049 + }
1050 +
1051 + //Plugin pagefilter Selected Checkbox (plugin and modules list)
1052 + // $plugins : array : all active plugins
1053 + // $select_cvplugins : csv string : pagefilter selected plugins
1054 + // $checked_arcvplugins : array csv string : ['desktop']=desktop enable plugins, ['mobile']=mobile enable plugins
1055 + function pagefilter_plugins_checklist( $plugins, $select_cvplugins, $checked_arcvplugins ) {
1056 +
1057 + if(empty($select_cvplugins))
1058 + return esc_html__('Page Filter is not registered', 'plf');
1059 +
1060 + $html = '<table id="activation-table">';
1061 + $html .= '<thead>';
1062 + $html .= '<tr><th class="plugins-name">'. esc_html__('Plugins') . '</th>';
1063 + $html .= '<th class="device-type"><span title="'. esc_html__('Desktop Device', 'plf'). '" class="dashicons dashicons-desktop"></span><br /><span style="font-size:xx-small">Desktop</span></th>';
1064 + $html .= '<th class="device-type"><span title="'. esc_html__('Mobile Device', 'plf'). '" class="dashicons dashicons-smartphone"></span><br /><span style="font-size:xx-small">Mobile</span></th>';
1065 + $html .= '</tr>';
1066 + $html .= '</thead>';
1067 + $html .= '<tbody class="plugins-table-body meta-boxes-plugins-table">';
1068 + $nplugins = $jmodules = $cmodules = array();
1069 + foreach ( $plugins as $p_key => $p_data ) {
1070 + $p_name = self::pluginkey_to_name($p_key);
1071 + if(empty($p_name))
1072 + continue;
1073 + if(strpos($p_key, 'jetpack_module/') !== false)
1074 + $jmodules[] = $p_key;
1075 + else if(strpos($p_key, 'celtispack_module/') !== false)
1076 + $cmodules[] = $p_key;
1077 + else
1078 + $nplugins[] = $p_key;
1079 + }
1080 +
1081 + foreach ( $nplugins as $p_key ) {
1082 + if(strpos($p_key, 'jetpack/') !== false){
1083 + foreach ( $jmodules as $p_key ) {
1084 + $html .= $this->_pagefilter_plugins_checklist( $p_key, $select_cvplugins, $checked_arcvplugins );
1085 + }
1086 + }
1087 + else if(strpos($p_key, 'celtispack/') !== false){
1088 + foreach ( $cmodules as $p_key ) {
1089 + $html .= $this->_pagefilter_plugins_checklist( $p_key, $select_cvplugins, $checked_arcvplugins );
1090 + }
1091 + }
1092 + else {
1093 + $html .= $this->_pagefilter_plugins_checklist( $p_key, $select_cvplugins, $checked_arcvplugins );
1094 + }
1095 + }
1096 + $html .= '</tbody>';
1097 + $html .= '</table>';
1098 + return $html;
1099 + }
1100 +
1101 + //get_locale に加えたフィルターフックを外してサイトのロケールを取得
1102 + static function get_site_locale(){
1103 + global $locale;
1104 + if(class_exists('Plf_filter')){
1105 + remove_filter( 'locale', array('Plf_filter', 'post_locale') );
1106 + $locale = null;
1107 + $site_locale = get_locale();
1108 + add_filter( 'locale', array('Plf_filter', 'post_locale') );
1109 + } else {
1110 + $locale = null;
1111 + $site_locale = get_locale();
1112 + }
1113 + return $site_locale;
1114 + }
1115 +
596 1116 function plf_meta_box( $post, $box ) {
597 1117 if(is_object($post)){
598 - $default = array( 'filter' => 'default', 'plugins' => '');
599 1118 $myfilter = get_post_meta( $post->ID, '_plugin_load_filter', true );
600 - $option = (!empty($myfilter))? $myfilter : $default;
1119 + //ver2.2.0 for compatibility, set 'plugins' data to 'desktop' and 'mobile'
1120 + if(is_array($myfilter) && !empty($myfilter['plugins'])){
1121 + $myfilter['desktop'] = $myfilter['plugins'];
1122 + $myfilter['mobile'] = $myfilter['plugins'];
1123 + unset($myfilter['plugins']);
1124 + }
1125 + $default = array( 'filter' => 'default', 'desktop' => '', 'mobile' => '');
1126 + $option = (!empty($myfilter) && is_array($myfilter))? $myfilter : $default;
601 1127 $option = wp_parse_args( $option, $default);
1128 + $pgfilter = (!empty(self::$filter['_pagefilter']['plugins']))? self::$filter['_pagefilter']['plugins'] : array();
602 1129 $ajax_nonce = wp_create_nonce( 'plugin_load_filter-' . $post->ID );
603 - $pgfilter = (!empty($this->filter['_pagefilter']['plugins']))? $this->filter['_pagefilter']['plugins'] : array();
1130 + $this->plf_css();
604 1131 ?>
605 - <div id="plugin-filter-select">
606 - <label><input type="radio" name="pagefilter" value="default" <?php checked('default', $option['filter']); ?>/><?php _e('Not Use', 'plf' ); ?></label>
607 - <label><input type="radio" name="pagefilter" value="include" <?php checked('include', $option['filter']); ?>/><?php _e('Activate Plugins', 'plf'); ?></label>
608 - <br />
609 - <div id="page-filter-stat">
610 - <?php echo $this->pagefilter_plugins_checklist( $this->plugins_inf, $pgfilter, $option['plugins'] ); ?>
1132 + <div id="plugin-filter-select">
1133 + <p><?php esc_html_e( 'Plugin filter for Single post', 'plf' ); ?></p>
1134 + <label><input type="radio" name="pagefilter" value="default" <?php checked('default', $option['filter']); ?>/><?php esc_html_e('Not Use', 'plf' ); ?></label>
1135 + <label><input type="radio" name="pagefilter" value="include" <?php checked('include', $option['filter']); ?>/><?php esc_html_e('Use', 'plf'); ?></label>
1136 + <div id="page-filter-stat">
1137 + <?php echo wp_kses($this->pagefilter_plugins_checklist( self::$plugins_inf, $pgfilter, $option ), self::get_allowed_tags()); ?>
1138 + </div>
1139 + <div class="plf-option-info"><?php esc_html_e('Plugin Activate/Deactivate filter for this Post only', 'plf'); ?></div>
1140 + <?php
1141 + $c_locale = $o_post_id = '';
1142 + $languages = array();
1143 + $locale_mode = 'style="display:none;"';
1144 + if(!empty(self::$filter['language'])){
1145 + $languages = get_available_languages();
1146 + $site_locale = self::get_site_locale();
1147 + //bogo と同じ _locale ポストメタデータ採用
1148 + $c_locale = get_post_meta( $post->ID, '_locale', true );
1149 + if(empty($c_locale)){
1150 + $c_locale = $site_locale;
1151 + }
1152 + if ( ! in_array( $c_locale, $languages ) ) {
1153 + $c_locale = '';
1154 + }
1155 + $o_post_id = get_post_meta( $post->ID, '_original_post_id', true );
1156 + $o_post_id = (is_numeric($o_post_id))? $o_post_id : '';
1157 + $locale_mode = '';
1158 + }
1159 + echo '<p class="hide-if-no-js"><a id="plugin-filter-submit" class="button" href="#pluginfilterdiv" onclick="WPAddPagePluginLoadFilter(\'' . esc_html($ajax_nonce) . '\');return false;" >'. esc_html__('Save') .'</a></p>';
1160 + ?>
1161 + <hr>
1162 + <div id="plf-post-locale-select" <?php echo esc_html($locale_mode); ?>>
1163 + <p><?php esc_html_e( 'Language of this post', 'plf' ); ?> <span class="dashicons dashicons-translation" aria-hidden="true"></span></p>
1164 + <?php
1165 + wp_dropdown_languages(
1166 + array(
1167 + 'name' => 'plf_locale',
1168 + 'id' => 'plf_locale',
1169 + 'selected' => $c_locale,
1170 + 'languages' => $languages,
1171 + 'show_available_translations' => false,
1172 + )
1173 + );
1174 + ?>
1175 + <p><?php esc_html_e( 'Original post ID for hreflang', 'plf' ); ?></p>
1176 + <input type="text" id="plf_original_post_id" name="plf_original_post_id" size="8" value="<?php echo esc_html($o_post_id); ?>" />
1177 + <div class="hflang-group-edit-lonk">
1178 + <?php
1179 + $id = (is_numeric($o_post_id))? $o_post_id : $post->ID;
1180 + global $wpdb;
1181 + $ids = $wpdb->get_row($wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_original_post_id' AND meta_value = %d", $id ), ARRAY_N);
1182 + if(is_array($ids)){
1183 + if(!in_array((string)$id, $ids)){
1184 + $ids[] = (string)$id;
1185 + }
1186 + if(count($ids) > 1){
1187 + foreach ($ids as $v) {
1188 + if( $post->ID != $v){
1189 + $l = get_post_meta( $v, '_locale', true );
1190 + if(empty($l)){
1191 + $l = $site_locale;
1192 + }
1193 + $url = get_edit_post_link( $v );
1194 + if(!empty($url)){
1195 + echo '<p><a class="edit-post-locale-link" target="_blank" href="' . esc_html($url) .'" rel="external noreferrer noopener">' . esc_html__('Edit Post') . ' (' . esc_html($l) . ') ' . '<span class="dashicons dashicons-external" aria-hidden="true"></span></a></p>';
1196 + }
1197 + }
1198 + }
1199 + }
1200 + }
1201 + ?>
1202 + </div>
1203 + <div class="plf-option-info"><?php esc_html_e('Use MO translation file for the selected locale. When Original Post ID is registered, posts with the same Original Post ID are treated as `hreflang` metadata group.', 'plf'); ?></div>
1204 + <?php echo '<p class="hide-if-no-js"><a id="plugin-filter-submit" class="button" href="#pluginfilterdiv" onclick="WPAddPagePluginLoadFilter(\'' . esc_html($ajax_nonce) . '\');return false;" >'. esc_html__('Save') .'</a></p>'; ?>
1205 + </div>
611 1206 </div>
612 - <?php echo '<p class="hide-if-no-js"><a id="plugin-filter-submit" class="button" href="#pluginfilterdiv" onclick="WPAddPagePluginLoadFilter(\'' . $ajax_nonce . '\');return false;" >'. __('Save') .'</a></p>'; ?>
613 - </div>
614 1207 <?php
615 1208 }
616 1209 }
617 1210
@@ -618,38 +1211,114 @@
618 1211 //wp_ajax_plugin_load_filter called function
619 1212 function plf_ajax_postidfilter() {
620 1213 if ( isset($_POST['post_id']) ) {
621 1214 $pid = (int) $_POST['post_id'];
622 - if ( !current_user_can( 'edit_plugins', $pid ) )
1215 + if ( !current_user_can( 'activate_plugins', $pid ) )
623 1216 wp_die( -1 );
624 1217 check_ajax_referer( "plugin_load_filter-$pid" );
625 1218
626 - $option["filter"] = (empty($_POST['filter']))? 'default' : $_POST['filter'];
627 - $option["plugins"] = '';
628 - if('default' == $option["filter"])
1219 + if(!empty(self::$filter['language'])){
1220 + if(isset($_POST['locale'])){
1221 + $s_locale = (!empty($_POST['locale']))? sanitize_text_field(wp_unslash($_POST['locale'])) : 'en_US';
1222 + $languages = get_available_languages();
1223 + $languages[] = 'en_US'; //add WP default locale
1224 + if ( in_array( $s_locale, $languages ) ) {
1225 + $g_locale = get_post_meta( $pid, '_locale', true );
1226 + global $locale;
1227 + if(class_exists('Plf_filter')){
1228 + remove_filter( 'locale', array('Plf_filter', 'post_locale') );
1229 + $locale = null;
1230 + $o_locale = get_locale();
1231 + add_filter( 'locale', array('Plf_filter', 'post_locale') );
1232 + } else {
1233 + $locale = null;
1234 + $o_locale = get_locale();
1235 + }
1236 + if($s_locale !== $g_locale){
1237 + if($s_locale === $o_locale){
1238 + delete_post_meta( $pid, '_locale');
1239 + } else {
1240 + update_post_meta( $pid, '_locale', $s_locale );
1241 + }
1242 + }
1243 + }
1244 + }
1245 + if(isset($_POST['original_post_id'])){
1246 + if(empty($_POST['original_post_id'])){
1247 + delete_post_meta( $pid, '_original_post_id');
1248 + } elseif(preg_match( '/([0-9]+)?/', $_POST['original_post_id'], $match )){
1249 + $o_id = (int)$match[1];
1250 + $post = get_post($o_id);
1251 + if(is_object($post)){
1252 + $g_id = get_post_meta( $pid, '_original_post_id', true );
1253 + if($o_id !== $g_id){
1254 + update_post_meta( $pid, '_original_post_id', $o_id );
1255 + }
1256 + }
1257 + }
1258 + }
1259 + }
1260 + $pgfilter = (!empty(self::$filter['_pagefilter']['plugins']))? self::$filter['_pagefilter']['plugins'] : array();
1261 + $option["filter"] = (empty($_POST['filter']))? 'default' : sanitize_text_field(wp_unslash($_POST['filter']));
1262 + if('default' == $option["filter"]){
629 1263 delete_post_meta( $pid, '_plugin_load_filter');
630 - else {
1264 + } else {
631 1265 $plugins = array();
632 - if( preg_match_all('/plf_option\[plugins\]\[(.+?)\]/u', $_POST['plugins'], $matches)){
1266 + $desktop = sanitize_text_field(wp_unslash($_POST['desktop']));
1267 + if( preg_match_all('/plf_option\[desktop\]\[(.+?)\]/u', $desktop, $matches)){
633 1268 if(!empty($matches[1])){
634 1269 foreach ($matches[1] as $plugin){
635 1270 $plugins[] = $plugin;
636 1271 }
637 - $option["plugins"] = implode(",", $plugins);
1272 + $option["desktop"] = implode(",", $plugins);
638 1273 }
639 1274 }
1275 + $plugins = array();
1276 + $mobile = sanitize_text_field(wp_unslash($_POST['mobile']));
1277 + if( preg_match_all('/plf_option\[mobile\]\[(.+?)\]/u', $mobile, $matches)){
1278 + if(!empty($matches[1])){
1279 + foreach ($matches[1] as $plugin){
1280 + $plugins[] = $plugin;
1281 + }
1282 + $option["mobile"] = implode(",", $plugins);
1283 + }
1284 + }
640 1285 update_post_meta( $pid, '_plugin_load_filter', $option );
641 1286 }
642 - //transient cache clear
643 - $this->plf_transient_clear();
644 1287
645 - $pgfilter = (!empty($this->filter['_pagefilter']['plugins']))? $this->filter['_pagefilter']['plugins'] : array();
646 - $html = $this->pagefilter_plugins_checklist( $this->plugins_inf, $pgfilter, $option['plugins'] );
1288 + $html = $this->pagefilter_plugins_checklist( self::$plugins_inf, $pgfilter, $option );
647 1289 wp_send_json_success($html);
648 1290 }
649 1291 wp_die( 0 );
650 1292 }
651 1293
1294 + //alternate hreflang meta tag
1295 + static function altenate_hreflang() {
1296 + if ( is_singular() ) {
1297 + global $post, $wpdb;
1298 + $pid = $post->ID;
1299 + $oid = get_post_meta( $pid, '_original_post_id', true );
1300 + $oid = (is_numeric($oid))? $oid : $pid;
1301 + $ids = $wpdb->get_row($wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_original_post_id' AND meta_value = %d", $oid ), ARRAY_N);
1302 + if(is_array($ids)){
1303 + if(!in_array((string)$oid, $ids)){
1304 + $ids[] = (string)$oid;
1305 + }
1306 + if(count($ids) > 1){
1307 + $site_locale = self::get_site_locale();
1308 + foreach ($ids as $id) {
1309 + $l = get_post_meta( $id, '_locale', true );
1310 + if(empty($l)){
1311 + $l = $site_locale;
1312 + }
1313 + $url = get_permalink( $id );
1314 + echo '<link rel="alternate" hreflang="' . esc_attr($l) . '" href="' . esc_url($url) .'" />' . PHP_EOL;
1315 + }
1316 + }
1317 + }
1318 + }
1319 + }
1320 +
652 1321 /***************************************************************************
653 1322 * Javascript
654 1323 **************************************************************************/
655 1324 function activetab_script() { ?>
@@ -654,21 +1323,44 @@
654 1323 **************************************************************************/
655 1324 function activetab_script() { ?>
656 1325 <script type='text/javascript' >
657 1326 /* <![CDATA[ */
658 - var plf_activetab = <?php echo $this->tab_num; ?>
1327 + var plf_activetab = <?php echo esc_html($this->tab_num); ?>
659 1328 /* ]]> */
660 - jQuery(document).ready(function ($) { plf_setting_tabs(); function plf_setting_tabs(){ $('#plf-setting-tabs').tabs({ active:plf_activetab, }); }});
1329 + jQuery(document).ready(function ($) {
1330 + plf_setting_tabs();
1331 + function plf_setting_tabs(){ $('#plf-setting-tabs').tabs({ active:plf_activetab, }); }
1332 + });
661 1333 </script>
662 1334 <?php }
663 1335
664 - function plf_meta_script() { ?>
1336 + function plf_meta_script() {
1337 + ?>
665 1338 <script type='text/javascript' >
666 - WPAddPagePluginLoadFilter = function(nonce){
667 - jQuery.ajax({ type: 'POST', url: ajaxurl,
668 - data: {action: "plugin_load_filter", post_id : jQuery( '#post_ID' ).val(), _ajax_nonce: nonce, filter: jQuery("input[name='pagefilter']:checked").val(), plugins: jQuery('.plugins-list li input:checked').map(function(){ return jQuery(this).attr("name"); }).get().join(','), }, dataType: 'json',
669 - success: function(response, dataType) { jQuery('#page-filter-stat').html(response.data); }
670 - });
671 - return false; };
1339 + WPAddPagePluginLoadFilter = function(nonce){
1340 + jQuery.ajax({
1341 + type: 'POST',
1342 + url: ajaxurl,
1343 + data: {
1344 + action: "plugin_load_filter",
1345 + post_id : jQuery( '#post_ID' ).val(),
1346 + _ajax_nonce: nonce,
1347 + locale: jQuery("select[name='plf_locale']").val(),
1348 + original_post_id: jQuery("input[name='plf_original_post_id']").val(),
1349 + filter: jQuery("input[name='pagefilter']:checked").val(),
1350 + desktop: jQuery('.meta-boxes-plugins-table td.desktop input:checked').map(function(){ return jQuery(this).attr("name"); }).get().join(','),
1351 + mobile: jQuery('.meta-boxes-plugins-table td.mobile input:checked').map(function(){ return jQuery(this).attr("name"); }).get().join(','),
1352 + },
1353 + dataType: 'json',
1354 + }).then(
1355 + function (response, dataType) {
1356 + jQuery('#page-filter-stat').html(response.data);
1357 + if(window.confirm('<?php esc_html_e('Plugin Load Filter setting has been updated.\nClick OK to reload the page.', 'plf'); ?>')){
1358 + location.reload();
1359 + }
1360 + },
1361 + function () { /* alert("ajax error"); */ }
1362 + );
1363 + };
672 1364 </script>
673 1365 <?php }
674 -}
1366 +}