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

| Скачать исходники |

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

Прежде чем мы начнем

Если в целом, то у нас будет 2 секции, одна из которых будет отвечать за экспорт данных для бэкапа, а вторая — для импорта данных и восстановления информации. Так что работу этих 2 секций я продемонстрирую вам, создав простой плагин.

Шаг 1. Заголовок плагина

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

/*
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
*/

И вот какой результат мы получим:

Шаг 2. Создаем администраторский раздел страницы

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

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 — это функция обратного вызова для вывода контента на странице.
  • С тем, чтобы разделить 2 основных функциональности в 2 разных секции, мы используем add_submenu_page для добавления их к меню верхнего уровня, которое мы создали на предыдущем этапе. Как вы можете видеть, каждая функция также обеспечена функцией обратного вызова, чтобы отображать контент так, как это делает функция add_menu_page. Не имеет важного значения, объедините ли вы эти функции в одном месте. Я просто сделал такую структуру, чтобы было понятнее.
  • Потом мы добавляем register_ie_option в admin_menu с тем, чтобы включать нашу целевую функцию всякий раз, когда происходит вызов этого действия.

Шаг 3. Создаем возможность экспорта

Я хочу создать страницу экспорта примерно такого вида:

Создаем "скелет" страницы для опции экспорта

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. Note that it do <b>NOT</b> contain posts, pages, or any relevant data, just your all options.</p>
			<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.

Задаем имена для генерируемых файловых имен

$blogname = str_replace(" ", "", get_option('blogname'));
$date = date("m-d-Y");
$json_name = $blogname."-".$date;

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

Включаем опции бэкапа и функции кодировки данных JSON

$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.
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-данных в 2 важных функции: ob_clean() и exit() — чтобы убедиться, что наш сгенерированный JSON-файл содержит только данные в формате JSON, и что json_file не содержит никаких других данных.

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

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

Вот как выглядит весь код функции экспорта данных:

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. Note that it do <b>NOT</b> contain posts, pages, or any relevant data, just your all options.</p>
			<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("m-d-Y");
		$json_name = $blogname."-".$date; // Namming the filename will be generated.

		$options = get_alloptions(); // Get all options data, return array

		foreach ($options as $key => $value) {
			$value = maybe_unserialize($value);
			$need_options[$key] = $value;
		}

		$json_file = json_encode($need_options); // Encode data into json data

		ob_clean();
		echo $json_file;
		header("Content-Type: text/json; charset=" . get_option( 'blog_charset'));
		header("Content-Disposition: attachment; filename=$json_name.json");
		exit();
	}
}

Шаг 4. Создаем возможность импорта

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

Создаем "скелет" страницы импорта

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
}

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

Валидация и обновление файла JSON

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>";
		}
	}
}

Если в процессе выгрузки появились ошибки, просто выскочит сообщение "An error has occurred". Если ошибок не было, получаем расширение и размер файла, загружаем эти сведения в переменные и проверяем их. Принимаем только файлы с расширением ".json" и размером менее 500 000 байт. Если файл этим критериям не соответствует, то просто отображается сообщение об ошибке: "Invalid file or file size too big." Примечание: Размер файлы вы можете настроить самостоятельно, если понадобится.

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

И вот как выглядит весь код для функции импорта данных:

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']; // Get the name of file
					$file_ext = strtolower(end(explode(".", $file_name))); // Get extension of file
					$file_size = $_FILES['import']['size']; // Get size of file
					/* 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 для WordPress. Если же вам надо применить такой механизм бэкапа к своим конкретным нуждам, то просто сделайте следующее:

$options = array('your_option1_name' => get_option('your_option1_name'), 'your_option2_name' => get_option('your_option2_name');
$json_file = json_encode($options);

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

Заключение

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

Надеюсь, данное руководство было вам полезным, сообщите ваши мысли по этому поводу в комментариях и спасибо за прочтение!

Источник: WP.tutsplus.com

Вам понравился материал?

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

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.