Current File : /home/aventura/www/site/wp-content/themes/kleo/kleo-framework/lib/class-multiple-sidebars.php |
<?php
/*
Plugin Name: Sidebar Generator
Plugin URI: http://www.getson.info
Description: This plugin generates as many sidebars as you need. Then allows you to place them on any page you wish. Version 1.1 now supports themes with multiple sidebars.
Version: 1.1.0
Author: Kyle Getson
Author URI: http://www.kylegetson.com
Copyright (C) 2009 Kyle Robert Getson
*/
/*
Copyright (C) 2009 Kyle Robert Getson, kylegetson.com and getson.info
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
if ( ! class_exists( 'sidebar_generator' ) ) {
class sidebar_generator {
public function __construct() {
add_action( 'init', array( $this, 'init' ) );
add_action( 'admin_menu', array( 'sidebar_generator', 'admin_menu' ) );
add_action( 'admin_print_scripts', array( 'sidebar_generator', 'admin_print_scripts' ) );
//edit posts/pages
add_action( 'edit_form_advanced', array( 'sidebar_generator', 'edit_form' ) );
add_action( 'edit_page_form', array( 'sidebar_generator', 'edit_form' ) );
//save posts/pages
add_action( 'edit_post', array( 'sidebar_generator', 'save_form' ) );
add_action( 'publish_post', array( 'sidebar_generator', 'save_form' ) );
add_action( 'save_post', array( 'sidebar_generator', 'save_form' ) );
add_action( 'edit_page_form', array( 'sidebar_generator', 'save_form' ) );
}
public static function init() {
// Register AJAX hooks
if ( current_user_can( 'manage_options' ) ) {
add_action( 'wp_ajax_add_sidebar', array( 'sidebar_generator', 'add_sidebar' ) );
add_action( 'wp_ajax_remove_sidebar', array( 'sidebar_generator', 'remove_sidebar' ) );
}
//go through each sidebar and register it
$sidebars = sidebar_generator::get_sidebars();
global $wp_registered_sidebars;
if ( is_array( $sidebars ) ) {
foreach ( $sidebars as $sidebar ) {
$sidebar_class = sidebar_generator::name_to_class( $sidebar );
$i = count( $wp_registered_sidebars ) + 1;
register_sidebar( array(
'name' => $sidebar,
'id' => 'sidebar-' . $i,
'before_widget' => '<div id="%1$s" class="widget clearfix %2$s">',
'after_widget' => '</div>',
'before_title' => apply_filters( 'sq_ms_before_title', '<h4>' ),
'after_title' => apply_filters( 'sq_ms_after_title', '</h4>' ),
) );
}
}
}
public static function admin_print_scripts() {
wp_print_scripts( array( 'sack' ) );
?>
<script>
function add_sidebar(sidebar_name) {
var mysack = new sack("<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>");
mysack.execute = 1;
mysack.method = 'POST';
mysack.setVar("action", "add_sidebar");
mysack.setVar("sidebar_name", sidebar_name);
mysack.setVar("sidebar_generator_nonce", "<?php echo wp_create_nonce( 'add_sidebar' )?>");
mysack.encVar("cookie", document.cookie, false);
mysack.onError = function () {
alert('Ajax error. Cannot add sidebar')
};
mysack.runAJAX();
return true;
}
function remove_sidebar(sidebar_name, num) {
var mysack = new sack("<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>");
mysack.execute = 1;
mysack.method = 'POST';
mysack.setVar("action", "remove_sidebar");
mysack.setVar("sidebar_name", sidebar_name);
mysack.setVar("sidebar_generator_nonce", "<?php echo wp_create_nonce( 'remove_sidebar' )?>");
mysack.setVar("row_number", num);
mysack.encVar("cookie", document.cookie, false);
mysack.onError = function () {
alert('Ajax error. Cannot add sidebar')
};
mysack.runAJAX();
//alert('hi!:::'+sidebar_name);
return true;
}
</script>
<?php
}
public static function add_sidebar() {
check_admin_referer( 'add_sidebar', 'sidebar_generator_nonce' );
$sidebars = sidebar_generator::get_sidebars();
$name = str_replace( array( "\n", "\r", "\t" ), '', $_POST['sidebar_name'] );
//$id = sidebar_generator::name_to_class( $name );
$id = sanitize_title( $name );
if ( isset( $sidebars[ $id ] ) ) {
die( "alert('Sidebar already exists, please use a different name.')" );
}
$sidebars[ $id ] = $name;
sidebar_generator::update_sidebars( $sidebars );
$js = "
var tbl = document.getElementById('sbg_table');
var lastRow = tbl.rows.length;
// if there's no header row in the table, then iteration = lastRow + 1
var iteration = lastRow;
var row = tbl.insertRow(lastRow);
// left cell
var cellLeft = row.insertCell(0);
var textNode = document.createTextNode('" . esc_js( $name ) . "');
cellLeft.appendChild(textNode);
//middle cell
var cellLeft = row.insertCell(1);
var textNode = document.createTextNode('" . esc_js( $id ) . "');
cellLeft.appendChild(textNode);
//var cellLeft = row.insertCell(2);
//var textNode = document.createTextNode('[<a href=\'javascript:void(0);\' onclick=\'return remove_sidebar_link($name);\'>Remove</a>]');
//cellLeft.appendChild(textNode)
var cellLeft = row.insertCell(2);
removeLink = document.createElement('a');
linkText = document.createTextNode('remove');
removeLink.setAttribute('onclick', 'remove_sidebar_link(\'" . esc_js( $name ) . "\')');
removeLink.setAttribute('href', '#');
removeLink.appendChild(linkText);
cellLeft.appendChild(removeLink);
";
die( "$js" );
}
public static function remove_sidebar() {
check_admin_referer( 'remove_sidebar', 'sidebar_generator_nonce' );
$sidebars = sidebar_generator::get_sidebars();
$name = str_replace( array( "\n", "\r", "\t" ), '', $_POST['sidebar_name'] );
$id = sanitize_title( $name );
if ( ! isset( $sidebars[ $id ] ) ) {
$id = sidebar_generator::name_to_class( $name );
if ( ! isset( $sidebars[ $id ] ) ) {
die( "alert('Sidebar does not exist.')" );
}
}
$row_number = (int) $_POST['row_number'];
unset( $sidebars[ $id ] );
sidebar_generator::update_sidebars( $sidebars );
$js = "var tbl = document.getElementById('sbg_table');tbl.deleteRow($row_number)";
die( $js );
}
public static function admin_menu() {
add_theme_page( 'Sidebars', 'Sidebars', 'manage_options', 'multiple_sidebars', array(
'sidebar_generator',
'admin_page',
) );
}
public static function admin_page() {
?>
<script>
function remove_sidebar_link(name, num) {
answer = confirm("Are you sure you want to remove " + name + "?\nThis will remove any widgets you have assigned to this sidebar.");
if (answer) {
remove_sidebar(name, num);
} else {
return false;
}
}
function add_sidebar_link() {
var sidebar_name = prompt("Sidebar Name:", "");
add_sidebar(sidebar_name);
}
</script>
<div class="wrap">
<h2>Sidebars</h2>
<br/>
<table class="widefat page" id="sbg_table" style="width:600px;">
<tr>
<th>Sidebar Name</th>
<th>CSS class</th>
<th>Remove</th>
</tr>
<?php
$sidebars = self::get_sidebars();
if ( is_array( $sidebars ) && ! empty( $sidebars ) ) {
$cnt = 0;
foreach ( $sidebars as $sidebar ) {
$alt = ( 0 == $cnt % 2 ? 'alternate' : '' );
?>
<tr class="<?php echo esc_attr( $alt ) ?>">
<td><?php echo esc_html( $sidebar ); ?></td>
<td><?php echo sanitize_title( $sidebar ); ?></td>
<td><a href="javascript:void(0);"
onclick="return remove_sidebar_link('<?php echo esc_attr( $sidebar ); ?>',<?php echo (int) ( $cnt + 1 ); ?>);"
title="Remove this sidebar">remove</a></td>
</tr>
<?php
$cnt ++;
}
} else {
?>
<tr>
<td colspan="3">No Sidebars defined</td>
</tr>
<?php
}
?>
</table>
<br/><br/>
<div class="add_sidebar">
<a href="javascript:void(0);" onclick="return add_sidebar_link()" title="Add a sidebar"
class="button-primary">+ Add New Sidebar</a>
</div>
</div>
<?php
}
/**
* for saving the pages/post
* @param integer $post_id
* @return void
*/
public static function save_form( $post_id ) {
if ( isset( $_POST['sbg_edit'] ) && ! empty( $_POST['sbg_edit'] ) ) {
delete_post_meta( $post_id, 'sbg_selected_sidebar' );
delete_post_meta( $post_id, 'sbg_selected_sidebar_replacement' );
add_post_meta( $post_id, 'sbg_selected_sidebar', $_POST['sidebar_generator'] );
add_post_meta( $post_id, 'sbg_selected_sidebar_replacement', $_POST['sidebar_generator_replacement'] );
}
}
public static function edit_form() {
global $post;
$post_id = $post;
if ( is_object( $post_id ) ) {
$post_id = $post_id->ID;
}
$selected_sidebar = get_post_meta( $post_id, 'sbg_selected_sidebar', true );
if ( ! is_array( $selected_sidebar ) ) {
$tmp = $selected_sidebar;
$selected_sidebar = array();
$selected_sidebar[0] = $tmp;
}
$selected_sidebar_replacement = get_post_meta( $post_id, 'sbg_selected_sidebar_replacement', true );
if ( ! is_array( $selected_sidebar_replacement ) ) {
$tmp = $selected_sidebar_replacement;
$selected_sidebar_replacement = array();
$selected_sidebar_replacement[0] = $tmp;
}
?>
<div id='sbg-sortables' class='meta-box-sortables'>
<div id="sbg_box" class="postbox ">
<div class="handlediv" title="Click to toggle"><br/></div>
<h3 class='hndle'><span>Sidebar</span></h3>
<div class="inside">
<div class="sbg_container">
<input name="sbg_edit" type="hidden" value="sbg_edit"/>
<p>Please select the sidebar you would like to display on this page. <strong>Note:</strong>
You must first create the sidebar under Appearance > Sidebars.
</p>
<ul>
<?php
global $wp_registered_sidebars;
for ( $i = 0; $i < 1; $i ++ ) { ?>
<li>
<select name="sidebar_generator[<?php echo $i ?>]" style="display: none;">
<option value="0"<?php if ( $selected_sidebar[ $i ] == '' ) {
echo " selected";
} ?>>WP Default Sidebar
</option>
<?php
$sidebars = $wp_registered_sidebars;// sidebar_generator::get_sidebars();
if ( is_array( $sidebars ) && ! empty( $sidebars ) ) {
foreach ( $sidebars as $sidebar ) {
if ( $selected_sidebar[ $i ] == $sidebar['name'] ) {
echo "<option value='" . esc_attr( $sidebar['name'] ) . "' selected>" . esc_html( $sidebar['name'] ) . "</option>\n";
} else {
echo "<option value='" . esc_attr( $sidebar['name'] ) . "'>" . esc_html( $sidebar['name'] ) . "</option>\n";
}
}
}
?>
</select>
<select name="sidebar_generator_replacement[<?php echo $i ?>]">
<option value="0"<?php if ( '' == $selected_sidebar_replacement[ $i ] ) {
echo ' selected';
} ?>>None
</option>
<?php
$sidebar_replacements = $wp_registered_sidebars;//sidebar_generator::get_sidebars();
if ( is_array( $sidebar_replacements ) && ! empty( $sidebar_replacements ) ) {
foreach ( $sidebar_replacements as $sidebar ) {
if ( $selected_sidebar_replacement[ $i ] == $sidebar['name'] ) {
echo "<option value='{$sidebar['name']}' selected>{$sidebar['name']}</option>\n";
} else {
echo "<option value='{$sidebar['name']}'>{$sidebar['name']}</option>\n";
}
}
}
?>
</select>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php
}
/**
* called by the action get_sidebar. this is what places this into the theme
* @param string $name
*/
public static function get_sidebar( $name = '0' ) {
if ( ! ( is_singular() || is_home() ) ) {
if ( '0' != $name ) {
dynamic_sidebar( $name );
} else {
dynamic_sidebar();
}
return;//do not do anything
}
global $wp_query;
$post = $wp_query->get_queried_object();
/*if ( ! $post ) {
dynamic_sidebar();
return;
}*/
if ( ! is_object( $post ) ) {
if ( function_exists( 'kleo_bp_get_page_id' ) && bp_is_blog_page() && kleo_bp_get_page_id() ) {
$post_id = kleo_bp_get_page_id();
} elseif( is_home() && get_option( 'page_for_posts' ) ) {
$post_id = get_option( 'page_for_posts' );
} else {
if ( '0' != $name ) {
dynamic_sidebar( $name );
} else {
dynamic_sidebar();
}
return;
}
} else {
$post_id = $post->ID;
}
$selected_sidebar = get_post_meta( $post_id, 'sbg_selected_sidebar', true );
$selected_sidebar_replacement = get_post_meta( $post_id, 'sbg_selected_sidebar_replacement', true );
$did_sidebar = false;
//this page uses a generated sidebar
if ( ! empty( $selected_sidebar_replacement ) && ( isset( $selected_sidebar_replacement ) && '0' !== $selected_sidebar_replacement[0] ) ) {
if ( function_exists( 'is_woocommerce' ) ) {
if ( is_woocommerce() ) {
$shop_sidebar = 'shop-1';
if ( $name == $shop_sidebar ) {
$selected_sidebar = array( $shop_sidebar );
}
}
}
}
if ( '' != $selected_sidebar && '0' != $selected_sidebar ) {
echo '';
if ( is_array( $selected_sidebar ) && ! empty( $selected_sidebar ) ) {
for ( $i = 0; $i < sizeof( $selected_sidebar ); $i ++ ) {
if ( '0' == $name && '0' == $selected_sidebar[ $i ] && '0' == $selected_sidebar_replacement[ $i ] ) {
//echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
dynamic_sidebar();//default behavior
$did_sidebar = true;
break;
} elseif ( '0' == $name && '0' == $selected_sidebar[ $i ] ) {
//we are replacing the default sidebar with something
//echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
dynamic_sidebar( $selected_sidebar_replacement[ $i ] );//default behavior
$did_sidebar = true;
break;
} elseif ( $selected_sidebar[ $i ] == $name ) {
//we are replacing this $name
//echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
$did_sidebar = true;
dynamic_sidebar( $selected_sidebar_replacement[ $i ] );//default behavior
break;
}
//echo "<!-- called=$name selected={$selected_sidebar[$i]} replacement={$selected_sidebar_replacement[$i]} -->\n";
}
}
if ( true == $did_sidebar ) {
echo '';
return;
}
//go through without finding any replacements, lets just send them what they asked for
if ( '0' != $name ) {
dynamic_sidebar( $name );
} else {
dynamic_sidebar();
}
echo '';
return;
} else {
if ( '0' != $name ) {
dynamic_sidebar( $name );
} else {
dynamic_sidebar();
}
}
}
/**
* replaces array of sidebar names
*/
public static function update_sidebars( $sidebar_array ) {
$sidebars = update_option( 'sbg_sidebars', $sidebar_array );
}
/**
* gets the generated sidebars
*/
public static function get_sidebars() {
$sidebars = get_option( 'sbg_sidebars' );
return $sidebars;
}
public static function name_to_class( $name ) {
$class = str_replace( array(
' ',
',',
'.',
'"',
"'",
'/',
"\\",
'+',
'=',
')',
'(',
'*',
'&',
'^',
'%',
'$',
'#',
'@',
'!',
'~',
'`',
'<',
'>',
'?',
'[',
']',
'{',
'}',
'|',
':',
), '', $name );
return $class;
}
}
}
$sbg = new sidebar_generator;
function generated_dynamic_sidebar( $name = '0' ) {
sidebar_generator::get_sidebar( $name );
return true;
}