wordpressor
  • 0
Эксперт

Генератор боковой панели? :)

  • 0

Я устал редактировать functions.php каждый раз, когда хочу добавить/удалить боковую панель.

Я знаю, что есть плагин Sidebar Generator, но я хотел разработать что-то самостоятельно, что будет работать из коробки без плагинов.

В любом случае, я уже знаю, как перечислить все боковые панели, как их зарегистрировать и удалить, но я не знаю, как сделать это автоматически со страницы параметров (конечно, она у меня уже есть).

Я проанализировал код плагина, но мой PHP отстой, поэтому я не понимаю половину или даже больше.

Может быть, кто-то здесь разработал собственный генератор боковой панели и может помочь мне с основами, например, как зарегистрировать новую боковую панель с помощью $_POST и т. д.?

Я думал о fopen(«functions.php», «r+»), но я не уверен в этом методе, потому что он может даже стереть весь файл functions.php при неправильном использовании, поиск уже зарегистрированных виджетов может быть тоже больно.

Я считаю, что было бы очень полезно иметь что-то подобное, и странно, что в WP нет встроенного генератора боковой панели.

Share
  1. Код этого плагина на самом деле довольно прост. Функция инициализации перебирает все боковые панели (хранящиеся в таблице wp_options) и регистрирует их в wordpress:

    <?php
    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' => '<li id="%1$s" class="widget sbg_widget '.$sidebar_class.' %2$s">',
                        'after_widget' => '</li>',
                        'before_title' => '<h2 class="widgettitle sbg_title">',
                        'after_title' => '</h2>',
                    ));
                }
            }
        }
    ?>
    

    Боковые панели добавляются/удаляются с помощью методов add_sidebar() и remove_sidebar() соответственно. $_POST[‘sidebar_name’] сохраняется в переменной $name как имя боковой панели:

    <?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);
        }
    ?>
    

    Боковые панели загружаются и регистрируются в теме с помощью метода get_sidebar.

    <?php
    function get_sidebar($name="0"){
            if(!is_singular()){
                if($name != "0"){
                    dynamic_sidebar($name);
                }else{
                    dynamic_sidebar();
                }
                return;//dont do anything
            }
            global $wp_query;
            $post = $wp_query->get_queried_object();
            $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($selected_sidebar != '' && $selected_sidebar != "0"){
                echo "\n\n<!-- begin generated sidebar -->\n";
                if(is_array($selected_sidebar) && !empty($selected_sidebar)){
                    for($i=0;$i<sizeof($selected_sidebar);$i++){                    
    
                        if($name == "0" && $selected_sidebar[$i] == "0" &&  $selected_sidebar_replacement[$i] == "0"){
                            //echo "\n\n<!-- [called $name selected {$selected_sidebar[$i]} replacement {$selected_sidebar_replacement[$i]}] -->";
                            dynamic_sidebar();//default behavior
                            $did_sidebar = true;
                            break;
                        }elseif($name == "0" && $selected_sidebar[$i] == "0"){
                            //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($did_sidebar == true){
                    echo "\n<!-- end generated sidebar -->\n\n";
                    return;
                }
                //go through without finding any replacements, lets just send them what they asked for
                if($name != "0"){
                    dynamic_sidebar($name);
                }else{
                    dynamic_sidebar();
                }
                echo "\n<!-- end generated sidebar -->\n\n";
                return;         
            }else{
                if($name != "0"){
                    dynamic_sidebar($name);
                }else{
                    dynamic_sidebar();
                }
            }
        }
    ?>
    

    Фактически мы загружаем массив боковой панели из таблицы wp_options следующим образом:

    <?php
    function get_sidebars(){
            $sidebars = get_option('sbg_sidebars');
            return $sidebars;
        }
    ?>
    

    Этот код действительно довольно прост, если вы знаете PHP, поэтому могу ли я предложить потратить немного времени, чтобы лучше ознакомиться с ним? Это действительно большое умение. Надеюсь, это поможет указать вам правильное направление.

    • 0
    • @ Адам Томпсон, спасибо, это всегда что-то. Можете ли вы объяснить мне, как и где именно эти боковые панели добавляются или удаляются? Я думал, что каждая боковая панель должна быть зарегистрирована в functions.php, но здесь кажется, что они регистрируются где-то еще? Кажется, я говорю о ‘sidebar_generator::update_sidebars($sidebars);’.

      • 0
    • @Adam Thompson Я искал боковые панели где угодно в базе данных WP MySQL, но безуспешно, единственное место, где я нашел их «sbg_sidebars» в таблице wp_options, как вы сказали, но похоже, что этот плагин сам создает эту строку, так как WP знает, что боковые панели хранятся там?

      • 0
    • @Wordpressor: боковые панели не сохраняются в базе данных. Они «хранятся» в PHP. Вот как WP знает о них.

      • 0
    • @scribu, что означает «хранится в PHP»? Переменные, массивы, что угодно, их нужно как-то хранить, в файлах или базах данных? И в этом случае в functions.php ничего нет, поэтому боковые панели, созданные пользователем, должны храниться и хранятся в ‘sbg_sidebars’. Дело в том, откуда WP знает обо всех sbg_sidebars.

      • 0
    • Прочитайте первый абзац еще раз: «Функция инициализации перебирает все боковые панели (хранящиеся в таблице wp_options) и регистрирует их в wordpress». Вот как WP знает.

      • 0

Оставить ответ

You must login to add an answer.