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