/home/fdhrevqn/public_html/wp-content/themes/fox/inc/sidebar.php
<?php
/**
 * abstract: everything about sidebar
 * sidebar manager (add new, update, delete sidebars..)
 * sidebar mechanisms
 */

/* 
 * The sidebar class to settle all problems about sidebar
 * @since 4.0
 * ------------------------------------------------------------------ */
if ( ! class_exists( 'Fox_Sidebar' ) ) :
class Fox_Sidebar {

    /**
	 *
	 */
	public function __construct() {
	}
    
    /**
	 * The one instance of the class
	 *
	 * @since 4.0
	 */
	private static $instance;

	/**
	 * Instantiate or return the one class instance
	 *
	 * @since 4.0
	 *
	 * @return class
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}
    
    /**
     * Initiate the class
     * contains action & filters
     *
     * @since 4.0
     */
    public function init() {
        
        // ADMIN
        add_action( 'admin_menu', array( $this, 'admin_menu' ), 30 );
        add_filter( 'fox_metaboxes', array( $this, 'metaboxes' ) );
        add_filter( 'fox_term_metaboxes', array( $this, 'term_metaboxes' ) );
        
        // AJAX
        add_action( 'wp_ajax_fox_sidebar_ajax_action', array( $this, 'process_sidebar' ), 10 );
        
        // REGISTER WIDGETS accordingly
        add_action( 'widgets_init', array( $this, 'register_sidebars' ), 150 );
        add_action( 'wp_head', array( $this, 'replace_sidebar' ), 150 );
        
        // FRONTEND
        add_action( 'body_class', [ $this, 'body_class' ] ); // for everything but posts
        add_action( 'post_class', [ $this, 'post_class' ] ); // only for posts
        add_filter( 'fox_sidebar_state', [ $this, 'sidebar_state' ], 10 );
        
    }
    
    /**
     * Register the custom sidebars
     * @since 4.0
     */
    function register_sidebars() {
        
        $sidebars = $this->get_sidebars();
        if ( empty( $sidebars ) ) return;
        
        foreach( $sidebars as $slug => $sidebar_data ) {
            $name = isset( $sidebar_data[ 'name' ] ) ? $sidebar_data[ 'name' ] : '';
            if ( ! $name ) $name = $slug;
            
            register_sidebar(
                array(
                    'name'              => $name,
                    'id'                => $slug,
                    'before_widget' => '<div id="%1$s" class="widget %2$s">',
                    'after_widget'  => '</div>',
                    'before_title'  => '<h3 class="widget-title"><span>',
                    'after_title'   => '</span></h3>',
                )
            );
            
        }
    
    }
    
    function replace_sidebar() {
        
        global $_wp_sidebars_widgets;
        
        $positions = fox_sidebar_possition_support();
        
        // Make a clone
        $clone = $_wp_sidebars_widgets;
        
        if ( is_single() ) {
            
            foreach ( $positions as $id => $name ) {
                
                $custom_sidebar = get_post_meta( get_the_ID(), '_wi_sidebar_'. $id, true );
                if ( ! $custom_sidebar ) continue;
                
                // replace it
                if ( isset( $clone[ $custom_sidebar ] ) ) {
                    $_wp_sidebars_widgets[ $id ] = $clone[ $custom_sidebar ];
                }
                
            }
            
        } elseif ( is_page() ) {
        
            $page_positions = fox_sidebar_possition_support([ 'main' => [ 'page-sidebar' => 'Page Sidebar' ] ]);
            
            foreach ( $page_positions as $id => $name ) {
                
                $custom_sidebar = get_post_meta( get_the_ID(), '_wi_sidebar_'. $id, true );
                if ( ! $custom_sidebar ) continue;
                
                // replace it
                if ( isset( $clone[ $custom_sidebar ] ) ) {
                    $_wp_sidebars_widgets[ $id ] = $clone[ $custom_sidebar ];
                }
                
            }
        
        } elseif ( is_category() || is_tag() ) {
            
            $term_id = get_queried_object_id();
            
            foreach ( $positions as $id => $name ) {
                
                $custom_sidebar = get_term_meta( $term_id, '_wi_sidebar_'. $id, true );
                if ( ! $custom_sidebar ) continue;
                
                // replace it
                if ( isset( $clone[ $custom_sidebar ] ) ) {
                    $_wp_sidebars_widgets[ $id ] = $clone[ $custom_sidebar ];
                }
                
            }
        
        }
    
    }
    
