Статьи

Создание функции простого резервного копирования / восстановления настроек

Параметры являются наиболее важными данными в WordPress, они хранят различные параметры конфигурации ( подробнее ). Они также содержатся в базе данных, как и другие важные данные, такие как сообщения, страницы и т. Д. Изо дня в день эти параметры могут быть изменены самим WordPress или пользователями. Так как же настроить их обратно в предыдущее состояние без запоминания каждого точного значения?

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


Как правило, наша функция будет состоять из двух разделов: один — раздел «Экспорт» для резервного копирования данных, а раздел «Импорт» — для восстановления данных. Поэтому я продемонстрирую это, создав простой плагин.


Прежде всего, я должен написать несколько строк, чтобы рассказать WordPress о нашем плагине.

1
2
3
4
5
6
7
8
/*
Plugin Name: I/E Option
Plugin URI: http://wp.tutsplus.com/
Description: This is a sample plugin with backup and restore options feature.
Author: Lee Pham
Version: 1.0
Author URI: http://twitter.com/leephamj
*/

И вот наш результат:


Теперь нам нужно место для размещения нашего интерфейса плагина, он показывает две ключевые функции, которые были упомянуты выше (включая функции импорта и экспорта). Поэтому я создаю страницу в разделе администратора:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
function register_ie_option() {
    add_menu_page(‘IE Option Page’, ‘IE Option’, ‘activate_plugins’, ‘ie-option’, ‘ie_option_page’, », 76);
    add_submenu_page(‘ie-option’, ‘Import’, ‘Import’, ‘activate_plugins’, ‘ie-import-option’, ‘ie_import_option_page’);
    add_submenu_page(‘ie-option’, ‘Export’, ‘Export’, ‘activate_plugins’, ‘ie-export-option’, ‘ie_export_option_page’);
}
 
function ie_option_page() {
    // Our stuff here
}
 
function ie_import_option_page() {
    // Content Import Feature
}
 
function ie_export_option_page() {
    // Content Export Feature
}
add_action(‘admin_menu’, ‘register_ie_option’);

Вот несколько моментов:

  • Мы используем add_menu_page как встроенную функцию WordPress для добавления нового раздела меню верхнего уровня на боковой панели меню администратора, где параметр ie_option_page является функцией обратного вызова для вывода содержимого страницы.
  • Чтобы разделить две основные функции на разные разделы, мы используем add_submenu_page чтобы добавить их в меню верхнего уровня, которое мы только что создали. Как видите, каждая функция также имеет функцию обратного вызова для отображения содержимого вывода, как это add_menu_page функция add_menu_page . Неважно, если вы объедините их в одном месте, я просто стараюсь, чтобы это было ясно.
  • Затем мы подключаем register_ie_option к действию admin_menu , чтобы вызывать нашу цель при каждом вызове этого действия.

Я планирую создать страницу экспорта следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
function ie_export_option_page() {
    if (!isset($_POST[‘export’])) {
        ?>
        <div class=»wrap»>
            <div id=»icon-tools» class=»icon32″><br /></div>
            <h2>Export</h2>
            <p>When you click <tt>Backup all options</tt> button, system will generate a JSON file for you to save on your computer.</p>
            <p>This backup file contains all configution and setting options on our website.
            <p>After exporting, you can either use the backup file to restore your settings on this site again or another WordPress site.</p>
            <form method=’post’>
                <p class=»submit»>
                    <?php wp_nonce_field(‘ie-export’);
                    <input type=’submit’ name=’export’ value=’Backup all options’/>
                </p>
            </form>
        </div>
        <?php
    }
    elseif (check_admin_referer(‘ie-export’)) {
        // Do something if Backup all options button clicked
    }
}

Мы просто создаем форму с кнопкой и проверяем, нажата кнопка или нет. Кроме того, мы добавляем текст инструкции, используя некоторый доступный класс WordPress CSS. Для проверки безопасности я использую функции wp_nonce_field() и check_admin_referer() , узнайте больше о WordPress Nonces .

1
2
3
$blogname = str_replace(» «, «», get_option(‘blogname’));
$date = date(«mdY»);
$json_name = $blogname.»-«.$date;

