menu and options tools added to plgntls class in plugin xtxpatch

This commit is contained in:
asus
2024-03-31 15:17:53 +02:00
parent 0f554444dd
commit ca13c5dccb

View File

@@ -117,6 +117,9 @@ class Plgntls_xtx {
* 'add menu' init * 'add menu' init
* *
*/ */
add_filter("plugin_action_links_".self::$_plugin_dir."/".self::$_main_file, function($links) {
return self::_add_link_to_plugin($links);
});
/* /*
@@ -128,7 +131,9 @@ class Plgntls_xtx {
if (false === get_option(self::$_options_list)) { if (false === get_option(self::$_options_list)) {
add_option(self::$_options_list, '', '', 'no'); add_option(self::$_options_list, '', '', 'no');
} }
add_action('admin_post_'.self::$_options_action, array(__CLASS__, '_handle_admin_post_option')); add_action('admin_post_'.self::$_options_action, function() {
self::_handle_admin_post_option();
});
} }
@@ -882,7 +887,7 @@ class Plgntls_xtx {
const ACTION_TOOGLE_ADMIN_MENU = "toggle_admin_menu_url_xtxpatch"; const ACTION_TOOGLE_ADMIN_MENU = "toggle_admin_menu_url_xtxpatch";
const OPTION_TOGGLE_MENU = [ const OPTION_TOGGLE_MENU = [
'_name'=>'toggle_admin_menu_option_xtxpatch', '_name'=>'toggle_admin_menu_option_xtxpatch',
'_callback'=>'', '_callback'=>__CLASS__.'::toggle_plugin_menu',
'_default'=>'hide', '_default'=>'hide',
'show'=>'show', 'show'=>'show',
'hide'=>'hide', 'hide'=>'hide',
@@ -895,15 +900,25 @@ class Plgntls_xtx {
* see _create_menu below for more informations * see _create_menu below for more informations
* *
*/ */
public static function add_menu($options) { public static function add_menu($menu_options) {
/*
* will init the filter for the toggle
*
*/
self::init_class(); self::init_class();
if (empty($options)) {
if (empty($menu_options)) {
return; return;
} }
else if (is_string($options)) {
$options = array('callback'=>$options); /*
* if menu_options is only a string, we assume it is the callback
*
*/
if (is_string($menu_options)) {
$menu_options = array('callback'=>$menu_options);
} }
add_filter("plugin_action_links_".self::$_plugin_dir."/".self::$_main_file, array(__CLASS__, '_add_link_to_plugin'));
self::_create_menu($options); self::_create_menu($options);
} }
@@ -961,19 +976,21 @@ class Plgntls_xtx {
* triggered by filter “plugin_action_links_{$plugin_file}” * triggered by filter “plugin_action_links_{$plugin_file}”
* *
*/ */
public static function _add_link_to_plugin($links) { private static function _add_link_to_plugin($links) {
$option_toggle = self::OPTION_TOGGLE_MENU; $option_toggle = self::OPTION_TOGGLE_MENU;
$toggle = self::get_option_safe($option_toggle); $toggle = self::get_option_safe($option_toggle);
if (false === $toggle) {
return $links;
}
if (!in_array($toggle, ['hide', 'show'])) { if (!in_array($toggle, ['hide', 'show'])) {
return $links; return $links;
} }
$state = $toggle === 'show' ? 'hide' : 'show';
$link = "<a href='" . self::get_option_link_href($option_toggle); $link = "<a href='" . self::get_option_link_href($option_toggle['_name']);
$link .= "&" . $option_toggle['_name'] . "="; $link .= "&" . $option_toggle['_name'] . "=" . $state;
$link .= $toggle === 'show' ? 'hide' : 'show'; $link .= "'>".$state." menu</a>";
$link .= "'>show menu</a>";
$links[] = $link; $links[] = $link;
return $links; return $links;
@@ -983,46 +1000,21 @@ class Plgntls_xtx {
/* /*
* callback of the option toggle_menu
* handle the toggle menu when url is reached * handle the toggle menu when url is reached
* triggered by template_redirect hook
* *
*/ */
public static function toggle_plugin_menu() { public static function toggle_plugin_menu($request, $option_name) {
$slug_toggle = self::SLUG_TOOGLE_ADMIN_MENU; error_log("inside toggle_plugin_menu");
$toggle_menu = self::OPTION_TOGGLE_MENU;
global $wp; if ($request[$option_name] === 'show') {
$current_slug = $wp->request; update_option($option_name, 'show');
if ($current_slug !== $slug_toggle) { }
return; else if ($request[$option_name] === 'hide') {
update_option($option_name, 'hide');
} }
$show = null; self::redirect_menu_referer();
if (!isset($_GET)) {
$show = null;
}
else if (empty($_GET)) {
$show = null;
}
if (!isset($_GET[$slug_toggle])) {
$show = null;
}
else if ($_GET['toggle'] === 'show') {
$show = true;
}
else if ($_GET['toggle'] === 'hide') {
$show = false;
}
if ($show === true) {
update_option($toggle_menu['_name'], $toggle_menu['show']);
}
else if ($show === false) {
update_option($toggle_menu['_name'], $toggle_menu['hide']);
}
$plugins_menu_url = admin_url('plugins.php');
wp_redirect($plugins_menu_url, 301);
exit; exit;
} }
@@ -1093,15 +1085,8 @@ class Plgntls_xtx {
return get_option($option['_name']); return get_option($option['_name']);
} }
public static function get_option_link_href($option) { public static function get_option_link_href($option_name) {
/* $option_data = self::_get_option_data($option_name);
* first init option, in case it was not already
*
*/
if (false === self::_init_option($option)) {
return null;
}
$option_data = self::_get_option_data($option['_name']);
if (false === $option_data) { if (false === $option_data) {
return null; return null;
} }
@@ -1119,15 +1104,15 @@ class Plgntls_xtx {
* and add 3 hidden inputs fields for form action and nonce * and add 3 hidden inputs fields for form action and nonce
* *
*/ */
public static function open_form_option($option, $method = "post") { public static function open_form_option($option_name, $method = "post") {
$option_data = self::_get_option_data($option); $option_data = self::_get_option_data($option_name);
if (false === $option_data) { if (false === $option_data) {
return null; return null;
} }
$form = '<form method="'.$method.'" action="'.admin_menu('admin-post.php').'">'; $form = '<form method="'.$method.'" action="'.admin_menu('admin-post.php').'">';
$form .= '<input type="hidden" name="action" value="'.$option_data['_action'].'">'; $form .= '<input type="hidden" name="action" value="'.$option_data['_action'].'">';
$form .= '<input type="hidden" name="option_name" value="'.$option_data['_name'].'">'; $form .= '<input type="hidden" name="option_name" value="'.$option_data['_name'].'">';
$form .= wp_nonce_field($option_data["_nonce_action"], $option_data["_nonce_name"]); $form .= wp_nonce_field($option_data["_nonce_action"], $option_data["_nonce_name"], true, true);
return $fields; return $fields;
} }
@@ -1148,6 +1133,8 @@ class Plgntls_xtx {
/* /*
* a valid option_data must contains '_name' and '_default' at least * a valid option_data must contains '_name' and '_default' at least
* if the option was retrieve in the database,
* there is no need to check it again : special field _db = null
* *
*/ */
private static function _init_option($option) { private static function _init_option($option) {
@@ -1157,10 +1144,13 @@ class Plgntls_xtx {
if (!isset($option['_default'])) { if (!isset($option['_default'])) {
return false; return false;
} }
if (isset($option['_db'])) {
return true;
}
/* /*
* if wp option exists already, just get it * if wp option does not already exists, just add it
* otherwise, add it * otherwise, get it and check the values
* *
*/ */
$name = $option['_name']; $name = $option['_name'];
@@ -1169,70 +1159,102 @@ class Plgntls_xtx {
} }
/* /*
* if self::_options does not contains the option yet, add it * checks all the default fields :
* also check that it contains every fields
* - _action, default 'action_for_admin_post_options_'.self::_prefix * - _action, default 'action_for_admin_post_options_'.self::_prefix
* if you use another action, it will not trigger the class handler function * if you use another action, it will not trigger the class handler function
* - _nonce_action * - _nonce_action
* - _nonce_name * - _nonce_name
* - _callback
*
*/
$default_option = array(
'_action'=>self::$_options_action,
'_nonce_action'=>'nonce_action_'.$name,
'_nonce_name'=>'nonce_name_'.$name,
'_callback'=>'',
);
foreach ($default_option as $key => $value) {
if (!isset($option[$key])) {
$option[$key] = $value;
}
}
/*
* override saved option with new one
* or we could compare each fields and update them if needed
* - but is it not more heavy in computing actions ?
* also add the field '_db' equal to anything (null by default)
* to mark it as coming from this database
* and differentiate it from new options
* *
*/ */
$to_set = false;
$options_serialized = get_option(self::$_options_list); $options_serialized = get_option(self::$_options_list);
$options_unserialized = unserialize($options_serialized); $options_unserialized = unserialize($options_serialized);
if (isset($options_unserialized[$name])) { $option['_db'] = null;
$tmp_option = $options_unserialized[$name]; $options_unserialized[$name] = $option;
}
else {
$to_set = true;
$tmp_option = $option;
}
// checks all the fields
if (!isset($tmp_option['_action'])) {
$to_set = true;
$tmp_option['_action'] = self::$_options_action;
}
if (!isset($tmp_option['_nonce_action'])) {
$to_set = true;
$tmp_option['_nonce_action'] = 'nonce_action_' . $name;
}
if (!isset($tmp_option['_nonce_name'])) {
$to_set = true;
$tmp_option['_nonce_name'] = 'nonce_name_' . $name;
}
// if needed, assigns the new value to the options_list
if ($to_set === true) {
$options_unserialized[$name] = $tmp_option;
update_option(self::$_options_list, serialize($options_unserialized), '', 'no'); update_option(self::$_options_list, serialize($options_unserialized), '', 'no');
}
return true; return true;
} }
public static function _handle_admin_post_option() { private static function _handle_admin_post_option() {
if (!isset($_REQUEST)) { if (!isset($_REQUEST)) {
return; return;
} }
$request = $_REQUEST; $request = $_REQUEST;
/*
* get values from the request, and unset them :
* - name of the option -> to get the option_data
* then get the option data :
* - nonce infos -> to check the nonce (nonce_name and nonce_action)
* - callback
* with nonce name, get the nonce from the request, and check it
*
*/
unset($request['action']); unset($request['action']);
$option_name = $request['option_name']; $option_name = $request['option_name'];
unset($request['option_name']); unset($request['option_name']);
// option data :
$option_data = self::_get_option_data($option_name); $option_data = self::_get_option_data($option_name);
if (!isset(
$option_data['_nonce_name'],
$option_data['_nonce_action'],
$option_data['_callback'])
) {
self::redirect_menu_referer();
exit;
}
$nonce_name = $option_data['_nonce_name']; $nonce_name = $option_data['_nonce_name'];
$nonce_action = $option_data['_nonce_action']; $nonce_action = $option_data['_nonce_action'];
$nonce_callback = $option_data['_callback'];
// check the nonce
$nonce = $request[$nonce_name]; $nonce = $request[$nonce_name];
unset($request[$nonce_name]); unset($request[$nonce_name]);
if (!wp_verify_nonce($nonce, $nonce_action)) { if (!wp_verify_nonce($nonce, $nonce_action)) {
// redirect to referer self::redirect_menu_referer();
exit; exit;
} }
error_log("request: " . json_encode($request)); /*
* if nonce passed, call the callback
* - with the remaining of the request
* - and the option name
*
*/
$nonce_callback($request, $option_name);
}
public static function redirect_menu_referer() {
if (wp_get_referer()) {
wp_safe_redirect(wp_get_referer());
exit;
}
else {
wp_safe_redirect(admin_url());
exit;
}
} }