options = get_option( 'qmerce-settings-admin' );
include( QMERCE_PLUGIN_DIR . 'views/settings.tpl.php' );
}
/**
* Register and add settings
*/
public function pageInit()
{
register_setting(
'qmerce-settings-fields', // Option group
'qmerce-settings-admin', // Option name
array( $this, 'sanitize' ) // Sanitize
);
add_settings_section(
'setting_section_id', // ID
'Authorization Settings', // Title
array( $this, 'printSectionInfo' ), // Callback
'qmerce-settings-admin' // Page
);
add_settings_field(
'auth_token',
'Apester authorization token',
array( $this, 'authTokenCallback' ),
'qmerce-settings-admin',
'setting_section_id'
);
add_settings_field(
'helper_info',
'Where do I find my token?',
array( $this, 'printHelperInfo' ),
'qmerce-settings-admin',
'setting_section_id'
);
add_settings_field(
'post_types',
'Post types for admin box',
array( $this, 'postTypesCb' ),
'qmerce-settings-admin',
'setting_section_id'
);
add_settings_field(
'automation_post_types',
'Post Types with automated Apester interactive widget below the main content',
array( $this, 'automationPostTypeCb' ),
'qmerce-settings-admin',
'setting_section_id'
);
}
/**
* Retrieves available post types
* @return array
*/
private function getPostTypes()
{
return get_post_types( array( 'show_in_menu' => true ), 'objects' );
}
/**
* Callback for the postTypes settings field
*/
public function postTypesCb() {
$post_types = $this->getPostTypes();
if ( empty( $this->options['post_types'] ) || ! is_array( $this->options['post_types'] ) ) {
$this->options['post_types'] = array();
}
foreach ( $post_types as $post_type ) {
$checked = '';
if ( in_array( $post_type->name, $this->options['post_types'] ) ) {
$checked = 'checked';
}
printf(
' %s ',
esc_attr( $post_type->name ),
$checked,
esc_html( $post_type->label )
);
}
}
public function automationPostTypeCb()
{
$postTypes = $this->getPostTypes();
foreach($postTypes as $postType) {
$checked = '';
if ( in_array( $postType->name, $this->getAutomationPostTypes() ) ) {
$checked = 'checked';
}
printf(
'
' .
'
',
$postType->name
);
}
}
private function getAutomationPostTypes() {
if ( ! empty( $this->options['automation_post_types'] ) ) {
return $this->options['automation_post_types'];
}
return array();
}
/**
* Validates Apester authToken
* @param string $value
* @return bool
*/
private function validateToken($value)
{
return (bool) preg_match( '/^[0-9a-fA-F]{24}$/', $value );
}
/**
* Preserve old values - DEPRECATED
* @return array
*/
protected function preserveValue()
{
add_settings_error( 'qmerce-settings-admin', 500, 'Given authorization token is not valid' );
$qmerceSettings = get_option( 'qmerce-settings-admin' );
return array( 'auth_token' => $qmerceSettings['auth_token'] );
}
/**
* Retrieves the names of all available post types in array
* @return array
*/
private function getPostTypesNames() {
return wp_list_pluck($this->getPostTypes(), 'name');
}
/**
* Determines if submitted post types are valid
* @param array $postTypes
* @return bool
*/
private function isPostTypesValid($postTypes)
{
$availablePostTypes = $this->getPostTypesNames();
foreach ( $postTypes as $postType ) {
if ( !in_array( $postType, $availablePostTypes ) ) {
return false;
}
}
return true;
}
/**
* @param array $postTypes
* @return array
*/
private function sanitizePostTypes($postTypes)
{
if ( is_array( $postTypes ) && $this->isPostTypesValid( $postTypes ) ) {
return $postTypes;
}
return array();
}
/**
* Update the tokens list with the playlist enabled state of each token
* @param $current_apester_tokens - all tokens available at the server
* @param $playlist_tokens - the list of playlist enabled tokens from the client UI
*
* @return array - the updated state of the channel tokens list
*/
private function sanitizePlaylistTokens($current_apester_tokens, $playlist_tokens)
{
// in case the array is not passed just ignore that and return the value as it was before the current function call
if (!isset( $playlist_tokens )) {
return $current_apester_tokens;
}
$new_tokens = array();
foreach ( $playlist_tokens as $playlist_token => $isTokenChecked ) {
// only update if the token exists in the tokens list
if (isset($current_apester_tokens) && array_key_exists($playlist_token, $current_apester_tokens)) {
// the value passed for the 'isPlaylistEnabled' property can only be either '0' or '1'
$new_tokens[$playlist_token]['isPlaylistEnabled'] = ($isTokenChecked == '1' || $isTokenChecked == '0') ? $isTokenChecked : '0';
}
}
return $new_tokens;
}
private function sanitizeTags($tags) {
$sanitizedTags = array();
if ( ! empty( $tags ) && is_array( $tags ) ) {
foreach ( $tags as $tag ) {
$trimmedTag = trim( $tag );
if ( count($sanitizedTags) == self::MAX_TAGS
|| $trimmedTag === ''
|| in_array($trimmedTag, $sanitizedTags)
|| strlen($trimmedTag) > self::MAX_TAG_LENGTH ) {
continue;
}
$sanitizedTags[] = sanitize_text_field( $trimmedTag );
}
}
return $sanitizedTags;
}
public function sanitizePlaylistPosition( $playlistPosition ) {
if ( ! isset($playlistPosition) || ! in_array($playlistPosition, $this->allowed_positions) ){
return 'bottom';
}
return $playlistPosition;
}
/**
* Sanitize each setting field as needed
*
* @param array $input Contains all settings fields as array keys
* @return array|string
*/
public function sanitize( $input ) {
$new_input = array();
$apester_options = get_option( 'qmerce-settings-admin' );
$apester_tokens = $apester_options['apester_tokens'];
if ( isset( $input['post_types'] ) ) {
$new_input['post_types'] = $this->sanitizePostTypes( $input['post_types'] );
}
if ( isset( $input['automation_post_types'] ) ) {
$new_input['automation_post_types'] = $this->sanitizePostTypes( $input['automation_post_types'] );
}
// Delete the unused user-id value.
delete_option( 'qmerce-user-id' );
if ( isset( $input['apester_tags'] ) ) {
$new_input['apester_tags'] = $this->sanitizeTags( $input['apester_tags'] );
}
if ( isset( $input['context'] ) ) {
$new_input['context'] = sanitize_text_field( $input['context'] );
}
if ( isset( $input['fallback'] ) ) {
$new_input['fallback'] = sanitize_text_field( $input['fallback'] );
}
$new_input['playlist_position'] = $this->sanitizePlaylistPosition($input['playlist_position']);
// cache the full token data for later
$manipulatedPlaylistTokens = $this->sanitizePlaylistTokens($apester_tokens, $input['playlist_enabled_tokens']);
// init the full token data so we can check for token existence
$new_input['apester_tokens'] = array();
$tokens = $input['auth_token'];
if (isset( $tokens )) {
$tokens = is_array( $tokens ) ? $tokens : array( $tokens );
$new_input['auth_token'] = array();
foreach ( $tokens as $token ) {
if ( trim($token) === '' || ! $this->validateToken( $token ) ) {
continue;
}
// we keep the old token list updated in case the plugin will be downgraded in the future
$new_input['auth_token'][] = sanitize_text_field( $token );
// convert '<' OR '>' into thier respective html entities
$sanitizedToken = sanitize_text_field( $token );
// if the token already exists use the existing data of it
if (isset($apester_tokens) && array_key_exists($sanitizedToken, $apester_tokens) ) {
$new_input['apester_tokens'][$sanitizedToken] = $manipulatedPlaylistTokens[$sanitizedToken];
}
// if the token is new - add it to the new list
else {
$new_input['apester_tokens'][$sanitizedToken] = array(
'isPlaylistEnabled' => '0'
);
}
}
}
return $new_input;
}
/**
* Print the Section text
*/
public function printSectionInfo() {
print 'Enter your settings below:';
}
/**
* Print the helper text.
*/
public function printHelperInfo() {
printf(
'Get a token at Apester.com (you can find it in your user settings.)',
esc_url( APESTER_EDITOR_BASEURL . '/register' ),
esc_url( APESTER_EDITOR_BASEURL . '/user/settings' )
);
}
/**
* Get the settings option array and print one of its values
*/
public function authTokenCallback() {
printf(
'',
isset( $this->options['auth_token'] ) ? esc_attr( $this->options['auth_token'] ) : ''
);
}
}
$qmerce_settings_page = new Qmerce_Settings();