<?php
/*
Plugin Name: My New Plugin
Plugin URI: http://www.dimio.org/napishem-plagin-dlya-wordpress-chast-1.html
Description: Modify posts title and body.
Version: 0.42
Author: dimio
Author URI: http://www.dimio.org
*/


//При активации плагина - создать таблицу с настройкми, активировать
//настройки по умолчанию
register_activation_hook(__FILE__, 'myplugin_set_options');
//При деактивации плагина - удалить настройки и сбросить таблицу настроек
register_deactivation_hook(__FILE__, 'myplugin_unset_options');

//Добавить новое меню в админку Wordpress - меню управления плагином
add_action('admin_menu', 'myplugin_admin_page');
//add_action('init', 'init_textdomain');

//Подключить обработку тела и заголовка записей функцией плагина mod_content
add_filter('the_content', 'mod_content');
add_filter('the_title', 'mod_title');

//Получить дескриптор таблицы настроек плагина для работы с ней
$myplugin_prefs_table = myplugin_get_table_handle();


//Возвращает дескриптор таблицы настроек плагина
function myplugin_get_table_handle() {
    //объявить встроенную в WP переменную - дескриптор БД блога
    global $wpdb;
    //вернуть дескриптор таблицы настроек плагина, расположенной в БД WP-блога
    return $wpdb->prefix . "myplug_prefs";
}


//Создаёт таблицу настроек плагина, устанавливает настройки по умолчанию.
//Вызывается в момент активации плагина
function myplugin_set_options() {
    global $wpdb;

    //Установить опции по умолчанию (они будут храниться в таблице настроек WP)
    add_option('myplug_version', '0.42');
    //1. Будет ли плагин по умолчанию обрабатывать заголовки записей. 0 - нет
    add_option('myplug_modify_title', 0);
    //То же для тела записей. 1 - да
    add_option('myplug_modify_content', 1);


    //Вызов функции повторяется, т.к. данные действия происходят на этапе установки плагина,
    //когда вызов в теле еще не может быть осуществлён
    $myplugin_prefs_table = myplugin_get_table_handle();

    //Установить кодировку таблицы (пустая - использовать умолчальную кодировку MySQL
    $charset_collate = '';

    //Если версия MySQL не ниже указанной - установить кодировку для хранения
    //и сравнения как UTF-8
    if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') )
        $charset_collate = "DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci";

    //Если в БД блога еще нёт таблицы настроек плагина - создать её.
    if($wpdb->get_var("SHOW TABLES LIKE '$myplugin_prefs_table'") != $myplugin_prefs_table) {
        $sql = "CREATE TABLE `" . $myplugin_prefs_table . "` (
            `id` INT NOT NULL AUTO_INCREMENT,
            `title` VARCHAR(255) NOT NULL default '',
            `body` VARCHAR(255) NOT NULL default '',
            UNIQUE KEY id (id)
        )$charset_collate";
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); //обращение к функциям WP для
        dbDelta($sql); //работы с БД. создаём новую таблицу
    }
} //Конец функции установки настроек плагина


//При деактивации плагина удаляет настройки и очищает таблицу настроек
function myplugin_unset_options() {
    global $wpdb, $myplugin_prefs_table;
    delete_option('myplug_version');
    delete_option('myplug_modify_title');
    delete_option('myplug_modify_content');
    $sql = "DROP TABLE $myplugin_prefs_table";
    $wpdb->query($sql);
}


//Создаёт кнопку для перехода к страницу настроек плагина в админке WP
function myplugin_admin_page() {
    add_options_page('MyPlugin', 'MyPlugAdminPage', 8, __FILE__, 'myplugin_options_page');
}


//Подгружает перевод плагина из указанной директории
function init_textdomain() {
    if (function_exists('load_plugin_textdomain')) {
        load_plugin_textdomain('example_plugin', 'wp-content/plugins/wp-example_plugin');
    }
}


//Выводит таблицу настроек плагина, обрабатывает изменения настроек, сделанные
//пользоваетеле (обновить настройки, показать обновлённые)
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 settings are dropped','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;
            //Разделение строки на две подстроки, разделитель - |
            //$title будет добавляться к заголовкам записей,
            //$body - к телу записей.
            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 __('All settings are saved','example_plugin'); ?>
</strong></p></div>


<?php
    } //конец блока добавления настроек

    //Блок сохранения опций плагина (обрабатывать ли заголовки, обрабатывать ли тело записей
    //Обработка нажатия кнопки "Сохранить настройки"
    if ($cmd == "myplugin_save_opt") {
        //Перебор массива с настройками
        foreach ($myplugin_options as $myplugin_opt) {
            //Каждому элементу массива присваиваем введённое пользователем занчение
            $$myplugin_opt = $_POST[$myplugin_opt];
        }

        //Обновляем настройки плагина в таблице настроек в БД WP
        foreach ($myplugin_options as $myplugin_opt) {
        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">
    <!--Вывод кнопки сохранения настроек в браузер. Стандартная функция Wordpress-->
    <input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" />
    </p>
    </form> <!--Конец формы обработки настроек-->


    <!--Вывод информации о плагине. Например - кем разработан-->
    <h3><?php echo __('Plugin developed','example_plugin'); ?></h3>
    <table class="form-table">
    <tr><th>
    <ul>
    <li><?php echo __('By: <a href="http://www.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
} //Конец функции создания и обработки страницы настроек.


//Функция добавления "хвостов" к заголовку записи.
function mod_title($title){
    //Если установлена опция модификации заголовка - сделать это
    if (get_option('myplug_modify_title')) {
        $title = $title . myplugin_get_phrase($ph_type = 'title');
    }
    return $title;
}

//Функция добавления "хвостов" к телу записи.
function mod_content($content){
    //Аналогично - если установлена опция модификации тела записи
    if (get_option('myplug_modify_content')) {
        $content = $content . myplugin_get_phrase($ph_type = 'body');
    }
    return $content;
}


//Выбирает из таблицы случайную фразу для модификации заголовка|тела записи
//и возвращает её.
//На вход получает тип фразы, которую надо вынуть из БД (тип фразы - это
//title или body - повторяют названия соотв. столбцов в таблице плагина.
function myplugin_get_phrase($ph_type){
    global $wpsig_sig_table, $wpdb;
    $sql = "SELECT '$ph_type' FROM $myplugin_prefs_table ORDER BY RAND() LIMIT 1";
    $phrase = $wpdb->get_var($sql);

    return $phrase;
}

//Конец плагина
?>