    /**
     * Add a metabox field to post / page
     * @since 4.0
     */
    function metaboxes( $metaboxes ) {
        
        $all = $this->get_sidebars();
        $sidebars = [];
        foreach ( $all as $slug => $sidebar_data ) {
            
            $name = isset( $sidebar_data[ 'name' ] ) ? $sidebar_data[ 'name' ] : '';
            $sidebars[ $slug ] = $name;
            
        }
        
        $post_positions = fox_sidebar_possition_support();
        $page_positions = fox_sidebar_possition_support([ 'main' => [ 'page-sidebar' => 'Page Sidebar' ] ]);
        
        if ( isset( $metaboxes[ 'post-settings' ] ) ) {
            
            $fields = [];
            foreach ( $post_positions as $pos => $pos_name ) {

                $options = array_merge( [ '' => 'Default' ], $sidebars );

                $fields[] = [
                    'id' => 'sidebar_' . $pos,
                    'type' => 'select',
                    'options' => $options,
                    'std' => '',
                    'name' => 'Custom Sidebar for ' . $pos_name,
                    'tab' => 'sidebar_replacement',
                ];

            }
            
            $metaboxes[ 'post-settings' ][ 'tabs' ][ 'sidebar_replacement' ] = 'Sidebar Replacement';
            $metaboxes[ 'post-settings' ][ 'fields' ] = array_merge( $metaboxes[ 'post-settings' ][ 'fields' ], $fields );
            
        }
        
        if ( isset( $metaboxes[ 'page-settings' ] ) ) {
            
            $fields = [];
            foreach ( $page_positions as $pos => $pos_name ) {

                $options = array_merge( [ '' => 'Default' ], $sidebars );

                $fields[] = [
                    'id' => 'sidebar_' . $pos,
                    'type' => 'select',
                    'options' => $options,
                    'std' => '',
                    'name' => 'Custom Sidebar for ' . $pos_name,
                    'tab' => 'sidebar_replacement',
                ];

            }
            
            $metaboxes[ 'page-settings' ][ 'tabs' ][ 'sidebar_replacement' ] = 'Sidebar Replacement';
            $metaboxes[ 'page-settings' ][ 'fields' ] = array_merge( $metaboxes[ 'page-settings' ][ 'fields' ], $fields );
            
        }
        
        return $metaboxes;
        
    }
    
    /**
     * Term Metaboxes
     * For categories, tags etc
     * @since 4.0
     */
    function term_metaboxes( $metaboxes ) {
        
        $all = $this->get_sidebars();
        $sidebars = [];
        foreach ( $all as $slug => $sidebar_data ) {
            
            $name = isset( $sidebar_data[ 'name' ] ) ? $sidebar_data[ 'name' ] : '';
            $sidebars[ $slug ] = $name;
            
        }
        
        $positions = fox_sidebar_possition_support();
        
        $fields = [];
        
        foreach ( $positions as $pos => $pos_name ) {
            
            $options = array_merge( [ '' => 'Default' ], $sidebars );
            
            $fields[] = [
                'id' => 'sidebar_' . $pos,
                'type' => 'select',
                'options' => $options,
                'std' => '',
                'name' => $pos_name . ': ' ,
            ];
            
        }
        
        if ( isset( $metaboxes[ 'term-settings' ] ) ) {
            
            $metaboxes[ 'term-settings' ][ 'fields' ] = array_merge( $metaboxes[ 'term-settings' ][ 'fields' ], $fields );
            
        }
        
        return $metaboxes;
    
    }
    
    /**
     * add an admin menu
     * @since 4.0
     */
    function admin_menu() {
    
        // add admin page to Appearance
        $hook = add_submenu_page(
            'fox',
            'Sidebar Manager',
            'Sidebar Manager',
            'manage_options',
            'sidebar-manager',
            array( $this, 'create_admin_page')
        );
    
    }
    
