· 8 years ago · Dec 29, 2017, 10:38 PM
1function admin_menu(){
2 add_submenu_page('themes.php', 'Sidebars', 'Sidebars', 'manage_options', __FILE__, array('sidebar_generator','admin_page'));
3}
4
5<?php
6/*
7Plugin Name: Sidebar Generator
8Plugin URI: http://www.getson.info
9Description: 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.
10Version: 1.1.0
11Author: Kyle Getson
12Author URI: http://www.kylegetson.com
13Copyright (C) 2009 Kyle Robert Getson
14*/
15
16/*
17Copyright (C) 2009 Kyle Robert Getson, kylegetson.com and getson.info
18
19This program is free software; you can redistribute it and/or modify
20it under the terms of the GNU General Public License as published by
21the Free Software Foundation; either version 3 of the License, or
22(at your option) any later version.
23
24This program is distributed in the hope that it will be useful,
25but WITHOUT ANY WARRANTY; without even the implied warranty of
26MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27GNU General Public License for more details.
28
29You should have received a copy of the GNU General Public License
30along with this program. If not, see <http://www.gnu.org/licenses/>.
31*/
32
33class sidebar_generator {
34
35 function sidebar_generator(){
36 add_action('init',array('sidebar_generator','init'));
37 add_action('admin_menu',array('sidebar_generator','admin_menu'));
38 add_action('admin_print_scripts', array('sidebar_generator','admin_print_scripts'));
39 add_action('wp_ajax_add_sidebar', array('sidebar_generator','add_sidebar') );
40 add_action('wp_ajax_remove_sidebar', array('sidebar_generator','remove_sidebar') );
41
42 //edit posts/pages
43 add_action('edit_form_advanced', array('sidebar_generator', 'edit_form'));
44 add_action('edit_page_form', array('sidebar_generator', 'edit_form'));
45
46 //save posts/pages
47 add_action('edit_post', array('sidebar_generator', 'save_form'));
48 add_action('publish_post', array('sidebar_generator', 'save_form'));
49 add_action('save_post', array('sidebar_generator', 'save_form'));
50 add_action('edit_page_form', array('sidebar_generator', 'save_form'));
51
52 }
53
54 function init(){
55 //go through each sidebar and register it
56 $sidebars = sidebar_generator::get_sidebars();
57
58
59 if(is_array($sidebars)){
60 foreach($sidebars as $sidebar){
61 $sidebar_class = sidebar_generator::name_to_class($sidebar);
62 register_sidebar(array(
63 'name'=>$sidebar,
64 'before_widget' => '<li id="%1$s" class="widget sbg_widget '.$sidebar_class.' %2$s">',
65 'after_widget' => '</li>',
66 'before_title' => '<h2 class="widgettitle sbg_title">',
67 'after_title' => '</h2>',
68 ));
69 }
70 }
71 }
72
73 function admin_print_scripts(){
74 wp_print_scripts( array( 'sack' ));
75 ?>
76 <script>
77 function add_sidebar( sidebar_name )
78 {
79
80 var mysack = new sack("<?php bloginfo( 'wpurl' ); ?>/wp-admin/admin-ajax.php" );
81
82 mysack.execute = 1;
83 mysack.method = 'POST';
84 mysack.setVar( "action", "add_sidebar" );
85 mysack.setVar( "sidebar_name", sidebar_name );
86 mysack.encVar( "cookie", document.cookie, false );
87 mysack.onError = function() { alert('Ajax error. Cannot add sidebar' )};
88 mysack.runAJAX();
89 return true;
90 }
91
92 function remove_sidebar( sidebar_name,num )
93 {
94
95 var mysack = new sack("<?php bloginfo( 'wpurl' ); ?>/wp-admin/admin-ajax.php" );
96
97 mysack.execute = 1;
98 mysack.method = 'POST';
99 mysack.setVar( "action", "remove_sidebar" );
100 mysack.setVar( "sidebar_name", sidebar_name );
101 mysack.setVar( "row_number", num );
102 mysack.encVar( "cookie", document.cookie, false );
103 mysack.onError = function() { alert('Ajax error. Cannot add sidebar' )};
104 mysack.runAJAX();
105 //alert('hi!:::'+sidebar_name);
106 return true;
107 }
108 </script>
109 <?php
110 }
111
112 function add_sidebar(){
113 $sidebars = sidebar_generator::get_sidebars();
114 $name = str_replace(array("n","r","t"),'',$_POST['sidebar_name']);
115 $id = sidebar_generator::name_to_class($name);
116 if(isset($sidebars[$id])){
117 die("alert('Sidebar already exists, please use a different name.')");
118 }
119
120 $sidebars[$id] = $name;
121 sidebar_generator::update_sidebars($sidebars);
122
123 $js = "
124 var tbl = document.getElementById('sbg_table');
125 var lastRow = tbl.rows.length;
126 // if there's no header row in the table, then iteration = lastRow + 1
127 var iteration = lastRow;
128 var row = tbl.insertRow(lastRow);
129
130 // left cell
131 var cellLeft = row.insertCell(0);
132 var textNode = document.createTextNode('$name');
133 cellLeft.appendChild(textNode);
134
135 //middle cell
136 var cellLeft = row.insertCell(1);
137 var textNode = document.createTextNode('$id');
138 cellLeft.appendChild(textNode);
139
140 //var cellLeft = row.insertCell(2);
141 //var textNode = document.createTextNode('[<a href='javascript:void(0);' onclick='return remove_sidebar_link($name);'>Remove</a>]');
142 //cellLeft.appendChild(textNode)
143
144 var cellLeft = row.insertCell(2);
145 removeLink = document.createElement('a');
146 linkText = document.createTextNode('remove');
147 removeLink.setAttribute('onclick', 'remove_sidebar_link('$name')');
148 removeLink.setAttribute('href', 'javacript:void(0)');
149
150 removeLink.appendChild(linkText);
151 cellLeft.appendChild(removeLink);
152
153
154 ";
155
156
157 die( "$js");
158 }
159
160 function remove_sidebar(){
161 $sidebars = sidebar_generator::get_sidebars();
162 $name = str_replace(array("n","r","t"),'',$_POST['sidebar_name']);
163 $id = sidebar_generator::name_to_class($name);
164 if(!isset($sidebars[$id])){
165 die("alert('Sidebar does not exist.')");
166 }
167 $row_number = $_POST['row_number'];
168 unset($sidebars[$id]);
169 sidebar_generator::update_sidebars($sidebars);
170 $js = "
171 var tbl = document.getElementById('sbg_table');
172 tbl.deleteRow($row_number)
173
174 ";
175 die($js);
176 }
177
178 function admin_menu(){
179 add_submenu_page('themes.php', 'Sidebars', 'Sidebars', 'manage_options', __FILE__, array('sidebar_generator','admin_page'));
180 }
181
182 function admin_page(){
183 ?>
184 <script>
185 function remove_sidebar_link(name,num){
186 answer = confirm("Are you sure you want to remove " + name + "?nThis will remove any widgets you have assigned to this sidebar.");
187 if(answer){
188 //alert('AJAX REMOVE');
189 remove_sidebar(name,num);
190 }else{
191 return false;
192 }
193 }
194 function add_sidebar_link(){
195 var sidebar_name = prompt("Sidebar Name:","");
196 //alert(sidebar_name);
197 add_sidebar(sidebar_name);
198 }
199 </script>
200 <div class="wrap">
201 <h2>Sidebar Generator</h2>
202 <p>
203 The sidebar name is for your use only. It will not be visible to any of your visitors.
204 A CSS class is assigned to each of your sidebar, use this styling to customize the sidebars.
205 </p>
206 <br />
207 <div class="add_sidebar">
208 <a href="javascript:void(0);" onclick="return add_sidebar_link()" title="Add a sidebar">+ Add Sidebar</a>
209 </div>
210 <br />
211 <table class="widefat page" id="sbg_table" style="width:600px;">
212 <tr>
213 <th>Name</th>
214 <th>CSS class</th>
215 <th>Remove</th>
216 </tr>
217 <?php
218 $sidebars = sidebar_generator::get_sidebars();
219 //$sidebars = array('bob','john','mike','asdf');
220 if(is_array($sidebars) && !empty($sidebars)){
221 $cnt=0;
222 foreach($sidebars as $sidebar){
223 $alt = ($cnt%2 == 0 ? 'alternate' : '');
224 ?>
225 <tr class="<?php echo $alt?>">
226 <td><?php echo $sidebar; ?></td>
227 <td><?php echo sidebar_generator::name_to_class($sidebar); ?></td>
228 <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>
229 </tr>
230 <?php
231 $cnt++;
232 }
233 }else{
234 ?>
235 <tr>
236 <td colspan="3">No Sidebars defined</td>
237 </tr>
238 <?php
239 }
240 ?>
241 </table>
242 <br /><br />
243 <div class="donate">
244 <h5>Donate</h5>
245 <p>
246 Support the further development of this plugin.
247 </p>
248 <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
249 <input type="hidden" name="cmd" value="_s-xclick">
250 <input type="hidden" name="hosted_button_id" value="9271055">
251 <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
252 <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
253 </form>
254
255 </div>
256 </div>
257 <?php
258 }
259
260 /**
261 * for saving the pages/post
262 */
263 function save_form($post_id){
264 $is_saving = $_POST['sbg_edit'];
265 if(!empty($is_saving)){
266 delete_post_meta($post_id, 'sbg_selected_sidebar');
267 delete_post_meta($post_id, 'sbg_selected_sidebar_replacement');
268 add_post_meta($post_id, 'sbg_selected_sidebar', $_POST['sidebar_generator']);
269 add_post_meta($post_id, 'sbg_selected_sidebar_replacement', $_POST['sidebar_generator_replacement']);
270 }
271 }
272
273 function edit_form(){
274 global $post;
275 $post_id = $post;
276 if (is_object($post_id)) {
277 $post_id = $post_id->ID;
278 }
279 $selected_sidebar = get_post_meta($post_id, 'sbg_selected_sidebar', true);
280 if(!is_array($selected_sidebar)){
281 $tmp = $selected_sidebar;
282 $selected_sidebar = array();
283 $selected_sidebar[0] = $tmp;
284 }
285 $selected_sidebar_replacement = get_post_meta($post_id, 'sbg_selected_sidebar_replacement', true);
286 if(!is_array($selected_sidebar_replacement)){
287 $tmp = $selected_sidebar_replacement;
288 $selected_sidebar_replacement = array();
289 $selected_sidebar_replacement[0] = $tmp;
290 }
291 ?>
292
293 <div id='sbg-sortables' class='meta-box-sortables'>
294 <div id="sbg_box" class="postbox " >
295 <div class="handlediv" title="Click to toggle"><br /></div><h3 class='hndle'><span>Sidebars</span></h3>
296 <div class="inside">
297 <div class="sbg_container">
298 <input name="sbg_edit" type="hidden" value="sbg_edit" />
299
300 <p>
301 Select the sidebar you wish to display on this page, and which sidebar it will replace. (leave unselected to use the default sidebar everywhere)
302 </p>
303 <ul>
304 <?php
305 global $wp_registered_sidebars;
306 //var_dump($wp_registered_sidebars);
307 for($i=0;$i<5;$i++){ ?>
308 <li>Replace
309 <select name="sidebar_generator[<?=$i?>]">
310 <option value="0"<?php if($selected_sidebar[$i] == ''){ echo " selected";} ?>>WP Default Sidebar</option>
311 <?php
312 $sidebars = $wp_registered_sidebars;// sidebar_generator::get_sidebars();
313 if(is_array($sidebars) && !empty($sidebars)){
314 foreach($sidebars as $sidebar){
315 if($selected_sidebar[$i] == $sidebar['name']){
316 echo "<option value='{$sidebar['name']}' selected>{$sidebar['name']}</option>n";
317 }else{
318 echo "<option value='{$sidebar['name']}'>{$sidebar['name']}</option>n";
319 }
320 }
321 }
322 ?>
323 </select>
324 with
325 <select name="sidebar_generator_replacement[<?=$i?>]">
326 <option value="0"<?php if($selected_sidebar_replacement[$i] == ''){ echo " selected";} ?>>None</option>
327 <?php
328
329 $sidebar_replacements = $wp_registered_sidebars;//sidebar_generator::get_sidebars();
330 if(is_array($sidebar_replacements) && !empty($sidebar_replacements)){
331 foreach($sidebar_replacements as $sidebar){
332 if($selected_sidebar_replacement[$i] == $sidebar['name']){
333 echo "<option value='{$sidebar['name']}' selected>{$sidebar['name']}</option>n";
334 }else{
335 echo "<option value='{$sidebar['name']}'>{$sidebar['name']}</option>n";
336 }
337 }
338 }
339 ?>
340 </select>
341
342 </li>
343 <?php } ?>
344 </ul>
345 </div>
346 </div>
347 </div>
348 </div>
349
350 <?php
351 }
352
353 /**
354 * called by the action get_sidebar. this is what places this into the theme
355 */
356 function get_sidebar($name="0"){
357 if(!is_singular()){
358 if($name != "0"){
359 dynamic_sidebar($name);
360 }else{
361 dynamic_sidebar();
362 }
363 return;//dont do anything
364 }
365 global $wp_query;
366 $post = $wp_query->get_queried_object();
367 $selected_sidebar = get_post_meta($post->ID, 'sbg_selected_sidebar', true);
368 $selected_sidebar_replacement = get_post_meta($post->ID, 'sbg_selected_sidebar_replacement', true);
369 $did_sidebar = false;
370 //this page uses a generated sidebar
371 if($selected_sidebar != '' && $selected_sidebar != "0"){
372 echo "nn<!-- begin generated sidebar -->n";
373 if(is_array($selected_sidebar) && !empty($selected_sidebar)){
374 for($i=0;$i<sizeof($selected_sidebar);$i++){
375
376 if($name == "0" && $selected_sidebar[$i] == "0" && $selected_sidebar_replacement[$i] == "0"){
377 //echo "nn<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
378 dynamic_sidebar();//default behavior
379 $did_sidebar = true;
380 break;
381 }elseif($name == "0" && $selected_sidebar[$i] == "0"){
382 //we are replacing the default sidebar with something
383 //echo "nn<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
384 dynamic_sidebar($selected_sidebar_replacement[$i]);//default behavior
385 $did_sidebar = true;
386 break;
387 }elseif($selected_sidebar[$i] == $name){
388 //we are replacing this $name
389 //echo "nn<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
390 $did_sidebar = true;
391 dynamic_sidebar($selected_sidebar_replacement[$i]);//default behavior
392 break;
393 }
394 //echo "<!-- called=$name selected={$selected_sidebar[$i]} replacement={$selected_sidebar_replacement[$i]} -->n";
395 }
396 }
397 if($did_sidebar == true){
398 echo "n<!-- end generated sidebar -->nn";
399 return;
400 }
401 //go through without finding any replacements, lets just send them what they asked for
402 if($name != "0"){
403 dynamic_sidebar($name);
404 }else{
405 dynamic_sidebar();
406 }
407 echo "n<!-- end generated sidebar -->nn";
408 return;
409 }else{
410 if($name != "0"){
411 dynamic_sidebar($name);
412 }else{
413 dynamic_sidebar();
414 }
415 }
416 }
417
418 /**
419 * replaces array of sidebar names
420 */
421 function update_sidebars($sidebar_array){
422 $sidebars = update_option('sbg_sidebars',$sidebar_array);
423 }
424
425 /**
426 * gets the generated sidebars
427 */
428 function get_sidebars(){
429 $sidebars = get_option('sbg_sidebars');
430 return $sidebars;
431 }
432 function name_to_class($name){
433 $class = str_replace(array(' ',',','.','"',"'",'/',"\",'+','=',')','(','*','&','^','%','$','#','@','!','~','`','<','>','?','[',']','{','}','|',':',),'',$name);
434 return $class;
435 }
436
437}
438$sbg = new sidebar_generator;
439
440function generated_dynamic_sidebar($name='0'){
441 sidebar_generator::get_sidebar($name);
442 return true;
443}
444?>
445
446// create your own page
447 add_menu_page('my-page', 'My Page', 'My Page', 'parent-slug', 'my_plugin_options', '', '10');
448
449// create the subpage under my-page
450 add_submenu_page('parent-slug', 'Sidebars', 'Sidebars', 'manage_options', __FILE__, array('sidebar_generator','admin_page'));
451
452add_action('admin_menu', 'function_to_create_menu_page');
453add_action('admin_menu', 'function_to_create_submenu_1_page', 100);
454add_action('admin_menu', 'function_to_create_submenu_2_page', 101);
455add_action('admin_menu', 'function_to_create_submenu_3_page', 103);