optPool, array($this, 'savePool'), 9, 3);
global $wp_version;
if( \version_compare(explode('-', $wp_version, 2)[0], '5.5', '>=') )
\add_filter('allowed_options', array($this, 'whitelistPoolOptions'), 99999);
else
\add_filter('whitelist_options', array($this, 'whitelistPoolOptions'), 99999);
}
/** @return bool */
function isOptionPage()
{
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- called inside WP settings API
if( !isset($_POST['tab']) || false === strpos(\sanitize_text_field(\wp_unslash($_POST['tab'])), 'wr_loyalty') )
return false;
$vars = array(
'action' => 'update',
'option_page' => LWS_WOOREWARDS_PAGE.'.loyalty'
);
foreach( $vars as $var => $value )
{
if( !isset($GLOBALS[$var]) || $GLOBALS[$var] != $value )
return false;
}
return true;
}
/** grab pool options */
function whitelistPoolOptions($whitelistOptions)
{
// we are from settings screen
if( $this->isOptionPage() && isset($whitelistOptions[$this->pagePool]) )
{
// take all page fields except pool id tweak
$lastOptions = array($this->optPool);
$this->whitelist = array_diff($whitelistOptions[$this->pagePool], $lastOptions);
// if include the pool id saving tweak field,
// means we are explicitely from one pool edition
// only this one will be saved, the rest is done by savePool()
if (count($whitelistOptions[$this->pagePool]) != count($this->whitelist)) {
$whitelistOptions[$this->pagePool] = $lastOptions;
}
}
return $whitelistOptions;
}
/** Save any relevant $_POST in pool wp_post.
* @return $oldValue cause WP dont go further with that option. */
function savePool($value, $oldValue, $option)
{
if( $this->whitelist && ($poolId = intval($value)) >= 0 )
{
$pool = \apply_filters('lws_wr_pool_admin_options_get_pool', null, $poolId, $this->whitelist, $this->poolOptionPrefix);
if( empty($pool) && $poolId > 0 )
$pool = \LWS\WOOREWARDS\Collections\Pools::instanciate()->load(array('p' => $poolId, 'deep'=>false))->last();
if( empty($pool) )
{
if (defined('WP_DEBUG') && WP_DEBUG) error_log("Requested pool cannot be loaded or created ($poolId)."); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
\lws_admin_add_notice_once('wr-pool-option-update-failure', __("Requested loyalty system cannot be loaded or created.", 'woorewards-lite'), array('level'=>'error'));
}
else
{
\do_action('lws_wr_pool_admin_options_before_update', $pool, $this->whitelist);
foreach( $this->whitelist as $option )
{
$option = trim($option);
$value = isset($_POST[$option]) ? \wp_unslash($_POST[$option]) : null; // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- nonce verified by WP settings API, value sanitized by pool setOption
if( substr($option, 0, strlen($this->poolOptionPrefix)) == $this->poolOptionPrefix )
{
$key = substr($option, strlen($this->poolOptionPrefix));
$pool->setOption($key, $value);
// special case
if( $key == 'title' && $value && !($poolId && $pool->getName()) )
$pool->setName($value);
}
else if( $option != $this->optPool )
{
\update_option($option, $value);
}
}
if( $pool->getName() )
$pool->ensureNameUnicity();
else
{
\lws_admin_add_notice_once('wr-pool-no-name', __("Please, set a Title for this Points and Rewards System.", 'woorewards-lite'), array('level' => 'warning'));
if( !$pool->getOption('disabled') )
{
$pool->setOption('disabled', true);
\lws_admin_add_notice_once('wr-pool-no-name', __("A Points and Rewards System without a Title cannot be turned On.", 'woorewards-lite'), array('level' => 'warning'));
}
}
$pool->save(false, false);
\do_action('lws_wr_pool_admin_options_after_update', $pool, $this->whitelist);
}
}
return $oldValue;
}
}