    /**
     * Options page callback
     *
     * @since 1.0.0
     */
    public function create_admin_page() {
        
        // retrive the list of all sidebars
        // array[ 'id' => sidebar_data ]
        $sidebars = $this->get_sidebars();
        
        ?>

        <div class="wrap">
            
            <h1>Sidebar Manager</h1>
            
            <div class="instruction">
                
                <p style="font-size:1.3em">You can create additional sidebars here.</p>
            
            </div>
            
            <div class="fox-wrap">
                
                <div class="fox-wrapper" style="max-width:600px;">
                    
                    <form>
                        
                        <?php wp_nonce_field( 'fox-sidebar-processor-action','fox_ajax_processor_nonce' ); ?>
                        
                        <p>
                            
                            <label for="sidebar_name">
                                <span>Sidebar Name</span>
                                <input name="sidebar_name" type="text" size="18" id="sidebar_name" value="" placeholder="My Sidebar">
                            </label>
                            
                            <label for="sidebar_slug">
                                <span>Sidebar Slug</span>
                                <input name="sidebar_slug" type="text" size="18" id="sidebar_slug" value="" placeholder="my-sidebar">
                            </label>
                            
                            <button class="button button-primary fox-add-sidebar" data-type="add"><?php _e('+ Add sidebar', 'wi');?></button>
                            
                            <span class="spinner"></span>
                        </p>
                        
                        <table class="widefat" id="fox-table">
                            <tr>
                                <th>Name</th>
                                <th>Slug</th>
                                <th width="10%">Delete</th>
                            </tr>

                            <?php if( empty( $sidebars ) ) : ?>
                            
                            <tr class="no-sidebar-tr">
                                
                                <td colspan="3">No Custom Sidebars</td>    
                                
                            </tr>
                            
                            <?php else: ?>

                            <?php foreach ( ( array ) $sidebars as $slug => $sidebar_data ) : $name = isset( $sidebar_data[ 'name' ] ) ? $sidebar_data[ 'name' ] : $slug ?>
                            
                            <tr>
                                <td><?php echo esc_html( $name );?></td>
                                
                                <td><?php echo esc_html( $slug );?></td>
                                
                                <td><button class="button button-small fox-remove-sidebar" data-type="remove" data-name="<?php echo esc_attr( $name ); ?>" data-slug="<?php echo esc_attr( $slug );?>">Delete</button></td>
                            </tr>
                            
                            <?php endforeach;
        
                            endif; // empty_sidebar ?>
                            
                        </table>
                        
                        <p class="fox-notice"></p>
                        
                    </form>
                    
                </div>
                
            </div>
            
        </div><!-- .wrap -->

        <?php
    }
    
    /**
     * Get All Sidebars
     * return array of all sidebars
     * @since 4.0
     */
    function get_sidebars() {
        
        // $sidebars = get_option( 'fox_sidebars' );
        $sidebars = get_theme_mod( 'fox_sidebars' );
        
        if ( empty( $sidebars ) ) return [];
        else return $sidebars;
        
    }
    
    /**
     * Update action
     * @since 4.0
     */
    function update_sidebars( $sidebars ) {
        
        // $update = update_option( 'fox_sidebars', $sidebars );
        $update = set_theme_mod( 'fox_sidebars', $sidebars );
        
        $sidebars_widgets = get_option( 'sidebars_widgets' );
        
        foreach ( $sidebars as $slug => $sidebar_data ) {
            
            if ( ! isset( $sidebars_widgets[ $slug ] ) ) {
                $sidebars_widgets[ $slug ] = [];
            }
            
        }
        
        update_option( 'sidebars_widgets', $sidebars_widgets );
    
    }
    
    /**
     * Check if this sidebar exists or not
     * @since 4.0
     */
    function has_sidebar( $slug ) {
        
        $sidebars = $this->get_sidebars();
        return isset( $sidebars[ $slug ] );
        
    }
    
