Пишем плагин для WordPress. Создание страницы настроек плагина (часть 4)

Создаём страницу настроек для WordPress плагина

Продолжим разговор о том, как написать свой плагин для WordPress.
В прошлый раз мы рассмотрели вопрос предустановленные настройки wordpress плагина, а сегодня попробуем написать его административную страницу. Для начала приведу функцию создания этой страницы, а затем на некоторых моментах остановлюсь подробней. В принципе основные сведения были даны в предыдущей части руководства, здесь же достаточно просто кода с комментариями.

Функция создания страницы настроек для плагина WordPress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
function myplugin_options_page() {      //Функция создания и обработки страницы настроек плагина
    global $wpdb, $myplugin_prefs_table;
    $myplugin_options = array(          //Создаём массив с настройками плагина
        'myplug_modify_title',
        'myplug_modify_content',
    );
    $cmd = $_POST['cmd'];               //Обработка пользовательского ввода
    foreach ($myplugin_options as $myplugin_opt) {
        $$myplugin_opt = get_option($myplugin_opt);
    }
    if ($cmd == "del_prefs") {          //Если нажато "удалить фразы" - очищаем таблицу настроек плагина
        $sql = "TRUNCATE TABLE $myplugin_prefs_table";
        $wpdb->query( $sql );
    ?>
        <div class="updated"><p><strong> <?php echo __('All phrases are removed from the database','example_plugin'); ?></strong></p></div> /* Сообщаем пользвателю об успешной очистке. */
    <?php
    }
    if ($cmd == "add_prefs" && $_POST['prefs_base']) { //Если введены новые фразы в соотв. поле - обработаем их
        $lines = explode("\n", $_POST['prefs_base']); //Ввод разбивается на строки и кладётся в массив, разделитель - перевод строки
        foreach($lines as $line){   //Перебираем массив со строками
            $line = trim($line);    //Обрезка каждой строки от переводов
            if (!$line) continue;   //Если строка отстутствует - переходим к следующей итерации
            list($title, $body) = explode("|", $line);  //Разделение строки на две подстроки
            //Кладём подстроки в таблицу плагина.
            $sql = "INSERT INTO $myplugin_prefs_table (title, body) VALUES('$title','$body')";
            $wpdb->query($sql);
        }
    ?>
        <div class="updated"><p><strong> <?php echo __('Phrases added to the database','example_plugin'); ?></strong></p></div> /*Сообщаем пользователю об успешной обработке*/
    <?php
    }
    if ($cmd == "myplugin_save_opt") { //Обработка нажатия "Сохранить настройки"
        foreach ($myplugin_options as $myplugin_opt) {  //Перебор массива с настройками
            $$myplugin_opt = $_POST[$myplugin_opt]; //Каждому элементу массива присваиваем введённое пользователем занчение
        }

        foreach ($myplugin_options as $myplugin_opt) { //Обновляем настройки плагина в таблице настроек wordpress
            update_option($myplugin_opt, $$myplugin_opt);
        }
    ?>
        <div class="updated"><p><strong> <?php echo __('Settings saved','example_plugin'); ?></strong></p></div>
    <?php
    }
?>
    <div class="wrap">
    <h2>My Plugin</h2> /*Заголовок страницы настроек плагина*/

    <h3><?php echo __('Settings','example_plugin'); ?></h3> /*Название раздела настроек*/
    /*Начало формы для обработки настроек. Форма содержит 2 чекбокса, включающих или отключающих соответствующие функции плагина*/
    <form method="post" action="<? echo $_SERVER['REQUEST_URI'];?>">
    <table class="form-table">
    <tr>
    <th colspan=2 scope="row"> /*Первый чекбокс - будет ли плагин обрабатывать заголовки записей*/
        <input name="myplug_modify_title" type="checkbox" <?if($myplug_modify_title)echo "checked";?>> <?php echo __('Add random phrase to post title','example_plugin'); ?>
    </th>
    </tr>
    <tr>
    <th colspan=2 scope="row"> /*Второй чекбокс - будет ли плагин обрабатывать тело записей*/
        <input name="myplug_modify_content" type="checkbox" <?if($myplug_modify_content)echo "checked";?>> <?php echo __('Add random phrase to post content','example_plugin'); ?>
    </th>
    </tr>
    </table>
    <input type="hidden" name="cmd" value="myplugin_save_opt"> /*"Функциональная" часть кнопки сохранения настроек*/
    <p class="submit">
    <input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" /> /*Вывод кнопки сохранения настроек в браузер. Стандартная функция Wordpress*/
    </p>
    </form> /*Конец формы обработки настроек*/

    /*Вывод информации о плагине. Например - кем разработан*/
    <h3><?php echo __('Plugin developed','example_plugin'); ?></h3>
    <table class="form-table">
    <tr><th>
    <ul>
    <li><?php echo __('By: <a href="http://dimio.org/" target="_blank">dimio</a>','example_plugin'); ?></li>
    </ul>
    </th></tr></table>

    /*Блок ввода новых фраз в таблицу настроек плагина. Сначала идёт справка для пользователя*/
    <h3><?php echo __('Adding phrases','example_plugin'); ?></h3>
    /*Начало формы ввода. Форма содержит текстовое поле для ввода шириной 80 символов и высотой 12 строк*/
    <table class="form-table" width="300px">
    <tr>
    <td>
        <?php echo __('Format phrases: Title|Body','example_plugin'); ?><br />
    <form method="post" action="<? echo $_SERVER['REQUEST_URI'];?>">
    <textarea cols=80 rows=12 name="prefs_base"></textarea> /*Поле для ввода новых фраз*/
    </td>
    </tr>
    </table>
    /*Кнопка для сохранения фраз. По аналогии с кнопкой сохранения настроек, но без применения стандартной ф-и Wordpress*/
    <input type="hidden" name="cmd" value="add_prefs">
    <p class="submit">
    <input type="submit" name="Submit" value="<?php echo __('Add phrases','example_plugin'); ?>" />
    </p>
    </form>
    /*Форма, содержащая единственную кнопку - очистки таблицы настроек плагина*/
    <form method="post" action="<? echo $_SERVER['REQUEST_URI'];?>">
    <input type="hidden" name="cmd" value="del_prefs">
    <input type="submit" name="Submit" value="<?php echo __('Remove all phrases from the database','example_plugin'); ?>" />
    </form>
    </div>

<?php
//Конец функции создания и обработки страницы настроек.
}
?>

