Статьи

7 простых правил: лучшие практики разработки плагинов WordPress

В последнее время мы много говорили о « передовой практике » здесь, на Wptuts. Сегодня мы рассмотрим некоторые важные рекомендации по созданию плагина WordPress. Следуйте этим правилам, от советов по безопасности до хитростей в области имен, и вы не ошибетесь. Являетесь ли вы начинающим разработчиком нового плагина или проверенным временем ветераном, эти простые правила и предложения сделают вас лучшим разработчиком (и сообщество поблагодарит вас за это!)


Да, стратегия. Попробуйте этот контрольный список:

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

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


Что вы предпочитаете, это?

1
2
3
4
5
6
7
8
function parsefile($imagedata,$file){
if(!in_array($imagedata[‘mime’], array(‘image/jpeg’,’image/png’,’image/gif’))){
  $result[‘error’]=’Your image must be a jpeg, png or gif!’;
  }elseif(($file[‘size’]>200000)){
  $result[‘error’]=’Your image was ‘.$file[‘size’].’
  }
  return $result;
}

Или это?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
/*
processes the uploaded image, checking against file type and file size
*/
function parse_file($image_data, $file){
 
  if(!in_array($image_data[‘mime’], unserialize(TYPE_WHITELIST))){
   
    $result[‘error’] = ‘Your image must be a jpeg, png or gif!’;
     
  }elseif(($file[‘size’] > MAX_UPLOAD_SIZE)){
   
    $result[‘error’] = ‘Your image was ‘ .
     
  }
     
  return $result;
 
}

Простые вещи, такие как постоянный интервал, отступы, информативное именование переменных и краткие комментарии — это хорошее место для начала. Это единственное отличие в приведенных выше примерах. WordPress имеет отличное руководство по стандартам кодирования. Если вы кодируете по стандарту, ваш код будет легче понять, отредактировать и отладить.

Существует два способа создания плагина WordPress: в виде набора функций или в виде класса. Имейте в виду, что функции в вашем плагине добавляются в глобальное пространство имен со всеми другими функциями без пространств имен, что означает, что если у вас есть функция с именем plugin_init, то она, вероятно, будет конфликтовать с той же функцией, написанной кем-то другим в какой-то момент. точка. Очевидный способ решить эту проблему — добавить префикс имени функции к чему-то уникальному. Мне нравится использовать первые буквы имени моего плагина, поэтому, если бы у меня был плагин My ​​Great Plugin, я бы вызвал вышеуказанную функцию mgp_plugin_init, и то же самое для остальных моих функций.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
class my_class{
 
  function hello_world(){
 
    return ‘Hello World!’;
   
  }
 
  function goodbye_world(){
 
    return ‘Goodbye World!’;
   
  }
     
}

Затем вы можете получить доступ к вашим методам класса в его собственном пространстве имен:

1
$my_new_plugin = new my_class();

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

Вы должны особенно ознакомиться с:

Если вы используете функцию, такую ​​как wp_insert_post , WordPress очистит эти данные для вас. Аналогично, если вы используете методы базы данных $ wpdb-> insert или $ wpdb-> update, WordPress очистит данные. Но если вы решите обращаться к базе данных более напрямую с помощью чего-то вроде $ wpdb-> get_result, то вам следует использовать wpdb-> prepare, чтобы предотвратить инъекции sql вредоносного кода.

Вместо того:

1
2
3
$admin_posts = $wpdb->get_results(
  «SELECT ID, post_title FROM $wpdb->posts WHERE post_status = ‘publish’ AND post_author = 1»
  );

Вы бы использовали:

1
2
3
4
$admin_posts = $wpdb->get_results($wpdb->prepare(
  «SELECT ID, post_title FROM $wpdb->posts WHERE post_status = %s AND post_author = %d»,
  ‘publish’, 1
  ));

В приведенном выше примере% s является заполнителем для ввода строки (публикация), а% d является заполнителем для ввода чисел (1). Вы можете использовать столько заполнителей, сколько вам нужно.

Важно знать, что когда форма или URL-адрес публикуются обратно в WordPress, на самом деле это был ваш сайт WordPress, а не какой-либо сторонний или злонамеренный агент. Чтобы позаботиться об этом аспекте безопасности, мы используем одноразовые номера . Одноразовый номер — это число, используемое один раз.

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

