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_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)) {
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 OPTION_TOGGLE_MENU = [
'_name'=>'toggle_admin_menu_option_xtxpatch',
'_callback'=>'',
'_callback'=>__CLASS__.'::toggle_plugin_menu',
'_default'=>'hide',
'show'=>'show',
'hide'=>'hide',
@@ -895,15 +900,25 @@ class Plgntls_xtx {
* 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();
if (empty($options)) {
if (empty($menu_options)) {
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);
}
@@ -961,19 +976,21 @@ class Plgntls_xtx {
* 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;
$toggle = self::get_option_safe($option_toggle);
if (false === $toggle) {
return $links;
}
if (!in_array($toggle, ['hide', 'show'])) {
return $links;
}
$state = $toggle === 'show' ? 'hide' : 'show';
$link = "<a href='" . self::get_option_link_href($option_toggle);
$link .= "&" . $option_toggle['_name'] . "=";
$link .= $toggle === 'show' ? 'hide' : 'show';
$link .= "'>show menu</a>";
$link = "<a href='" . self::get_option_link_href($option_toggle['_name']);
$link .= "&" . $option_toggle['_name'] . "=" . $state;
$link .= "'>".$state." menu</a>";
$links[] = $link;
return $links;
@@ -983,46 +1000,21 @@ class Plgntls_xtx {
/*
* callback of the option toggle_menu
* handle the toggle menu when url is reached
* triggered by template_redirect hook
*
*/
public static function toggle_plugin_menu() {
$slug_toggle = self::SLUG_TOOGLE_ADMIN_MENU;
$toggle_menu = self::OPTION_TOGGLE_MENU;
public static function toggle_plugin_menu($request, $option_name) {
error_log("inside toggle_plugin_menu");
global $wp;
$current_slug = $wp->request;
if ($current_slug !== $slug_toggle) {
return;
if ($request[$option_name] === 'show') {
update_option($option_name, 'show');
}
else if ($request[$option_name] === 'hide') {
update_option($option_name, 'hide');
}
$show = null;
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);
self::redirect_menu_referer();
exit;
}
@@ -1093,15 +1085,8 @@ class Plgntls_xtx {
return get_option($option['_name']);
}
public static function get_option_link_href($option) {
/*
* 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']);
public static function get_option_link_href($option_name) {
$option_data = self::_get_option_data($option_name);
if (false === $option_data) {
return null;
}
@@ -1119,15 +1104,15 @@ class Plgntls_xtx {
* and add 3 hidden inputs fields for form action and nonce
*
*/
public static function open_form_option($option, $method = "post") {
$option_data = self::_get_option_data($option);
public static function open_form_option($option_name, $method = "post") {
$option_data = self::_get_option_data($option_name);
if (false === $option_data) {
return null;
}
$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="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;
}
@@ -1148,6 +1133,8 @@ class Plgntls_xtx {
/*
* 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) {
@@ -1157,10 +1144,13 @@ class Plgntls_xtx {
if (!isset($option['_default'])) {
return false;
}
if (isset($option['_db'])) {
return true;
}
/*
* if wp option exists already, just get it
* otherwise, add it
* if wp option does not already exists, just add it
* otherwise, get it and check the values
*
*/
$name = $option['_name'];
@@ -1169,70 +1159,102 @@ class Plgntls_xtx {
}
/*
* if self::_options does not contains the option yet, add it
* also check that it contains every fields
* checks all the default fields :
* - _action, default 'action_for_admin_post_options_'.self::_prefix
* if you use another action, it will not trigger the class handler function
* - _nonce_action
* - _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_unserialized = unserialize($options_serialized);
if (isset($options_unserialized[$name])) {
$tmp_option = $options_unserialized[$name];
}
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');
}
$option['_db'] = null;
$options_unserialized[$name] = $option;
update_option(self::$_options_list, serialize($options_unserialized), '', 'no');
return true;
}
public static function _handle_admin_post_option() {
private static function _handle_admin_post_option() {
if (!isset($_REQUEST)) {
return;
}
$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']);
$option_name = $request['option_name'];
unset($request['option_name']);
// option data :
$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_action = $option_data['_nonce_action'];
$nonce_callback = $option_data['_callback'];
// check the nonce
$nonce = $request[$nonce_name];
unset($request[$nonce_name]);
if (!wp_verify_nonce($nonce, $nonce_action)) {
// redirect to referer
self::redirect_menu_referer();
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;
}
}