    /**
     * add a sidebar based on its data
     * @since 4.0
     */
    function add_sidebar( $args = [] ) {
        
        extract( wp_parse_args( $args, [
            'slug' => '',
            'name' => '',
        ] ) );
        
        $sidebars = $this->get_sidebars();
        $sidebars[ $slug ] = [
            'slug' => $slug,
            'name' => $name,
        ];
        
        $this->update_sidebars( $sidebars );
        
    }
    
    /**
     * Add/Remove sidebar in action
     * @since 4.0
     */
    public function process_sidebar() {
        
        if( empty( $_POST['nonce'] )) die('-1'); 

        $nonce = $_POST['nonce'];

        $action = 'fox-sidebar-processor-action';
        
        /**
         * Check sercurity
         */
        $adminurl = strtolower( admin_url() );
        $referer = strtolower( wp_get_referer() );
        check_admin_referer( $action, 'nonce' );

        $name = isset( $_POST['name'] ) ? $_POST['name'] : '';
        $slug = isset( $_POST['slug'] ) ? $_POST['slug'] : '';
        
        $action_type = !empty( $_POST['type'] ) ? $_POST['type'] : '';

        if( ! in_array( $action_type, array( 'add', 'remove' ) ) )
            die( '-1' );
        
        // when both name and slug is empty
        if ( empty( $name ) && empty( $slug ) )
            die( '-1' );
        
        $return = array(
            'success' => true,
        );
        
        $sidebars = $this->get_sidebars();
        
        /**
         * Add New Sidebar
         */
        if ( 'add' == $action_type ) {
            
            $sidebar_name = $name;
            $sidebar_slug = $slug;
            
            // get slug from name
            if ( empty( $slug ) ) {
                
                $sidebar_slug = $sidebar_name;
            
            // get name from slug    
            } elseif ( empty( $name ) ) {
                
                $sidebar_name = $sidebar_slug;
                
            }
            
            $sidebar_slug = sanitize_title( $sidebar_slug );
            
            $return['data'] = array(
                
                'message'   => 'Sidebar Added Successfully!',
                'type'      => $action_type,
                'slug'      => $sidebar_slug,
                'name'      => $sidebar_name,
                
            );

            if( isset( $sidebars[ $sidebar_slug ] ) ) {
                
                $return[ 'success' ] = false;
                $return[ 'data' ][ 'message' ] = 'Sidebar already exists, please use a different name.';
                
            } else {

                $sidebars[ $sidebar_slug ] = [
                    'name' => $sidebar_name,
                    'slug' => $sidebar_slug,
                ];
                
                $this->update_sidebars( $sidebars );

            }
          
        // remove    
        } else {
            
            if ( isset( $sidebars[ $slug ] ) ) {
                
                if ( ! $name ) $name = $slug;
                
                $return['data'] = array(
                    'message'   => 'Sidebar "' . $name . '" has been removed.',
                    'type'      => $action_type,
                );
                
                unset( $sidebars[ $slug ] );
                $this->update_sidebars( $sidebars );
            
            } else {
                
                $return[ 'success' ] = false;
                $return['data'] = array(
                    'message'   => 'Sidebar doesn\'t exists',
                    'type'      => $action_type,
                );
            }


        }

        wp_send_json( $return );

    }
    