1
wp_nonce_field(‘my_nonce’, ‘my_nonce_submit’);

Поскольку теперь это скрытое поле в нашей форме, оно будет возвращено нам при отправке формы. Затем мы можем проверить правильность одноразового номера, используя wp_verify_nonce :

1
wp_verify_nonce($_POST[‘my_nonce_submit’], ‘my_nonce’) )

Это вернет true, если nonce подтвердит.

Для URL-адреса (ссылки в электронных письмах, URL-адреса браузера) вы можете создать необязательный URL-адрес с помощью wp_nonce_url :

1
$nonced_url = wp_nonce_url(‘http://my_site.com?action=register&id=123456’, ‘register_nonce’);

Это создаст URL, как это …

http://my_site.com?action=register&id=123456&_wpnonce=250d696dc6

… которую вы можете отправить в электронном письме с подтверждением регистрации. Затем вы проверите входящий URL для одноразового номера с тем же идентификатором, используя функцию check_admin_referer, и продолжите проверку, если true.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
if($_GET[‘action’] == ‘register’){
 
  if(check_admin_referer(‘register_nonce’)){
   
    if(verify_id($_GET[‘id’])){
     
      echo ‘Registration verified!’;
       
    }
   
  }else{
   
    echo ‘Registration verification FAILED!’;
   
  }
}

Интернет полон веб-сервисов, предоставляющих нам все — от прогнозов погоды до котировок акций до последних твитов из Twitter. Самый эффективный способ для плагина получить доступ к удаленным данным — это использовать HTTP API, который будет обрабатывать ваш запрос в фоновом режиме, используя самый эффективный из пяти возможных удаленных методов, которые предоставляет PHP. Это как универсальный магазин для доступа к веб-сервису.

Это использует метод wp_remote_get (функция-обертка класса HTTP), чтобы получить тело страницы:

1
2
3
4
5
6
7
$page_data = wp_remote_get(‘http://site.com/page’);
 
if($page_data[‘response’][‘code’] == 200){
 
  $body = $page_data[‘body’];
  
}

То же самое с wp_remote_post для входа в систему:

1
2
3
4
5
6
$args = array(
  ‘login’ => ‘login_name’,
  ‘password’ => ‘my_password’
  );
 
$response = wp_remote_post(‘http://site.com/login’, $args);

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

Все это очень хорошо объясняется в этой статье wp.tutsplus Тома Макфарлина и здесь, в кодексе WordPress .


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

1
2
3
4
5
6
7
8
9
if(is_admin()){
   
  //load my plugin stuff for the admin pages
   
}else{
 
  //load my plugin stuff for the frontend
   
}

Когда вы активируете плагин, вы увидите ссылку деактивации на странице администрирования плагинов. Но деактивация только останавливает плагин от работы. После деактивации вы получаете ссылку для удаления. Ссылка на удаление — это ключ к приведению себя в порядок. Это действительно должно быть названо деинсталляцией.

Если вы создадите файл с именем uninstall.php в том же каталоге, что и подключаемый модуль, код в этом файле будет запущен, когда пользователь нажмет кнопку «Удалить».

1
2
3
4
5
if(defined(‘WP_UNINSTALL_PLUGIN’) ){
 
  //delete options, tables or anything else
   
}

Приведенный выше код проверяет константу WP_UNINSTALL_PLUGIN, которую WordPress устанавливает, когда вы нажимаете клавишу delete. Затем вы можете продолжить удаление любых параметров или пользовательских таблиц, которые ваш плагин создал, когда он был активирован.


Отладчик WordPress найдет ошибки в вашем коде, и, хотя они могут не дать сбоя, ваш плагин все равно следует исправить, чтобы убедиться, что вы делаете все правильно. Итак, включите отладку WordPress, поместив это в ваш /wp-config.php:

1
define(‘WP_DEBUG’, TRUE);

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

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

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

Если у вас есть проблемы, спросите других. Существует множество форумов для решений WordPress. Одним из моих любимых является WordPress Ответы из замечательной сети Stack Exchange.

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