253 lines
7.9 KiB
PHP
253 lines
7.9 KiB
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/>.
|
|
*/
|
|
|
|
class sidebar_generator {
|
|
|
|
function sidebar_generator(){
|
|
add_action('init',array('sidebar_generator','init'));
|
|
add_action('admin_menu',array('sidebar_generator','admin_menu'));
|
|
add_action('admin_print_scripts', array('sidebar_generator','admin_print_scripts'));
|
|
add_action('wp_ajax_add_sidebar', array('sidebar_generator','add_sidebar') );
|
|
add_action('wp_ajax_remove_sidebar', array('sidebar_generator','remove_sidebar') );
|
|
}
|
|
|
|
function init(){
|
|
//go through each sidebar and register it
|
|
$sidebars = sidebar_generator::get_sidebars();
|
|
|
|
|
|
if(is_array($sidebars)){
|
|
foreach($sidebars as $sidebar){
|
|
$sidebar_class = sidebar_generator::name_to_class($sidebar);
|
|
register_sidebar(array(
|
|
'name'=>$sidebar,
|
|
'before_widget' => '<aside class="widget '.$sidebar_class.'" id="%1$s">',
|
|
'after_widget' => '</aside>',
|
|
'before_title' => '<div class="widget-title-container"><h3 class="widget-title">',
|
|
'after_title' => '</h3></div>',
|
|
));
|
|
}
|
|
}
|
|
}
|
|
|
|
function admin_print_scripts(){
|
|
wp_print_scripts( array( 'sack' ));
|
|
?>
|
|
<script>
|
|
function add_sidebar( sidebar_name )
|
|
{
|
|
|
|
var mysack = new sack("<?php echo site_url(); ?>/wp-admin/admin-ajax.php" );
|
|
|
|
mysack.execute = 1;
|
|
mysack.method = 'POST';
|
|
mysack.setVar( "action", "add_sidebar" );
|
|
mysack.setVar( "sidebar_name", sidebar_name );
|
|
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 site_url(); ?>/wp-admin/admin-ajax.php" );
|
|
|
|
mysack.execute = 1;
|
|
mysack.method = 'POST';
|
|
mysack.setVar( "action", "remove_sidebar" );
|
|
mysack.setVar( "sidebar_name", sidebar_name );
|
|
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
|
|
}
|
|
|
|
function add_sidebar(){
|
|
$sidebars = sidebar_generator::get_sidebars();
|
|
$name = str_replace(array("\n","\r","\t"),'',$_POST['sidebar_name']);
|
|
$id = sidebar_generator::name_to_class($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('$name');
|
|
cellLeft.appendChild(textNode);
|
|
|
|
//middle cell
|
|
var cellLeft = row.insertCell(1);
|
|
var textNode = document.createTextNode('$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(\'$name\')');
|
|
removeLink.setAttribute('href', 'javacript:void(0)');
|
|
|
|
removeLink.appendChild(linkText);
|
|
cellLeft.appendChild(removeLink);
|
|
|
|
|
|
";
|
|
|
|
|
|
die( "$js");
|
|
}
|
|
|
|
function remove_sidebar(){
|
|
$sidebars = sidebar_generator::get_sidebars();
|
|
$name = str_replace(array("\n","\r","\t"),'',$_POST['sidebar_name']);
|
|
$id = sidebar_generator::name_to_class($name);
|
|
if(!isset($sidebars[$id])){
|
|
die("alert('Sidebar does not exist.')");
|
|
}
|
|
$row_number = $_POST['row_number'];
|
|
unset($sidebars[$id]);
|
|
sidebar_generator::update_sidebars($sidebars);
|
|
$js = "
|
|
var tbl = document.getElementById('sbg_table');
|
|
tbl.deleteRow($row_number)
|
|
|
|
";
|
|
die($js);
|
|
}
|
|
|
|
function admin_menu(){
|
|
add_theme_page('Sidebars', 'Sidebars', 'manage_options', 'multiple_sidebars', array('sidebar_generator','admin_page'));
|
|
}
|
|
|
|
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){
|
|
//alert('AJAX REMOVE');
|
|
remove_sidebar(name,num);
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
function add_sidebar_link(){
|
|
var sidebar_name = prompt("Sidebar Name:","");
|
|
//alert(sidebar_name);
|
|
add_sidebar(sidebar_name);
|
|
}
|
|
</script>
|
|
<div class="wrap">
|
|
<h2>Sidebar Generator</h2>
|
|
<p>
|
|
The sidebar name is for your use only. It will not be visible to any of your visitors.
|
|
A CSS class is assigned to each of your sidebar, use this styling to customize the sidebars.
|
|
</p>
|
|
<br />
|
|
<div class="add_sidebar">
|
|
<a href="javascript:void(0);" onclick="return add_sidebar_link()" title="Add a sidebar">+ Add Sidebar</a>
|
|
</div>
|
|
<br />
|
|
<table class="widefat page" id="sbg_table" style="width:600px;">
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>CSS class</th>
|
|
<th>Remove</th>
|
|
</tr>
|
|
<?php
|
|
$sidebars = sidebar_generator::get_sidebars();
|
|
//$sidebars = array('bob','john','mike','asdf');
|
|
if(is_array($sidebars) && !empty($sidebars)){
|
|
$cnt=0;
|
|
foreach($sidebars as $sidebar){
|
|
$alt = ($cnt%2 == 0 ? 'alternate' : '');
|
|
?>
|
|
<tr class="<?php echo $alt?>">
|
|
<td><?php echo $sidebar; ?></td>
|
|
<td><?php echo sidebar_generator::name_to_class($sidebar); ?></td>
|
|
<td><a href="javascript:void(0);" onclick="return remove_sidebar_link('<?php echo $sidebar; ?>',<?php echo $cnt+1; ?>);" title="Remove this sidebar">remove</a></td>
|
|
</tr>
|
|
<?php
|
|
$cnt++;
|
|
}
|
|
}else{
|
|
?>
|
|
<tr>
|
|
<td colspan="3">No Sidebars defined</td>
|
|
</tr>
|
|
<?php
|
|
}
|
|
?>
|
|
</table>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
|
|
/**
|
|
* replaces array of sidebar names
|
|
*/
|
|
function update_sidebars($sidebar_array){
|
|
$sidebars = update_option('sbg_sidebars',$sidebar_array);
|
|
}
|
|
|
|
/**
|
|
* gets the generated sidebars
|
|
*/
|
|
function get_sidebars(){
|
|
$sidebars = get_option('sbg_sidebars');
|
|
return $sidebars;
|
|
}
|
|
function name_to_class($name){
|
|
$class = str_replace(array(' ',',','.','"',"'",'/',"\\",'+','=',')','(','*','&','^','%','$','#','@','!','~','`','<','>','?','[',']','{','}','|',':',),'',$name);
|
|
return $class;
|
|
}
|
|
|
|
}
|
|
new sidebar_generator;
|
|
?>
|