Просто назовите файл, чтобы вы могли легко увидеть, где и когда он был экспортирован.

1
2
3
4
5
6
7
8
$options = get_alloptions();
 
foreach ($options as $key => $value) {
    $value = maybe_unserialize($value);
    $need_options[$key] = $value;
}
 
$json_file = json_encode($need_options);

Вот важный шаг, давайте обратим внимание:

  • get_alloptions() — это функция, которая получает все опции на вашем сайте и возвращает их в виде массива, в этом случае $options .
  • Извлекая все параметры, значение параметров может быть сериализованными данными, поэтому мы должны сначала его десериализовать.
  • Наше намерение заключается в создании JSON для хранения резервных данных. JSON — это легкий и мощный способ хранения текстовой информации. Поэтому нам нужно преобразовать наши данные в синтаксис JSON, json_encode помогает нам достичь этой цели.
1
2
3
4
5
ob_clean();
echo $json_file;
header(«Content-Type: text/json; charset=» . get_option( ‘blog_charset’));
header(«Content-Disposition: attachment; filename=$json_name.json»);
exit();

Затем мы заключаем содержимое наших данных JSON в две важные функции, ob_clean() и exit() чтобы гарантировать, что наш сгенерированный файл JSON содержит только те данные JSON, которые json_file хранит без каких-либо других данных. Кстати, мы отправляем запрос заголовка клиенту, который отображает диалог загрузки. Чтобы это работало должным образом, мы должны поместить функцию ob_start() в верхнюю часть кода нашего плагина, это предотвратит возникновение ошибок заголовка, возможно, в коде WordPress есть какие-то дополнительные пробелы или строки, которые могут это вызвать.

« JSON (JavaScript Object Notation) — это легкий формат обмена данными. Людям легко читать и писать. Машины легко анализировать и генерировать».

Итак, вот весь код функции экспорта:

01
02
03
04
05
06
07
08
09
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
function ie_export_option_page() {
    if (!isset($_POST[‘export’])) {
        ?>
        <div class=»wrap»>
            <div id=»icon-tools» class=»icon32″><br /></div>
            <h2>Export</h2>
            <p>When you click <tt>Backup all options</tt> button, system will generate a JSON file for you to save on your computer.</p>
            <p>This backup file contains all configution and setting options on our website.
            <p>After exporting, you can either use the backup file to restore your settings on this site again or another WordPress site.</p>
            <form method=’post’>
                <p class=»submit»>
                    <?php wp_nonce_field(‘ie-export’);
                    <input type=’submit’ name=’export’ value=’Backup all options’/>
                </p>
            </form>
        </div>
        <?php
    }
    elseif (check_admin_referer(‘ie-export’)) {
 
        $blogname = str_replace(» «, «», get_option(‘blogname’));
        $date = date(«mdY»);
        $json_name = $blogname.»-«.$date;
 
        $options = get_alloptions();
 
        foreach ($options as $key => $value) {
            $value = maybe_unserialize($value);
            $need_options[$key] = $value;
        }
 
        $json_file = json_encode($need_options);
 
        ob_clean();
        echo $json_file;
        header(«Content-Type: text/json; charset=» . get_option( ‘blog_charset’));
        header(«Content-Disposition: attachment; filename=$json_name.json»);
        exit();
    }
}

Задача этой страницы довольно проста: она отображает форму загрузки и анализирует данные из файла JSON для резервного копирования наших параметров.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
function ie_import_option_page() {
    ?>
    <div class=»wrap»>
        <div id=»icon-tools» class=»icon32″><br /></div>
        <h2>Import</h2>
        <?php
            if (isset($_FILES[‘import’])) {
                // Do something if a file was uploaded
            }
        ?>
        <p>Click Browse button and choose a json file that you backup before.</p>
        <p>Press Restore button, WordPress do the rest for you.</p>
        <form method=’post’ enctype=’multipart/form-data’>
            <p class=»submit»>
                <?php wp_nonce_field(‘ie-import’);
                <input type=’file’ name=’import’ />
                <input type=’submit’ name=’submit’ value=’Restore’/>
            </p>
        </form>
    </div>
    <?php
}

