PHP

Пишем плагин WordPress

Здравствуй уважаемый читатель, в этой статье я хочу на примере показать, как самостоятельно можно написать плагин для WordPress. Сразу скажу, что статья большая, разбивать ее на несколько частей я намеренно не стал. Сначала определимся с тем, что такое плагин WordPress, и зачем он нужен. Тебе читатель наверняка известна популярная и бесплатная система управления сайтом WordPress. Так вот разработчики WordPress реализовали гибкую систему плагинов к этой платформе. Другими словами, если что то не хватает в движке WordPress то можно воспользоваться одним из множества плагинов и функция, которой не хватало, будет доступна. Например, хочу я, чтобы у меня на сайте была реализована форма обратной связи, такой функции WordPress по умолчанию не предоставляет, поэтому я скачиваю популярный плагин Contact Form 7, активирую его и получаю готовую форму обратной связи.

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

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

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

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

Задачи плагина:

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

Пишем плагин WordPress собственными руками (Шаг 1)

В директории плагинов …\wp-content\plugins\ создадим каталог и дадим ему имя my_plagin
В созданный каталог добавим файл my_plagin.php, кодировка файла должна быть uft-8

Теперь откроем данный файл и запишем в него информацию необходимую для опознания плагина платформой WordPress:
<?php 
/* 
   Plugin Name: Каталог для интернет магазина 
   Author: Mark Avdeev 
   Author URI: www
*/ 
?>

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

Пишем плагин WordPress собственными руками (Шаг 2)

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

Для того, чтобы после активации плагина, в меню «Параметры», появилась ссылка на меню настроек нашего плагина, мы напишем функцию catalog_admin_menu внутри, которой выполним команду add_options_page, передав необходимые параметры.
function catalog_admin_menu(){
    add_options_page('Каталог', 'Каталог', 8, basename(__FILE__), 'create_catalog');
}

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

Добавим в тело скрипта строку , отвечающую за вывод пункта в меню.
add_action('admin_menu', 'catalog_admin_menu');

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

Настройки плагина

Создадим в скрипте нашего плагина функцию create_catalog(). В коде функции будет выполняться вывод формы настроек, создание новой таблицы и обработка csv файла. Сначала я приведу полный код этой функции.<.p>
<?php 
function create_catalog() {
global $wpdb;
    if ($_REQUEST['open_file']) {
    //если нажата кнопка "загрузить каталог"
        if ($_FILES['file']['name']!='' && $_FILES['file']['error']==0){ //проверяем загрузился указаный фаил или нет
            $info=pathinfo($_FILES['file']['name']);
            //копируем полученный csv фаил в папку catalog в корне сайта
            if (copy($_FILES['file']['tmp_name'],$_SERVER['DOCUMENT_ROOT'].'/catalog/CatalogPard.'.$info['extension'])){
                // создаем в базе таблицу, если же он есть то пропускаем этот шаг.
            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        
               $table_name = $wpdb->prefix."catalog_pard";
                $sql = "DROP TABLE `".$table_name."`";
                $wpdb->query($sql);
                if($wpdb->get_var("SHOW TABLES LIKE $table_name") != $table_name){
                     $sql = "CREATE TABLE IF NOT EXISTS `$table_name` (
                              `id` int(11) NOT NULL AUTO_INCREMENT,
                              `field1` varchar(40) NOT NULL,
                              `field2` varchar(40) NOT NULL,
                              `field3` varchar(40) NOT NULL,
                              `field4` varchar(40) NOT NULL,
                              `field5` varchar(40) NOT NULL,                            
                              PRIMARY KEY (`id`)
                            ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
                
                      dbDelta($sql);
                     echo '<div id="message" class="updated fade"><p><strong>Каталог обновлен.</strong></p></div>';
                 }
                                        
                $file = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/catalog/CatalogPard.'.$info['extension']);
                    if ($file){ 
                        $strings = explode("\n",$file); // построчно разбиваем фаил
                            for($i=0; $i<(count($strings)-1); $i++){//из каждой строки вырезаем значения полей
                                    if($found = explode(";",iconv("WINDOWS-1251","UTF-8", $strings[$i]))){
                                        //записываем их в базу
                                        $sql='INSERT INTO `'.$table_name.'` VALUES("","'.$found[0].'","'.$found[1].'","'.$found[2].'","'.$found[3].'","'.$found[4].'");';
                                        dbDelta($sql);  
                                }       
                            }
                    
                
                }
                    else echo "Не найден указаный CSV фаил! <font color='blue'>".$_SERVER['DOCUMENT_ROOT'].'/catalog/CatalogPard.'.$info['extension']."</font>";
                
            } 
            else echo "Неудалось передать указаный фаил.";
        }
        else $error="<font color='red'>Фаил не загружен!</font> Возможно вы не указали какой фаил хотите загрузить.";
    }
    
    ?>
    <div class="wrap">
    <h2>Каталог </h2>
    <form method="post" action="" enctype="multipart/form-data">
        <h3>Выполнить загрузку каталога </h3>
        <em>Для обновления каталога, выберите фаил с расширением <font color="blue">.csv</font>, расположенного на вашем компьютере.<em/>
        <br/>
        <br/><input type="file"   name="file" />
        <br/>
        <br/>
        <input type="submit" name="open_file" value="Загрузить каталог" />
        <br/>
        <br/>
        <?=$error?>
   </form>  
    </div> 
<?
}
?>

