Задавайте вопросы по курсам WordPress

Класс для добавления опций к сайту

Предисловие к уроку

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

От слов к делу

Думаю с вступление закончили и первое что я вам дам это код самого класса.

<?php
	class optionsClass {
		var $option;
		var $value;
		var $autoload;
		var $new_value;
		var $prefix;
		
		var $db;
		var $error;
		
		function __construct($db, $prefix){ // создает таблицу в базе даных с нужным префиксом, сразу после подключения класса
			if(!$db || !$prefix){
				$this->error[] = 'Не хватает параметров';
			exit;
			}
			$this->db = $db;
			$this->prefix = $prefix;
			$createTable = '
				CREATE TABLE `'.$prefix.'_options` (
				  `option_id` bigint(20) unsigned zerofill NOT NULL AUTO_INCREMENT,
				  `option_name` varchar(64) DEFAULT NULL,
				  `option_value` longtext,
				  `autoload` varchar(20) DEFAULT NULL,
				  PRIMARY KEY (`option_id`)
				) ENGINE=MyISAM DEFAULT CHARSET=utf8;
			';
			$query = 'select * from `'.$prefix.'_options`';
			$result = mysql_query($query , $this->db);
			if($result === false){
				$result = mysql_query($createTable , $this->db);
			} 
		}
		
		function get_option( $option, $default='' ){ // достаем опции из базы
			$query = "select option_value from ".$this->prefix."_options WHERE option_name='".$option."'";
			$result = mysql_query($query , $this->db);
			$row = mysql_fetch_array($result);
			
			if($row['option_value']){ return $row['option_value']; }else{ $this->error[] = 'Опция не найдена'; return false; }
		}

		function add_option($option, $value, $autoload='yes'){
			if($this->is_name_options($option) == false){ // Добавляем опции
				$query = "INSERT INTO ".$this->prefix."_options (option_name, option_value, autoload) VALUES ('".$option."', '".$value."', '".$autoload."')";
				$result = mysql_query($query , $this->db);
				if(!$result){
					$this->error[] = 'Не удалось добавиь опцию в базу данных';
				}else{
					$this->error[] = 'Опция ("'.$option.'" => "'.$value.'") добавлена в базу данных в базу данных';
				}
			}else{
				$this->error[] = 'Имя не уникально';
				return false;
			}
			
		}
		
		function is_name_options($option_name){ // проверяем наицие опции в базе
			if(isset($option_name)){ 
				$query = "select * from ".$this->prefix."_options WHERE option_name='".$option_name."'";
				$result = mysql_query($query , $this->db);
				$row = mysql_fetch_array($result);
				if($row){ return true; }else{ return false; }
			}else{
				$this->error[] = 'Опция не задана';
			}
		}
		
		function update_option($option, $value){ // Обновляем опции
			if($this->is_name_options($option)){
				$query = "update ".$this->prefix."_options SET option_value='".$value."' WHERE option_name='".$option."'";
				$result = mysql_query($query , $this->db);
				if($result){ $this->error[] = 'Опция '.$option.' обновлена'; }else{ $this->error[] = 'Опция '.$option.' не обновлена'; }
			}else{
				$this->error[] = 'Нет такой опции ['.$option.'] в базе';
			}
		}

		function delete_option($option){ // удаляем опции
			if($this->is_name_options($option)){
			//echo $option; exit;
				$query = "delete from ".$this->prefix."_options WHERE option_name='".$option."'";
				//echo $query ;
				$result = mysql_query($query , $this->db);
				if($result){ $this->error[] = 'Опция '.$option.' удалена'; }else{ $this->error[] = 'Опция '.$option.' не удалена'; }
			}else{
				$this->error[] = 'Нет такой опции ['.$option.'] в базе';
			}
		}
		
		function load_alloptions(){ // вывести на экран все опции
			$query = "select option_name, option_value from ".$this->prefix."_options";
			$result = mysql_query($query , $this->db);
			while($row = mysql_fetch_array($result)){
					echo '[ '.$row['option_name'].' ] => [ '.$row['option_value'].' ]<br />';				
			}
		}
		
		function log(){ // лог операций и ошибок
			if($this->error){
				echo '<pre>';
				print_r($this->error);
				echo '</pre>';
			}
		}
	}
?>

Вот такой непростой класс, давайте рассмотрим все его методы по порядку.

Конструктор класса — проверяет, есть ли в базе данных таблица опций, если ее нет, то самостоятельно создает эту таблицу. Конструктор принимает переменную подключения к базе данных $db и переменную префикс таблиц $prefix. Если нет переменных $db или $prefix, то в свойство $error записывается сообщение об ошибке и программа останавливается.

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

Метод add_option($option, $value) необходим для добавления новых опций в базу, если опция с указанным именем уже существует, то в свойство $this->error добавляется сообщение, которое разработчик может вывести для себя или для посетителей сайта при помощи метода log().

Метод is_name_options() помогает проверить, есть ли опция с предложенным именем в таблице опций.

Метод update_option() обновляет данные в уже существующих опциях. Принимает 2 обязательных параметра $option и $value (имя опции и значение).

Метод класса delete_option() необходим для удаления ненужных опций, если такая существует в базе данных. Опция проверяется и если была найдена, то удаляется из базы по имени.

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

О методе log() мы уже говорили, этот метод предназначен для вывода всех сообщений, которые попали в массив свойства $this->error.

Работа с классом опций

Сейчас, когда мы рассмотрели все методы можно плавно перейти к работе с нашим классом.

Так как класс у нас работает через базу данных, то для начала нам необходимо ее создать и подключится, а таблицу уже создаст наш класс.

$db = mysql_connect('localhost', 'db', 'wp-admin');
if (!$db) {
	die('Could not connect: ' . mysql_error());
}

mysql_select_db( 'db-name', $db );

Далее подключаем наш класс и пробуем его использовать:

include './optionsClass.php';
	$prefix = 'cl';
	$obj = new optionsClass($db, $prefix);
	$obj->add_option('optionsName',12);
	//$obj->update_option('optionsName',13);
	//$obj->delete_option('optionsName');
	$obj->load_alloptions();
	$opt = $obj->get_option('optionsName');
	echo $opt;
	
	$obj->log();
mysql_close($db);

Поиграйте с методами класса и попробуйте с помощью методов добавлять новые опции, выводить их на экран, обновлять данные в опции, удалять опции. Обязательно попробуйте выводить сообщения при помощи метода log().

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

Скачать архив с примером

Если нашли неточности, пишите нам в комментариях и мы постараемся их исправить.


Купить хостинг WordPress
/* Репетитор по wordpress
Услуги репетитора онлайн. Список курсов которые я веду
  • Базовый курс по веб-дизайну;
  • Верстка сайтов;
  • Общий курс по CMS WordPress и продолжение курса по разработке шаблонов;
  • Разработка сайтов на PHP.
Подробнее читайте на странице репетитор по WordPress
*/

Николаенко Максим

Директор веб-студии ProGrafika. Занимаюсь разработкой, дизайном и продвижением веб-сайтов. Всегда рад новым читателям блога и хорошим клиентам.


Вам может также понравиться...

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Шаблоны для WordPress
Самый лучший хостинг в Украине
Стабильный хостинг для Drupal