Как и страница экспорта, мы создаем форму, но на этот раз мы добавляем кнопку «Обзор», чтобы пользователь мог выбрать нужный файл и отправить его.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
if (isset($_FILES[‘import’])) {
    if ($_FILES[‘import’][‘error’] > 0) {
        wp_die(«Error happens»);
    }
    else {
        $file_name = $_FILES[‘import’][‘name’];
        $file_ext = strtolower(end(explode(«.», $file_name)));
        $file_size = $_FILES[‘import’][‘size’];
        if (($file_ext == «json») && ($file_size < 500000)) {
            $encode_options = file_get_contents($_FILES[‘import’][‘tmp_name’]);
            $options = json_decode($encode_options, true);
            foreach ($options as $key => $value) {
                update_option($key, $value);
            }
            echo «<div class=’updated’><p>All options are restored successfully.</p></div>»;
        }
        else {
            echo «<div class=’error’><p>Invalid file or file size too big.</p></div>»;
        }
    }
}

Если процесс загрузки получает ошибки, просто верните сообщение «Произошла ошибка». Если нет, получите расширение и размер файла, сохраните их в переменных и проверьте их. Мы принимаем только файлы с расширением «.json» и размером менее 500000 байт. Если файл не подходит, просто отобразите сообщение об ошибке «Неверный размер файла или размер файла слишком велик». Примечание: вы можете изменить этот размер, как вам нужно.

Затем переменная $encode_options получит все содержимое этого файла. Поскольку файл содержит данные JSON, перед его использованием мы должны сначала декодировать. Для этого мы используем json_decode со вторым параметром, который имеет истинное значение, поэтому эта функция возвращает значение массива. Со значением массива мы начинаем цикл по нему. На каждой итерации мы будем обновлять данные тем же ключом и его значением. В конце концов, все наши параметры будут восстановлены в точности так, как они были, и будет отображено успешное сообщение.

А вот и весь код функции импорта:

01
02
03
04
05
06
07
08
09
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
function ie_import_option_page() {
    ?>
    <div class=»wrap»>
        <div id=»icon-tools» class=»icon32″><br /></div>
        <h2>Import</h2>
        <?php
            if (isset($_FILES[‘import’]) && check_admin_referer(‘ie-import’)) {
                if ($_FILES[‘import’][‘error’] > 0) {
                    wp_die(«Error happens»);
                }
                else {
                    $file_name = $_FILES[‘import’][‘name’];
                    $file_ext = strtolower(end(explode(«.», $file_name)));
                    $file_size = $_FILES[‘import’][‘size’];
                    /* Ensure uploaded file is JSON file type and the size not over 500000 bytes
                     * You can modify the size you want
                     */
                    if (($file_ext == «json») && ($file_size < 500000)) {
                        $encode_options = file_get_contents($_FILES[‘import’][‘tmp_name’]);
                        $options = json_decode($encode_options, true);
                        foreach ($options as $key => $value) {
                            update_option($key, $value);
                        }
                        echo «<div class=’updated’><p>All options are restored successfully.</p></div>»;
                    }
                    else {
                        echo «<div class=’error’><p>Invalid file or file size too big.</p></div>»;
                    }
                }
            }
        ?>
        <p>Click Browse button and choose a json file that you backup before.</p>
        <p>Press Restore button, WordPress do the rest for you.</p>
        <form method=’post’ enctype=’multipart/form-data’>
            <p class=»submit»>
                <?php wp_nonce_field(‘ie-import’);
                <input type=’file’ name=’import’ />
                <input type=’submit’ name=’submit’ value=’Restore’/>
            </p>
        </form>
    </div>
    <?php
}

В примере плагина я создал get_alloptions копию всех параметров сайта с помощью get_alloptions WordPress get_alloptions . Если вы хотите применить это к вашим собственным конкретным параметрам, просто сделайте это так:

1
2
$options = array(‘your_option1_name’ => get_option(‘your_option1_name’), ‘your_option2_name’ => get_option(‘your_option2_name’);
$json_file = json_encode($options);

И перейдите к следующему шагу, как указано выше. Вы можете свободно выбирать, какие параметры вы хотите сделать резервную копию!


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

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