    /**
     * The filter to return sidebar state
     * @since 4.0
     */
    function sidebar_state( $state ) {
        
        if ( is_home() ) {

            $state = get_theme_mod( 'wi_home_sidebar_state', 'sidebar-right' );

        } elseif ( is_category() || is_tag() ) {

            $obj_id = get_queried_object_id();
            $state = get_term_meta( $obj_id, '_wi_sidebar_state', true );

            // legacy attemp
            if ( ! $state ) {
                $state = get_theme_mod( "taxonomy_{$obj_id}" );
            }

            if ( ! $state ) {

                if ( is_category() ) {

                    $state = get_theme_mod( 'wi_category_sidebar_state', 'sidebar-right' );

                } else {

                    $state = get_theme_mod( 'wi_tag_sidebar_state', 'sidebar-right' );

                }

            }

        } elseif ( is_search() ) {

            $state = get_theme_mod( 'wi_search_sidebar_state', 'sidebar-right' );

        } elseif ( is_author() ) {

            $state = get_theme_mod( 'wi_author_sidebar_state', 'sidebar-right' );

        } elseif ( is_archive() ) {

            $state = get_theme_mod( 'wi_archive_sidebar_state', 'sidebar-right' );

        } elseif ( is_singular() ) {

            // legacy
            if ( is_page_template( 'page-fullwidth.php' ) || is_page_template( 'page-one-column.php' ) ) {

                $state = 'no-sidebar';

            } else {

                $state = get_post_meta( get_the_ID(), '_wi_sidebar_state', true );
                
                // legacy, old meta key _wi_sidebar_layout
                if ( ! $state ) {
                    $state = get_post_meta( get_the_ID(), '_wi_sidebar_layout', true );
                }

                if ( ! $state ) {

                    if ( is_page() ) {

                        $state = get_theme_mod( 'wi_page_sidebar_state', 'sidebar-right' );

                    } else {

                        $state = get_theme_mod( 'wi_single_sidebar_state', 'sidebar-right' );

                    }

                }

            }

        }
        
        return $state;
    
    }
    
    /**
     * add appropriate class into body
     * @since 4.0
     */
    function body_class( $classes ) {

        if ( ! is_single() ) {
            
            $state = fox_sidebar_state();

            if ( 'sidebar-left' == $state ) {

                $classes[] = 'has-sidebar sidebar-left';

            } elseif ( 'sidebar-right' == $state ) {

                $classes[] = 'has-sidebar sidebar-right';

            } else {

                $classes[] = 'no-sidebar';

            }
            
        }

        return $classes;

    }
    
    /**
     * add appropriate class into post
     * @since 4.0
     */
    function post_class( $classes ) {

        if ( is_single() ) {
            
            $state = fox_sidebar_state();

            if ( 'sidebar-left' == $state ) {

                $classes[] = 'has-sidebar sidebar-left';

            } elseif ( 'sidebar-right' == $state ) {

                $classes[] = 'has-sidebar sidebar-right';

            } else {

                $classes[] = 'no-sidebar';

            }
            
        }

        return $classes;

    }

}

$new_fox_sidebar = new Fox_Sidebar();
$new_fox_sidebar->init();

endif;

/*
 * Sidebar State
 * @since 4.0
 * return 'sidebar-left' / 'sidebar-right' or 'no-sidebar'
 * ------------------------------------------------------------------ */
if ( ! function_exists( 'fox_sidebar_state' ) ) :
function fox_sidebar_state() {
    
    $state = apply_filters( 'fox_sidebar_state', 'no-sidebar' );
    
    // final check by logic
    if ( 'sidebar-left' != $state && 'sidebar-right' != $state ) $state = 'no-sidebar';
    
    return $state;
    
}
endif;

/*
 * Displays sidebar if sidebar_state returns true
 * @since 4.0
 * ------------------------------------------------------------------ */
if ( ! function_exists( 'fox_sidebar' ) ) :
function fox_sidebar( $sidebar = 'sidebar' ) {

    if ( 'no-sidebar' != fox_sidebar_state() ) get_sidebar( $sidebar );
    
}
endif;

/*
 * Sidebar positions that theme supports
 * ------------------------------------------------------------------ */
function fox_sidebar_possition_support( $args = [] ) {
    
    $positions = isset( $args[ 'main' ] ) ? $args[ 'main' ] : [ 'sidebar' => 'Main Sidebar' ];
    
    $positions = array_merge( $positions, [
        
        'before-header' => 'Before Header',
        'header' => 'After Logo',
        'after-header' => 'After Header',
        'footer-1' => 'Footer Sidebar 1',
        'footer-2' => 'Footer Sidebar 2',
        'footer-3' => 'Footer Sidebar 3',
        'footer-4' => 'Footer Sidebar 4',

        /*
         * deprecated since 4.3
         *
        'footer-bottom-stack' => 'Footer Bottom Stack',
        'footer-bottom-left' => 'Footer Bottom Left',
        'footer-bottom-right' => 'Footer Bottom Right',
        
        'header-builder' => 'MAIN HEADER BUILDER',
        */
        
    ] );
    
    return $positions;
    
}