Функция получилась объемная, т.к. на ее плечах лежит выполнение не одного маленького процесса, а сразу трех серьезных. Много говорить тут не о чем, но тем не менее я выделю несколько частей этой функции и объясню что каждая из них делает. Начнем с самой простой части, которая выводит формы настроек:
<div class="wrap">
    <h2>Каталог </h2>
    <form method="post" action="" enctype="multipart/form-data">
        <h3>Выполнить загрузку каталога </h3>
        <em>Для обновления каталога, выберите фаил с расширением .csv, расположенного на вашем компьютере.<em/>
        
        <br/><input type="file"   name="file" />
        <br/><input type="submit" name="open_file" value="Загрузить каталог" />
        <?=$error?>
   </form>  
</div>

Тут все предельно просто, обычная форма, обычный HTML код, единственное, что нужно отметить это параметр enctype в теге form, он должен иметь значение multipart/form-data, для того чтобы форма могла получить выбранный фаил.
Второй кусочек кода, о котором я хочу сказать служит для удаления старой таблицы плагина из бд и создания новой. Выглядит он следующим образом:
<?
$table_name = $wpdb->prefix."catalog_pard";
$sql = "DROP TABLE `".$table_name."`";
$wpdb->query($sql);
if($wpdb->get_var("SHOW TABLES LIKE $table_name") != $table_name){
$sql = "CREATE TABLE IF NOT EXISTS `$table_name` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
`field1` varchar(40) NOT NULL,
`field2` varchar(40) NOT NULL,
 `field3` varchar(40) NOT NULL,
 `field4` varchar(40) NOT NULL,
 `field5` varchar(40) NOT NULL,                         
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
  dbDelta($sql);
 echo '<div id="message" class="updated fade"><p><strong>Каталог обновлен.</strong></p></div>';
}
?>

Если вы присмотритесь, то увидите, что тут используются не стандартные php команды для работы с бд, а команды движка WordPress, такие как dbDelta и методы глобального объекта $wpdb для работы с бд. Если почитать руководство от WordPress, то можно найти много полезной информации по работе с бд средствами этого движка. В данном примере используется лишь малая часть заложеного функционала, а именно:

Мы получаем префикс таблиц указаный в файле конфигурации сайта с помощью метда $wpdb->prefix.
Выполняем запрос к базе $wpdb->query(), удаляя старую таблицу плагина.
$wpdb->get_var() получаем имя таблицы из всех имеющихся, для проверки.
Снова выполняем запрос к базе, но уже с использованием функции dbDelta(), созавая новую таблицу каталога с импровизированными полями field1- field5.
Оставшаяся часть кода, сохраняет полученный CSV, для дальнейшего парсинга, и в результате записывает в только что созданую таблицу, полученые данные каталога.

Пишем плагин WordPress собственными руками (Шаг 3)

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

Так вот shortcode это конструкция вида [name atr1="1" atr2="2"] где name –это обозначение шорткода, а atr1 и atr2 параметры, причем параметров может быть сколько угодно.

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

В нашем случае, нам понадобится лишь указать название шорткода, и в плагине произвести вывод каталога на его месте. Вставим в фаил плагина, функцию вывода коталога и команду обработки шорткода:
function catalog_print(){
        global $wpdb;
        $table_name = $wpdb->prefix."catalog";
        $sql = "SELECT * FROM ".$table_name;
         
        $result = $wpdb->get_results($sql, ARRAY_A);

        $rrr.="<table><tr>"; 
         foreach($result[0] as $name=>$value){
            $rrr.="<th>".$name."</th>";
         }
        $rrr.="</tr>";  
         foreach($result as $row){
            $rrr.="<tr>";  
             foreach($row as $name=>$value){
                $rrr.="<td>".$value."</td>";
             }
             $rrr.="</tr>";  
            }
            $rrr.="</table>"; 
         return $rrr;  
}

add_shortcode('catalog', 'catalog_print');

Теперь создадим страницу средствами движка Worpress и в ее тело вставим конструкцию [catalog] , если вы все сделали правильно, то при просмотре сайта в том месте где вставили [catalog], вы увидите содержимое таблицы каталога из базы данных.

Ну вот мы и выполнили все поставленные задачи написав простенький плагин для WordPressa. Я думаю данный плагин будет очень полезен для изучения азов программирования плагинов, т.к. освещает проблемы работы с базой данный и работы с файлами, а также дает возможность управлять процессом с помощью панели администрирования.

Спасибо за внимание, надеюсь статья окажется полезной.
Теги:
плагин, WordPress
Добавлено: 29 Сентября 2013 07:47:15 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...