· 7 years ago · Nov 21, 2018, 04:02 PM
1<?php
2/**
3 * Plugin Name: SQ Sidebar Generator
4 * Plugin URI: http://seventhqueen.com
5 * Description: This plugin generates as many sidebars as you need. Then allows you to place them on any page you wish.
6 * Version: 1.2.1
7 * Author: SeventhQueen
8 * Author URI:
9 * Text Domain: sq-sidebar-generator
10 * License: GPL-2.0+
11 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
12 * Domain Path: /languages
13 */
14/* Forked from: Kyle Getson */
15
16if ( ! class_exists( 'sq_sidebar_generator' ) ) {
17 class sq_sidebar_generator {
18
19 public function __construct() {
20 add_action( 'init', array( $this, 'init' ) );
21 add_action( 'admin_menu', array( 'sq_sidebar_generator', 'admin_menu' ) );
22 add_action( 'admin_print_scripts', array( 'sq_sidebar_generator', 'admin_print_scripts' ) );
23
24 add_action( 'add_meta_boxes', [ $this, 'add_meta_boxes' ] );
25
26 //save posts/pages
27 add_action( 'save_post', array( 'sq_sidebar_generator', 'save_form' ), 10, 2 );
28
29 }
30
31 public static function init() {
32
33 // Register AJAX hooks
34 if ( current_user_can( 'manage_options' ) ) {
35 add_action( 'wp_ajax_add_sidebar', array( 'sq_sidebar_generator', 'add_sidebar' ) );
36 add_action( 'wp_ajax_remove_sidebar', array( 'sq_sidebar_generator', 'remove_sidebar' ) );
37 }
38
39
40 //go through each sidebar and register it
41 $sidebars = self::get_sidebars();
42
43 global $wp_registered_sidebars;
44
45 if ( is_array( $sidebars ) ) {
46 foreach ( $sidebars as $sidebar ) {
47 $sidebar_class = self::name_to_class( $sidebar );
48 $i = count( $wp_registered_sidebars ) + 1;
49
50 register_sidebar( array(
51 'name' => $sidebar,
52 'id' => 'sidebar-' . $i,
53 'before_widget' => '<div id="%1$s" class="widget clearfix %2$s">',
54 'after_widget' => '</div>',
55 'before_title' => apply_filters( 'sq_ms_before_title', '<h4>' ),
56 'after_title' => apply_filters( 'sq_ms_after_title', '</h4>' ),
57 ) );
58 }
59 }
60 }
61
62 public function add_meta_boxes() {
63 $post_types = get_post_types();
64 add_meta_box( 'sq_sidebar_generator', 'Sidebar Generator', array( 'sq_sidebar_generator', 'edit_form' ), $post_types );
65 }
66
67 public static function admin_print_scripts() {
68 wp_print_scripts( array( 'sack' ) );
69 ?>
70 <script>
71 function add_sidebar(sidebar_name) {
72
73 var mysack = new sack("<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>");
74
75 mysack.execute = 1;
76 mysack.method = 'POST';
77 mysack.setVar("action", "add_sidebar");
78 mysack.setVar("sidebar_name", sidebar_name);
79 mysack.setVar("sidebar_generator_nonce", "<?php echo wp_create_nonce( 'add_sidebar' )?>");
80 mysack.encVar("cookie", document.cookie, false);
81 mysack.onError = function () {
82 alert('Ajax error. Cannot add sidebar')
83 };
84 mysack.runAJAX();
85 return true;
86 }
87
88 function remove_sidebar(sidebar_name, num) {
89
90 var mysack = new sack("<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>");
91
92 mysack.execute = 1;
93 mysack.method = 'POST';
94 mysack.setVar("action", "remove_sidebar");
95 mysack.setVar("sidebar_name", sidebar_name);
96 mysack.setVar("sidebar_generator_nonce", "<?php echo wp_create_nonce( 'remove_sidebar' )?>");
97 mysack.setVar("row_number", num);
98 mysack.encVar("cookie", document.cookie, false);
99 mysack.onError = function () {
100 alert('<?php esc_html_e( 'Ajax error. Cannot add sidebar', 'sq-sidebar-generator' ); ?>')
101 };
102 mysack.runAJAX();
103 //alert('hi!:::'+sidebar_name);
104 return true;
105 }
106 </script>
107 <?php
108 }
109
110 public static function add_sidebar() {
111 check_admin_referer( 'add_sidebar', 'sidebar_generator_nonce' );
112
113 $sidebars = self::get_sidebars();
114 $name = str_replace( array( "\n", "\r", "\t" ), '', $_POST['sidebar_name'] );
115 //$id = self::name_to_class( $name );
116 $id = sanitize_title( $name );
117 if ( isset( $sidebars[ $id ] ) ) {
118 die( "alert('" . esc_html__( 'Sidebar already exists, please use a different name.', 'sq-sidebar-generator' ) . "')" );
119 }
120
121 $sidebars[ $id ] = $name;
122 self::update_sidebars( $sidebars );
123
124 $js = "
125 var tbl = document.getElementById('sbg_table');
126 var lastRow = tbl.rows.length;
127 // if there's no header row in the table, then iteration = lastRow + 1
128 var iteration = lastRow;
129 var row = tbl.insertRow(lastRow);
130
131 // left cell
132 var cellLeft = row.insertCell(0);
133 var textNode = document.createTextNode('" . esc_js( $name ) . "');
134 cellLeft.appendChild(textNode);
135
136 //middle cell
137 var cellLeft = row.insertCell(1);
138 var textNode = document.createTextNode('" . esc_js( $id ) . "');
139 cellLeft.appendChild(textNode);
140
141 //var cellLeft = row.insertCell(2);
142 //var textNode = document.createTextNode('[<a href=\'javascript:void(0);\' onclick=\'return remove_sidebar_link($name);\'>Remove</a>]');
143 //cellLeft.appendChild(textNode)
144
145 var cellLeft = row.insertCell(2);
146 removeLink = document.createElement('a');
147 linkText = document.createTextNode('remove');
148 removeLink.setAttribute('onclick', 'remove_sidebar_link(\'" . esc_js( $name ) . "\')');
149 removeLink.setAttribute('href', '#');
150
151 removeLink.appendChild(linkText);
152 cellLeft.appendChild(removeLink);
153
154
155 ";
156
157
158 die( "$js" );
159 }
160
161 public static function remove_sidebar() {
162 check_admin_referer( 'remove_sidebar', 'sidebar_generator_nonce' );
163
164 $sidebars = self::get_sidebars();
165 $name = str_replace( array( "\n", "\r", "\t" ), '', $_POST['sidebar_name'] );
166 $id = sanitize_title( $name );
167 if ( ! isset( $sidebars[ $id ] ) ) {
168 $id = self::name_to_class( $name );
169
170 if ( ! isset( $sidebars[ $id ] ) ) {
171 die( "alert('Sidebar does not exist.')" );
172 }
173 }
174 $row_number = (int) $_POST['row_number'];
175 unset( $sidebars[ $id ] );
176 self::update_sidebars( $sidebars );
177 $js = "var tbl = document.getElementById('sbg_table');tbl.deleteRow($row_number)";
178
179 die( $js );
180 }
181
182 public static function admin_menu() {
183 add_theme_page(
184 esc_html__( 'Sidebars', 'sq-sidebar-generator' ),
185 esc_html__( 'Sidebars', 'sq-sidebar-generator' ),
186 'manage_options',
187 'sq_sidebars', array(
188 'sq_sidebar_generator',
189 'admin_page',
190 ) );
191
192 }
193
194 public static function admin_page() {
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 remove_sidebar(name, num);
201 } else {
202 return false;
203 }
204 }
205 function add_sidebar_link() {
206 var sidebar_name = prompt("Sidebar Name:", "");
207 add_sidebar(sidebar_name);
208 }
209 </script>
210 <div class="wrap">
211 <h2>Sidebars</h2>
212 <br/>
213 <table class="widefat page" id="sbg_table" style="width:600px;">
214 <tr>
215 <th>Sidebar Name</th>
216 <th>CSS class</th>
217 <th>Remove</th>
218 </tr>
219 <?php
220 $sidebars = self::get_sidebars();
221 if ( is_array( $sidebars ) && ! empty( $sidebars ) ) {
222 $cnt = 0;
223 foreach ( $sidebars as $sidebar ) {
224 $alt = ( 0 == $cnt % 2 ? 'alternate' : '' );
225 ?>
226 <tr class="<?php echo esc_attr( $alt ) ?>">
227 <td><?php echo esc_html( $sidebar ); ?></td>
228 <td><?php echo sanitize_title( $sidebar ); ?></td>
229 <td><a href="javascript:void(0);"
230 onclick="return remove_sidebar_link('<?php echo esc_attr( $sidebar ); ?>',<?php echo (int) ( $cnt + 1 ); ?>);"
231 title="Remove this sidebar">remove</a></td>
232 </tr>
233 <?php
234 $cnt ++;
235 }
236 } else {
237 ?>
238 <tr>
239 <td colspan="3">No Sidebars defined</td>
240 </tr>
241 <?php
242 }
243 ?>
244 </table>
245 <br/><br/>
246
247 <div class="add_sidebar">
248 <a href="javascript:void(0);" onclick="return add_sidebar_link()" title="Add a sidebar"
249 class="button-primary">+ Add New Sidebar</a>
250
251 </div>
252
253 </div>
254 <?php
255 }
256
257 /**
258 * for saving the pages/post
259 *
260 * @param integer $post_id
261 *
262 * @return void
263 */
264 public static function save_form( $post_id, $post ) {
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 global $post;
276 $post_id = $post;
277 if ( is_object( $post_id ) ) {
278 $post_id = $post_id->ID;
279 }
280 $selected_sidebar = get_post_meta( $post_id, 'sbg_selected_sidebar', true );
281 if ( ! is_array( $selected_sidebar ) ) {
282 $tmp = $selected_sidebar;
283 $selected_sidebar = array();
284 $selected_sidebar[0] = $tmp;
285 }
286 $selected_sidebar_replacement = get_post_meta( $post_id, 'sbg_selected_sidebar_replacement', true );
287 if ( ! is_array( $selected_sidebar_replacement ) ) {
288 $tmp = $selected_sidebar_replacement;
289 $selected_sidebar_replacement = array();
290 $selected_sidebar_replacement[0] = $tmp;
291 }
292 ?>
293
294 <div id='sbg-sortables' class='meta-box-sortables'>
295 <div id="sbg_box" class="postbox ">
296 <div class="handlediv" title="Click to toggle"><br/></div>
297 <h3 class='hndle'><span>Sidebar</span></h3>
298
299 <div class="inside">
300 <div class="sbg_container">
301 <input name="sbg_edit" type="hidden" value="sbg_edit"/>
302
303 <p>Please select the sidebar you would like to display on this page. <strong>Note:</strong>
304 You must first create the sidebar under Appearance > Sidebars.
305 </p>
306 <ul>
307 <?php
308 global $wp_registered_sidebars;
309 for ( $i = 0; $i < 1; $i ++ ) { ?>
310 <li>
311 <select name="sidebar_generator[<?php echo $i ?>]" style="display: none;">
312 <option value="0"<?php if ( $selected_sidebar[ $i ] == '' ) {
313 echo " selected";
314 } ?>>WP Default Sidebar
315 </option>
316 <?php
317 $sidebars = $wp_registered_sidebars;// sidebar_generator::get_sidebars();
318 if ( is_array( $sidebars ) && ! empty( $sidebars ) ) {
319 foreach ( $sidebars as $sidebar ) {
320 if ( $selected_sidebar[ $i ] == $sidebar['name'] ) {
321 echo "<option value='" . esc_attr( $sidebar['name'] ) . "' selected>" . esc_html( $sidebar['name'] ) . "</option>\n";
322 } else {
323 echo "<option value='" . esc_attr( $sidebar['name'] ) . "'>" . esc_html( $sidebar['name'] ) . "</option>\n";
324 }
325 }
326 }
327 ?>
328 </select>
329 <select name="sidebar_generator_replacement[<?php echo $i ?>]">
330 <option value="0"<?php if ( '' == $selected_sidebar_replacement[ $i ] ) {
331 echo ' selected';
332 } ?>>None
333 </option>
334 <?php
335
336 $sidebar_replacements = $wp_registered_sidebars;//sidebar_generator::get_sidebars();
337 if ( is_array( $sidebar_replacements ) && ! empty( $sidebar_replacements ) ) {
338 foreach ( $sidebar_replacements as $sidebar ) {
339 if ( $selected_sidebar_replacement[ $i ] == $sidebar['name'] ) {
340 echo "<option value='{$sidebar['name']}' selected>{$sidebar['name']}</option>\n";
341 } else {
342 echo "<option value='{$sidebar['name']}'>{$sidebar['name']}</option>\n";
343 }
344 }
345 }
346 ?>
347 </select>
348
349 </li>
350 <?php } ?>
351 </ul>
352 </div>
353 </div>
354 </div>
355 </div>
356
357 <?php
358 }
359
360 /**
361 * called by the action get_sidebar. this is what places this into the theme
362 *
363 * @param string $name
364 */
365 public static function get_sidebar( $name = '0' ) {
366
367 if ( 'sidebar-1' == $name ) {
368 $name = '0';
369 }
370 if ( ! ( is_singular() || is_home() ) ) {
371 if ( '0' != $name ) {
372 dynamic_sidebar( $name );
373 } else {
374 dynamic_sidebar();
375 }
376
377 return;//do not do anything
378 }
379
380 global $wp_query;
381 $post = $wp_query->get_queried_object();
382 /*if ( ! $post ) {
383 dynamic_sidebar();
384
385 return;
386 }*/
387
388
389 if ( ! is_object( $post ) ) {
390
391 if ( function_exists( 'sq_bp_get_page_id' ) && bp_is_blog_page() && sq_bp_get_page_id() ) {
392 $post_id = sq_bp_get_page_id();
393 } elseif ( is_home() && get_option( 'page_for_posts' ) ) {
394 $post_id = get_option( 'page_for_posts' );
395 } else {
396 if ( '0' != $name ) {
397 dynamic_sidebar( $name );
398 } else {
399 dynamic_sidebar();
400 }
401
402 return;
403 }
404 } else {
405 $post_id = $post->ID;
406 }
407
408
409
410 $selected_sidebar = get_post_meta( $post_id, 'sbg_selected_sidebar', true );
411 $selected_sidebar_replacement = get_post_meta( $post_id, 'sbg_selected_sidebar_replacement', true );
412 $did_sidebar = false;
413 //this page uses a generated sidebar
414
415 if ( ! empty( $selected_sidebar_replacement ) && ( isset( $selected_sidebar_replacement ) && '0' !== $selected_sidebar_replacement[0] ) ) {
416
417 if ( function_exists( 'is_woocommerce' ) ) {
418 if ( is_woocommerce() ) {
419 $shop_sidebar = 'shop-1';
420
421 if ( $name == $shop_sidebar ) {
422 $selected_sidebar = array( $shop_sidebar );
423 }
424 }
425 }
426 }
427
428 if ( '' != $selected_sidebar && '0' != $selected_sidebar ) {
429 echo '';
430 if ( is_array( $selected_sidebar ) && ! empty( $selected_sidebar ) ) {
431 for ( $i = 0; $i < sizeof( $selected_sidebar ); $i ++ ) {
432
433 if ( '0' == $name && '0' == $selected_sidebar[ $i ] && '0' == $selected_sidebar_replacement[ $i ] ) {
434 //echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
435 dynamic_sidebar();//default behavior
436 $did_sidebar = true;
437
438 break;
439 } elseif ( '0' == $name && '0' == $selected_sidebar[ $i ] ) {
440 //we are replacing the default sidebar with something
441 //echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
442 dynamic_sidebar( $selected_sidebar_replacement[ $i ] );//default behavior
443 $did_sidebar = true;
444
445 break;
446 } elseif ( $selected_sidebar[ $i ] == $name ) {
447 //we are replacing this $name
448 //echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
449 $did_sidebar = true;
450 dynamic_sidebar( $selected_sidebar_replacement[ $i ] );//default behavior
451 break;
452 }
453
454 //echo "<!-- called=$name selected={$selected_sidebar[$i]} replacement={$selected_sidebar_replacement[$i]} -->\n";
455 }
456 }
457 if ( true == $did_sidebar ) {
458 echo '';
459
460 return;
461 }
462 //go through without finding any replacements, lets just send them what they asked for
463 if ( '0' != $name ) {
464 dynamic_sidebar( $name );
465 } else {
466 dynamic_sidebar();
467 }
468 echo '';
469
470 return;
471 } else {
472 if ( '0' != $name ) {
473 dynamic_sidebar( $name );
474 } else {
475 dynamic_sidebar();
476 }
477 }
478 }
479
480 /**
481 * replaces array of sidebar names
482 */
483 public static function update_sidebars( $sidebar_array ) {
484 $sidebars = update_option( 'sbg_sidebars', $sidebar_array );
485 }
486
487 /**
488 * gets the generated sidebars
489 */
490 public static function get_sidebars() {
491 $sidebars = get_option( 'sbg_sidebars' );
492
493 return $sidebars;
494 }
495
496 public static function name_to_class( $name ) {
497 $class = str_replace( array(
498 ' ',
499 ',',
500 '.',
501 '"',
502 "'",
503 '/',
504 "\\",
505 '+',
506 '=',
507 ')',
508 '(',
509 '*',
510 '&',
511 '^',
512 '%',
513 '$',
514 '#',
515 '@',
516 '!',
517 '~',
518 '`',
519 '<',
520 '>',
521 '?',
522 '[',
523 ']',
524 '{',
525 '}',
526 '|',
527 ':',
528 ), '', $name );
529
530 return $class;
531 }
532
533 }
534}
535$sbg = new sq_sidebar_generator;
536
537function generated_dynamic_sidebar( $name = '0' ) {
538 sq_sidebar_generator::get_sidebar( $name );
539
540 return true;
541}