option_defaults();
$bytab = $this->admin_get_options_by_tab( $currenttab );
foreach( $bytab as $id){
$new = (isset($newoptions[$id])?$newoptions[$id]:'');
$old = (isset($oldoptions[$id])?$oldoptions[$id]:'');
$opt = (isset($options[$id])?$options[$id]:'');
$oldoptions[$id] = $this->MenuOptionsValidate( $new, $old, $opt ); // Make changes to existing options array
}
update_option( $this->get_private('settings'), $oldoptions);
return $oldoptions;
}
//////////////////////////////////////////////////////////////////////////////////////
////////////////////// Admin Option Functions //////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/**
* Create array of option names for a given tab
*
* @ Since 1.2.0
*/
function admin_get_options_by_tab( $tab = 'generator' ){
$default_options = $this->option_defaults();
$return = array();
foreach($default_options as $key => $val){
if( $val['tab'] == $tab ){
$return[$key] = $key;
}
}
return $return;
}
/**
* Create array of option names and current values for a given tab
*
* @ Since 1.2.0
*/
function admin_get_settings_by_tab( $tab = 'generator' ){
$current = $this->get_all_options();
$default_options = $this->option_defaults();
$return = array();
foreach($default_options as $key => $val){
if( $val['tab'] == $tab ){
$return[$key] = $current[$key];
}
}
return $return;
}
/**
* Create array of positions for a given tab along with a list of settings for each position
*
* @ Since 1.2.0
* @ Updated 1.2.3
*/
function get_option_positions_by_tab( $tab = 'generator' ){
$positions = $this->admin_option_positions();
$return = array();
if( isset($positions[$tab]) ){
$options = $this->admin_get_options_by_tab( $tab );
$defaults = $this->option_defaults();
foreach($positions[$tab] as $pos => $info ){
$return[$pos]['title'] = (isset($info['title'])?$info['title']:'');
$return[$pos]['description'] = (isset($info['description'])?$info['description']:'');
$return[$pos]['options'] = array();
}
foreach($options as $name){
$pos = (isset($defaults[$name]['position'])?$defaults[$name]['position']:'none');
$return[ $pos ]['options'][] = $name;
}
}
return $return;
}
/**
* Create array of positions for each widget along with a list of settings for each position
*
* @ Since 1.2.0
*/
function admin_get_widget_options_by_position(){
$default_options = $this->option_defaults();
$positions = $this->admin_widget_positions();
$return = array();
foreach($positions as $key => $val ){
$return[$key]['title'] = $val;
$return[$key]['options'] = array();
}
foreach($default_options as $key => $val){
if(!empty($val['widget'])){
$return[ $val['position'] ]['options'][] = $key;
}
}
return $return;
}
//////////////////////////////////////////////////////////////////////////////////////
/////////////////////// Admin Page Functions //////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/**
* Create shortcode based on given options
*
* @ Since 1.1.0
* @ Update 1.2.5
*/
function admin_generate_shortcode( $options, $optiondetails ){
$short = '['.$this->get_private('short');
$id = rand(100, 1000);
$short .= ' id='.$id;
$trigger = '';
foreach( $options as $key=>$value ){
if($value && isset($optiondetails[$key]['short'])){
if( isset($optiondetails[$key]['child']) && isset($optiondetails[$key]['hidden']) ){
$hidden = @explode(' ',$optiondetails[$key]['hidden']);
if( !in_array( $options[ $optiondetails[$key]['child'] ] ,$hidden) ){
$short .= ' '.$optiondetails[$key]['short'].'="'.$value.'"';
}
}else{
$short .= ' '.$optiondetails[$key]['short'].'="'.$value.'"';
}
}
}
$short .= ']';
return $short;
}
/**
* Define Settings Page Tab Markup
*
* @since 1.1.0
* @link`http://www.onedesigns.com/tutorials/separate-multiple-theme-options-pages-using-tabs Daniel Tara
*
*/
function admin_options_page_tabs( $current = 'general' ) {
$tabs = $this->admin_settings_page_tabs();
$links = array();
foreach( $tabs as $tab ){
$tabname = $tab['name'];
$tabtitle = $tab['title'];
if( $tabname == $current ){
$links[] = ''.$tabtitle.' ';
}else{
$links[] = ''.$tabtitle.' ';
}
}
echo '
'.$this->get_private('name').' ';
echo '';
}
/**
* Function for printing general settings page
*
* @ Since 1.2.0
* @ Updated 1.2.4
*/
function admin_display_general(){
?>
get_private('name'); _e(", a WordPress plugin by the Alpine Press.");?>
check_private('termsofservice') ) {
echo ''.$this->get_private('termsofservice').'
';
}?>
the Alpine Press .
check_private('plugins') && is_array( $this->get_private('plugins') ) ){
foreach($this->get_private('plugins') as $each){
?>
Please support further development of this plugin with a small donation .
get_all_options();
$settings_section = $this->get_private('id'). '_' . $currenttab . '_tab';
$submitted = ( ( isset($_POST[ "hidden" ]) && ($_POST[ "hidden" ]=="Y") ) ? true : false );
if( $submitted ){
$options = $this->admin_simple_update( $currenttab, $_POST, $options );
}
$buttom = (isset($_POST[$this->get_private('settings').'_'.$currenttab]['submit-'.$currenttab])?$_POST[$this->get_private('settings').'_'.$currenttab]['submit-'.$currenttab]:'');
if( $buttom == 'Delete Current Cache' ){
//
// DELETE CACHE BUTTON HAS BEEN DISABLED ON USER-SIDE
//
$bot = new PhotoTileForInstagramBot();
$bot->clearAllCache();
echo ''.__("Cache Cleared").'
';
}
elseif( $buttom == 'Save Settings' ){
$bot = new PhotoTileForInstagramBot();
$bot->clearAllCache();
echo ''.__("Settings Saved").'
';
}
echo '';
}
/**
* Second function for printing options page
*
* @ Since 1.1.0
* @ Updated 1.2.7
*
*/
function admin_display_opt_form($options,$currenttab){
$defaults = $this->option_defaults();
$positions = $this->get_option_positions_by_tab( $currenttab );
$submitted = ( ( isset($_POST[ "hidden" ]) && ($_POST[ "hidden" ]=="Y") ) ? true : false );
if( 'generator' == $currenttab ) {
$preview = (isset($_POST[ $this->get_private('settings').'_preview']['submit-preview']) && $_POST[ $this->get_private('settings').'_preview']['submit-preview'] == 'Preview')?true:false;
if( $submitted && isset($_POST['shortcode']) && $preview ){
$short = str_replace('\"','"',$_POST['shortcode']);
}elseif( $submitted ){
// Use filtered $options, not unflitered $_POST
$short = $this->admin_generate_shortcode( $options, $defaults );
}
?>
This tool allows you to create shortcodes for the Alpine PhotoTile plugin.
A shortcode is a line of text that tells WordPress how to load a plugin inside the content of a page or post. Rather than explaining how to put together a shortcode, this tool will create the shortcode for you.
';
echo do_shortcode($short);
echo '';
}
}
echo ' ';
}
if( !empty($positions) && count($positions) ){
foreach( $positions as $position=>$positionsinfo){
echo '';
if( !empty($positionsinfo['title']) ){ echo '
'. $positionsinfo['title'].' '; }
if( !empty($positionsinfo['description']) ){ echo '
'. $positionsinfo['description'].'
'; }
echo '
';
echo '
';
}
}
if( 'generator' == $currenttab ) {
echo ' ';
}elseif( 'plugin-settings' == $currenttab ){
echo ' ';
//echo ' ';
}
}
//////////////////////////////////////////////////////////////////////////////////////
////////////////////// Menu Display Functions /////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/**
* Function for displaying forms in the widget page
*
* @ Since 1.0.0
* @ Updated 1.2.6.1
*/
function MenuDisplayCallback($options,$option,$fieldname,$fieldid){
$default = (isset($option['default'])?$option['default']:'');
$optionname = (isset($option['name'])?$option['name']:'');
$optiontitle = (isset($option['title'])?$option['title']:'');
$optiondescription = (isset($option['description'])?$option['description']:'');
$fieldtype = (isset($option['type'])?$option['type']:'');
$value = ( isset($options[$optionname]) ? $options[$optionname] : $default );
// Output checkbox form field markup
if ( 'checkbox' == $fieldtype ) {
?>
/>
value="" />
value="" >
value="" >
/>
value="" />
value="" >
value="" >
=$min && $newinput<=$max) ? $newinput : $valid_input );
}
// Validate text input and textarea fields
else if ( ( 'text' == $type || 'textarea' == $type || 'image-upload' == $type) ) {
$valid_input = strip_tags( $newinput );
$sanatize = (isset($optiondetails['sanitize'])?$optiondetails['sanitize']:'');
// Validate no-HTML content
// nospaces option offers additional filters
if ( 'nospaces' == $sanatize ) {
// Pass input data through the wp_filter_nohtml_kses filter
$valid_input = wp_filter_nohtml_kses( $newinput );
// Remove specified character(s)
if( isset($optiondetails['remove']) ){
if( is_array($optiondetails['remove']) ){
foreach( $optiondetails['remove'] as $remove ){
$valid_input = str_replace($remove,'',$valid_input);
}
}else{
$valid_input = str_replace($optiondetails['remove'],'',$valid_input);
}
}
// Switch or encode characters
if( isset($optiondetails['encode']) && is_array( $optiondetails['encode'] ) ){
foreach( $optiondetails['encode'] as $find=>$replace ){
$valid_input = str_replace($find,$replace,$valid_input);
}
}
// Replace spaces with provided character or just remove spaces
if( isset($optiondetails['replace']) ){
$valid_input = str_replace(array(' ',' '),$optiondetails['replace'],$valid_input);
}else{
$valid_input = str_replace(' ','',$valid_input);
}
}
// Check if numeric
elseif ( 'numeric' == $sanatize && is_numeric( wp_filter_nohtml_kses( $newinput ) ) ) {
// Pass input data through the wp_filter_nohtml_kses filter
$valid_input = wp_filter_nohtml_kses( $newinput );
if( isset($optiondetails['min']) && $valid_input<$optiondetails['min']){
$valid_input = $optiondetails['min'];
}
if( isset($optiondetails['max']) && $valid_input>$optiondetails['max']){
$valid_input = $optiondetails['max'];
}
}
elseif ( 'int' == $sanatize && is_numeric( wp_filter_nohtml_kses( $newinput ) ) ) {
// Pass input data through the wp_filter_nohtml_kses filter
$valid_input = round( wp_filter_nohtml_kses( $newinput ) );
if( isset($optiondetails['min']) && $valid_input<$optiondetails['min']){
$valid_input = $optiondetails['min'];
}
if( isset($optiondetails['max']) && $valid_input>$optiondetails['max']){
$valid_input = $optiondetails['max'];
}
}
elseif ( 'tag' == $sanatize ) {
// Pass input data through the wp_filter_nohtml_kses filter
$valid_input = wp_filter_nohtml_kses( $newinput );
$valid_input = str_replace(' ','-',$valid_input);
}
// Validate no-HTML content
elseif ( 'nohtml' == $sanatize ) {
// Pass input data through the wp_filter_nohtml_kses filter
$valid_input = wp_filter_nohtml_kses( $newinput );
$valid_input = str_replace(' ','',$valid_input);
}
// Validate HTML content
elseif ( 'html' == $sanatize ) {
// Pass input data through the wp_filter_kses filter using allowed post tags
$valid_input = wp_kses_post($newinput );
}
// Validate URL address
elseif( 'url' == $sanatize ){
$valid_input = esc_url( $newinput );
}
// Validate CSS
elseif( 'css' == $sanatize ){
$valid_input = wp_htmledit_pre( stripslashes( $newinput ) );
}
// Just strip slashes
elseif( 'stripslashes' == $sanatize ){
$valid_input = stripslashes( $newinput );
}
}else if( 'wp-textarea' == $type ){
// Text area filter
$valid_input = wp_kses_post( force_balance_tags($newinput) );
}
elseif( 'color' == $type ){
$value = wp_filter_nohtml_kses( $newinput );
if( '#' == $value ){
$valid_input = '';
}else{
$valid_input = $value;
}
}
return $valid_input;
}
}
/** ##############################################################################################################################################
* ##############################################################################################################################################
* ##############################################################################################################################################
* ##############################################################################################################################################
* ##############################################################################################################################################
* ##############################################################################################################################################
* ##############################################################################################################################################
* ##############################################################################################################################################
*
* AlpineBot
*
* ADMIN Functions
* Contains ONLY UNIQUE ADMIN functions
*
* ##########################################################################################
*/
class PhotoTileForInstagramAdmin extends PhotoTileForInstagramAdminSecondary{
//////////////////////////////////////////////////////////////////////////////////////
//////////////////// Unique Admin Functions ////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/**
* Add User
*
* @ Since 1.2.0
* @ Updated 1.2.6.2
*/
function AddUser( $post_content ){
/* $post_content = array(
'access_token' => $access_token,
'username' => $user->username,
'picture' => $user->profile_picture,
'fullname' => $user->full_name,
'client_id' => $client_id,
'client_secret' => $client_secret
);*/
if( isset($post_content['access_token']) && !empty($post_content['access_token']) && isset($post_content['username']) && !empty($post_content['username']) && isset($post_content['user_id']) && !empty($post_content['user_id']) ){
// All necessary data is accounted for
// Empty array to store users
$currentUsers = array();
$username = $post_content['username'];
$oldoptions = $this->get_all_options();
if( isset($oldoptions['users']) && !empty($oldoptions['users']) ){
// Check current record of users
$currentUsers = $oldoptions['users'];
}
$post_content['name'] = $username;
$post_content['title'] = $username;
// Add user to users array
$currentUsers[ $username ] = $post_content;
// Re-assign users array
$oldoptions['users'] = $currentUsers;
update_option( $this->get_private('settings'), $oldoptions );
}
return true;
}
/**
* Delete User
*
* @since 1.2.0
*
*/
function DeleteUser( $user ){
$oldoptions = $this->get_all_options();
$currentUsers = $oldoptions['users'];
if( !empty($currentUsers[$user]) ){
unset($currentUsers[$user]);
}
$oldoptions['users'] = $currentUsers;
update_option( $this->get_private('settings'), $oldoptions);
}
/**
* Update User
*
* @since 1.2.0
*
*/
function UpdateUser( $data ){
$oldoptions = $this->get_all_options();
$currentUsers = $oldoptions['users'];
if( !empty($data['username']) && !empty($oldoptions['users']) && !empty($oldoptions['users'][$data['username']]) ) {
$current = $oldoptions['users'][$data['username']];
foreach( $data as $k=>$v ){
if( !empty($v) ){
$current[$k] = $v;
}
}
$oldoptions['users'][$data['username']] = $current;
update_option( $this->get_private('settings'), $oldoptions);
}
}
/**
* Alpine PhotoTile: Options Page
*
* @ Since 1.1.1
* @ Updated 1.2.4
*/
function admin_build_settings_page(){
$currenttab = isset( $_GET['tab'] )?$_GET['tab']:'general';
echo '';
$this->admin_options_page_tabs( $currenttab );
echo '
';
echo '
';
if( 'general' == $currenttab ){
$this->admin_display_general();
}elseif( 'add' == $currenttab ){
$this->admin_display_add();
}elseif( 'plugin-tools' == $currenttab ){
$this->admin_display_tools();
}else{
$this->admin_setup_options_form($currenttab);
}
echo '
';
echo '
';
$this->admin_donate_button();
echo '
'.__('Need Help? Visit ').'the Alpine Press '.__(' for more about this plugin.').'
';
echo '
';
echo '
'; // Close Container
echo '
'; // Close wrap
}
/**
* Show User Function
*
* @ Since 1.2.0
* @ Updated 1.2.5
*/
function show_user($info){
$name = (isset($info['username'])?$info['username']:'user');
$picture = (isset($info['picture'])?$info['picture']:'user');
$output = '';
$output .= '
'.$name.' ';
$output .= '
';
// Not currently needed
$output .= '
';
$output .= '
';
$output .= '
';
return $output;
}
/**
* Show User Javascript
*
* @ Since 1.2.0
*
* // Not currently needed
*/
function show_user_js($info){
$redirect = admin_url( 'options-general.php?page='.$this->get_private('settings').'&tab=add' );
$output = 'jQuery(document).ready(function() {var url = "https://api.instagram.com/oauth/authorize/"+"?redirect_uri=" + encodeURIComponent("'.$redirect . '")+ "&response_type=code" + "&client_id='.$info['client_id'].'" + "&display=touch";jQuery("#'.$this->get_private('settings').'-user-'.$info['username'].'").ajaxForm({ success: function(responseText){ window.location.replace(url); } }); });';
return $output;
}
/**
* Display Add User Page
*
* @ Since 1.2.0
* @ Updated 1.2.7
*/
function admin_display_add(){
$currenttab = 'add';
$options = $this->get_all_options();
$settings_section = $this->get_private('id') . '_'.$currenttab.'_tab';
$submitted = ( ( isset($_POST[ "hidden" ]) && ($_POST[ "hidden" ]=="Y") ) ? true : false );
$redirect = admin_url( 'options-general.php?page='.$this->get_private('settings').'&tab='.$currenttab );
$success = false;
$errormessage = null;
$errortype = null;
if( isset($_POST['add-user']) ){
if( !empty($_POST['client_id']) && !empty($_POST['client_secret']) ){
$options = $this->admin_simple_update( $currenttab, $_POST, $options ); // Don't display previously input info
?>
DeleteUser( $user );
}
elseif( isset($_POST['update-user']) && isset($_POST['user']) ){
// Update User button was pressed
$user = $_POST['user'];
$users = $this->get_instagram_users();
if( !empty($users) && !empty($users[$user]) && !empty($users[$user]['access_token']) && !empty($users[$user]['user_id']) ){
$request = 'https://api.instagram.com/v1/users/'.$users[$user]['user_id'].'/?access_token='.$users[$user]['access_token'];
$response = wp_remote_get($request,
array(
'method' => 'GET',
'timeout' => 10,
'sslverify' => apply_filters('https_local_ssl_verify', false)
)
);
if( is_wp_error( $response ) || !isset($response['body']) ) {
// Try again
if( method_exists( $this, 'manual_cURL' ) ){
$content = $this->manual_cURL($request);
}
if( !isset($content) ){
$errormessage = 'User not updated';
}
}else{
$content = $response['body'];
}
if( isset( $content ) ){
// Before decoding JSON, remove Emoji characters from content
$content = $this->removeEmoji($content);
if( function_exists('json_decode') ){
$_instagram_json = @json_decode( $content, true );
}elseif( function_exists('alpine_json_decode') ){
$_instagram_json = @alpine_json_decode( $content, true );
}
if( empty($_instagram_json) || 200 != $_instagram_json['meta']['code'] ){
$errormessage = 'User not updated';
}elseif( !empty($_instagram_json['data']) ){
$data = $_instagram_json['data'];
$post_content = array(
'access_token' => $users[$user]['access_token'],
'username' => $data['username'],
'picture' => $data['profile_picture'],
'fullname' => $data['full_name'],
'user_id' => $users[$user]['user_id']
);
$this->UpdateUser( $post_content );
$update = true;
}
}
}
}
elseif( $submitted && isset($_POST['manual-user-form']) && !empty($_POST['access_token']) && !empty($_POST['user_id']) && !empty($_POST['client_id']) && !empty($_POST['username']) ){
$success = $this->AddUser($_POST);
}
elseif( isset($_GET['code']) ) {
// Callback has been received from Instagram
$code = $_GET['code'];
$client_id = $this->get_option('client_id');
$client_secret = $this->get_option('client_secret');
$url = 'https://api.instagram.com/oauth/access_token';
$fields = array(
'code' => $code,
'response_type' => 'authorization_code',
'redirect_uri' => $redirect,
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code'
);
$response = wp_remote_post($url,
array(
'body' => $fields,
'sslverify' => apply_filters('https_local_ssl_verify', false)
)
);
$access_token = null;
$username = null;
$image = null;
if( is_wp_error( $response ) || !isset($response['body']) ) {
// Try again
if( method_exists( $this, 'manual_cURL' ) ){
$content = $this->manual_cURL($url,$fields);
}
if( !isset($content) ){
$errormessage = 'User not added';
}
}else{
$content = $response['body'];
}
if( isset($content) ) {
// Before decoding JSON, remove Emoji characters from content
$content = $this->removeEmoji($content);
if( function_exists('json_decode') ){
$auth = @json_decode( $content, true );
}elseif( function_exists('alpine_json_decode') ){
$auth = @alpine_json_decode( $content, true );
}
// If decoded correctly, should now have access token
if( isset($auth['access_token']) ) {
$access_token = $auth['access_token'];
$user = $auth['user'];
$post_content = array(
'access_token' => $access_token,
'username' => $user['username'],
'picture' => $user['profile_picture'],
'fullname' => $user['full_name'],
'user_id' => $user['id'],
'client_id' => $client_id,
'client_secret' => $client_secret
);
$success = $this->AddUser($post_content);
}else{
$errormessage = 'No access token found';
}
}elseif( !is_wp_error($response) && $response['response']['code'] >= 400 ) {
$error = '';
if( function_exists('json_decode') ){
$error = @json_decode( $response['body'], true );
}elseif( function_exists('alpine_json_decode') ){
$error = @alpine_json_decode( $response['body'], true );
}
$errormessage = $error->error_message;
$errortype = $error->error_type;
}
}
$defaults = $this->option_defaults();
$positions = $this->get_option_positions_by_tab( $currenttab );
echo '';
if( !empty($success) ){
echo '
User successfully authorized.
';
}elseif( !empty($update) ){
echo '
User ('.$user.') updated.
';
}elseif( !empty($delete) ){
echo '
User ('.$user.') deleted.
';
}elseif( !empty($errormessage) ){
echo '
An error occured ('.$errormessage.').
';
}
if( count($positions) ){
foreach( $positions as $position=>$positionsinfo){
if( $position == 'top'){
echo '
';
if( $positionsinfo['title'] ){ echo '
'. $positionsinfo['title'].' '; }
$users = $this->get_instagram_users();
if( empty($users) || ( is_array( $users ) && isset($users['none']) && is_array( $users['none'] ) ) ){
echo '
No users available. Add a user by following the instructions below.
';
}elseif( !empty($users) && is_array($users) ){
foreach($users as $name=>$info){
echo $this->show_user($info);
//echo ''; // Not currently needed
}
}
echo '
';
}else{
echo '
';
// Display Message about adding users
$this->admin_display_add_message();
// Show directions for Add User Method One
$this->admin_display_method_one($redirect);
echo '
';
// Display Form
echo '
';
echo '
';
echo '';
echo '
';
echo '
';
}
}
}
echo ''; // close add div
$this->admin_display_method_two();
}
/**
* Display Add User Method One
*
* @ Since 1.2.6.3
*/
function admin_display_method_one($redirect){
?>
:
Your Internet browser or the server that your WordPress site is hosted on may cause Method One to fail. Therefore, in Method Two you will use a tool hosted at theAlpinePress.com to retrieve the information you need and then manually submit it to the plugin using the form below.
the Alpine Press
:
(!!!)
let me know if these directions become outdated.");?>
';
echo '
System Check ';
echo 'Check the settings and extensions on your web server.
';
echo '';
echo ''; // Close top
$currenttab = 'plugin-tools';
$defaults = $this->option_defaults();
$submitted = ( ( isset($_POST[ "hidden" ]) && ($_POST[ "hidden" ]=="Y") ) ? true : false );
$test = (isset($_POST[ $this->get_private('settings').'_test']['submit-test']) && $_POST[ $this->get_private('settings').'_test']['submit-test'] == 'Test Plugin')?true:false;
if( $submitted && isset($_POST['shortcode']) && $test ){
$short = str_replace('\"','"',$_POST['shortcode']);
}else{
$short = '';
}
?>
Plugin Loading Test
Create a shortcode using the Shortcode Generator and paste it into the box below. Then, click "Test Plugin" to use the tool.
The plugin will be loaded once directly from the Instagram feed and once from the cache (unless disabled).
This test shows the server-side loading times only and does not include delays from loading photos into a browser or running the JS/jQuery code
(It should be clear that loading from the cache is much faster).
';
echo 'Load from the Instagram feed ';
echo '';
echo do_shortcode($short_one);
echo '
';
echo 'Load from cache ';
echo '';
echo do_shortcode($short_two);
echo '
';
}
}
}
?>