Я постарался прокомментировать в коде все ключевые моменты, для глубокого понимания в любом случае стоит читать про html и CGI-программирование в целом. Хотя в принципе — здесь всё интуитивно понятно, а если будет необходимость добавить новые элементы на страницу настроек — обращайтесь, как минимум — подскажу, в какую сторону копать.

В следующем выпуске я перейду к рассмотрению функциональной части плагина для WordPress. Расскажу, как написать для плагина функции, получающие данные из базы и модифицирующие wordpress-публикации.
Затем займёмся русификацией плагина (внимательные должны были обратить внимание на вызовы вида <?php echo __('Add phrases','example_plugin'); ?> — это как раз задел для будущего грамотного перевода (фактически — интернационализации) плагина).
А в заключение — расскажу, как отправить свой плагин для проверки и последующей публикации в репозитории WordPress на wordpress.org.
Не пропустите! 🙂

P.S. По-прежнему доступен для скачивания файл плагина, уже обновлённый.

Другие заметки по созданию плагина для WordPress

<-- Часть 3. Подготовка к созданию страницы настроек плагина
Часть 5. Функциональная составляющая плагина WordPress —>
Общее оглавление к циклу заметок по созданию плагина для WordPress


Category Рубрики: seo, Блоггинг, Кодинг | Tag Метки: , , , | Comments 11 комментариев »

11 комментариев

  1. ArNic says:

    Вообще клёвое описание. Но впредь рекомендую использовать либо «case» — либо конструкцию «if…ifelse…else»
    Почему? Ну чисто для восприятия.
    Понятно что у тебя обработка переменной $cmd идёт — но знаешь, более понятно будет если эти все обработки будут единым целым, а не отдельными условиями. Кстати тут ещё есть один момент: производительность
    Потому как в твоём случае код барыбыр (всё равно) будет проверять все условия. Но применив предложенную конструкцию код, достигнув нужного результата, просто прекратит дальнейший поиск соответствия. А это сокращение процессорного времени. Ещё один плюс. Это читабельность. Когда ты смотришь конструкцию case или «if…ifelse…else» ты понимаешь что это единая обработка, и тут либо либо. И можешь банально забить на этот блок до нужного момента 🙂
    Извини за несколько невнятный текст : говорить никогда нормально не умел.

    • dimio says:

      Мысль ясна в принципе. Переписать в виде if {} elsif {} будет разумно.
      Чтобы добиться сокращения процессорного времени, нужно варианты перебора выстроить в наиболее вероятной последовательности, а не так, как они сейчас стоят.

  2. Ну ты реально жжош! Столько кода, да ещё и без нормальных объяснений!!! 🙂 Пока 3+ это максимум 🙂 Совет: пиши так, чтобы ЛЮДЯМ было понятно и интересно, а не только тебе, дорогой аффтар!

    • ArNic says:

      Зря. Я согласен что не самый оптимальный код — но комментарии предельно понятные.

      • Ну не то, чтобы код плохой, нет! Просто как-то в него слишком резко въехали, что называется, без предварительных ласк 🙂 . Нужно было в предыдущих постах как-то расшарить эту информацию, чтобы даже чайнику (коим я уже не являюсь) было всё понятно. А вот у меня вопросы и вопросы…

        • ArNic says:

          Конечно, только автор в самом начале оговорился о том, что он изучил php именно на из-за желания написать плагин. I.M.H.O. для малоопытного программиста — статья ничего.

  3. Shua says:

    Сделал все по примерам, до создания страницы. Решил проверить. При активации плагина появляется сообщение: «Плагин произвёл при активации 292 символов неожиданного вывода. …»
    Notepad++, UTF-8 без BOM
    WP 3.1.1

    • dimio says:

      3.1.1 у меня нет. Последнее, на чём проверял — 2.9.2.
      В процессе написания этих заметок я делал плагин, который у меня сейчас работает на версии 3.1. ([ссылка]). Можете с ним сравнить, будет ошибка или нет.

Trackbacks / Pingbacks

  1. Пишем плагин для Wordpress. Функциональная составляющая (часть 5) | СетевойГибитобой

Добавить комментарий