Статьи

Ваш первый плагин для WordPress: простая оптимизация

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


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


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

«Всегда создавайте список того, что вы хотите, чтобы ваш плагин действительно делал, прежде чем писать какой-либо код!»

  • «rsd_link» — действительно простая ссылка для обнаружения
  • «wlwmanifest_link » — ссылка Windows Live Writer
  • «wp_generator» — номер версии WordPress
  • «wptexturize»фигурные цитаты
  • «wp_filter_kses» — HTML в профилях пользователей
  • Вставьте теги записей в <head> в качестве ключевых слов
  • Вставьте пост отрывок в <head> как описание

Для начала перейдите в папку с плагинами («/ wp-content / plugins /») и создайте новую папку. Мы будем называть нашу «простой оптимизацией». Далее внутри этой папки нам нужно создать два файла. Первым будет фактический файл плагина (с именем «main.php» ), а вторым будет обязательный README ( «readme.txt» ). Мы пока оставим readme.txt пустым; поэтому откройте main.php в предпочитаемом вами текстовом редакторе и скопируйте код ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
    <?php
/*
Plugin Name: Name Of The Plugin
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: A brief description of the Plugin.
Version: The Plugin’s Version Number, eg: 1.0
Author: Name Of The Plugin Author
Author URI: http://URI_Of_The_Plugin_Author
License: A «Slug» license name eg GPL2
.
Any other notes about the plugin go here
.
*/
?>

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


Первые две функции, которые мы собираемся реализовать, также будут самыми простыми. По умолчанию WordPress добавляет несколько мета-тегов в раздел <head> вашего блога, но простой факт в том, что эти мета-теги не имеют абсолютно никакого значения; поэтому мы просто собираемся остановить WordPress от их добавления. Каждый раз, когда WordPress выполняет действие, оно называется фильтром или действием , и мы можем либо удалить эти фильтры и действия, либо манипулировать ими (вы можете найти здесь список всех фильтров и все действия здесь ). В этом случае мы хотим удалить различные действия, которые добавляют эти мета-теги.

Для этого мы используем очень простую функцию под названием «remove_action (‘action’, ‘function’)» . Эта функция удалит функцию, объявленную во втором параметре, из действия, первого параметра.

1
// Clean up wp_head // Remove Really simple discovery link remove_action(‘wp_head’, ‘rsd_link’);

Точно такой же принцип применим к двум фильтрам, которые мы собираемся удалить:

1
2
3
4
5
6
// Remove curly quotes
remove_filter(‘the_content’, ‘wptexturize’);
remove_filter(‘comment_text’, ‘wptexturize’);
 
// Allow HTML in user profiles
remove_filter(‘pre_user_description’, ‘wp_filter_kses’);

Теперь, когда мы избавились от этого раздувания, давайте удостоверимся, что в нашем блоге есть базовая SEO; это значит, давайте удостоверимся, что у нас есть ключевые слова на страницу, которые соответствуют этой странице, и изменим описание, чтобы оно больше соответствовало статье. Для наших ключевых слов мы собираемся взять теги текущей страницы / поста. Это делается очень просто с помощью функции «wp_get_post_tags ()» . wp_get_post_tags вернет массив тегов из текущего поста. Затем мы можем легко отформатировать этот массив в строку и поместить его в наш заголовок (внутри функции «wp_head ()» , которая уже должна быть в каждой теме), прикрепив нашу функцию к действию wp_head.

Давайте начнем с создания новой функции tags_to_keywords () , и внутри этой функции мы напишем простой оператор if , который проверяет, является ли текущая страница отдельным постом или страницей (с использованием функций WP: is_single). () и is_page () ). Далее мы создадим переменную внутри этого оператора if с именем $ tags и установим ее содержимое в функцию wp_get_post_tags () ; однако для того, чтобы эта функция работала, нам нужно передать параметр «post_id». Самый простой способ получить это — это глобализировать переменную WP $ $ post, которая содержит идентификатор записи ( $ post-> ID , $ post — это объект, поэтому мы называем его значения так).

1
2
3
4
5
6
7
8
// SEO
// add tags as keywords
function tags_to_keywords(){
    global $post;
    if(is_single() || is_page()){
        $tags = wp_get_post_tags($post->ID);
    }
}

Далее мы будем использовать foreach для фильтрации данных $ tags и создания нового массива только с той информацией, которая нам нужна ( $ tag_array ). После этого мы развернем массив в строку и отделим каждый элемент от массива запятой и пробелом ( $ tag_string ). Затем мы создадим еще один оператор if, который проверяет, имеет ли значение $ tag_string (имеется в виду, есть ли у нас какие-либо теги для публикации) и, если это так, выводит окончательный HTML-код.

Последнее, что нам нужно сделать сейчас, это присоединить нашу новую функцию с помощью действия wp_head. Для этого мы будем вызывать add_action (‘action’, ‘function’) и передавать ему параметры «wp_head» и «tags_to_keywords» (в таком порядке).

Чтобы еще больше увеличить SEO, мы добавим метаданные описания в заголовок, используя тот же метод, что и ключевые слова. Как только мы переписаем оператор if, мы собираемся создать новую переменную $ all_post_content и заполнить ее с помощью функции WP wp_get_single_post () (и передать параметр $ post-> ID). Это даст нам объект, полный всех данных о нашем посте. С помощью этой переменной мы можем создать описание, используя фактическое содержание сообщения, но мы собираемся сократить его до ста символов, используя функцию substr ($ excerpt). А затем мы просто выведем HTML-код с записанной в нем выдержкой. (При желании вы также можете добавить инструкцию else и вывести описание вашего блога с помощью функции get_bloginfo (‘description’) .)

01
02
03
04
05
06
07
08
09
10
11
12
13
// add except as description
function excerpt_to_description(){
    global $post;
    if(is_single() || is_page()){
        $all_post_content = wp_get_single_post($post->ID);
        $excerpt = substr($all_post_content->post_content, 0, 100).’
        echo «<meta name=’description’ content='».$excerpt.»‘ />\r\n»;
    }
    else{
        echo «<meta name=’description’ content='».get_bloginfo(‘description’).»‘ />\r\n»;
    }
}
add_action(‘wp_head’,’excerpt_to_description’);

Последняя особенность нашего плагина — оптимизация таблиц нашей базы данных путем устранения накладных расходов (бесполезные / лишние данные в таблице SQL, созданной путем манипулирования базой данных). Для начала мы создадим новую функцию ( optimize_database ), и внутри нее мы будем вызывать глобальную переменную WPDB ( $ wpdb ). Таким образом, мы можем взаимодействовать с базой данных, без необходимости повторно вводить наши данные аутентификации. В $ wpdb есть несколько методов, которые вы можете использовать для взаимодействия и извлечения информации из базы данных ( полный список здесь ), но мы будем использовать только один, get_results . Использование get_results с параметрами «SHOW TABLES» и «ARRAY_A» вернет нам ассоциативный массив всех имен таблиц в базе данных. На этом этапе мы можем использовать foreach для циклического прохождения каждого из значений массива (используя array_values для получения имени таблицы, из-за того, как оно наслоено функцией) и использовать другой метод $ wpdb, запрос для запуска команды optimize (» ОПТИМИЗАЦИЯ ТАБЛИЦЫ _____ «).

Хотя эта функция работает, она никогда не будет работать, потому что WordPress не знает, как ее запустить. К счастью, в WordPress есть функция cron, которая планирует запуск функций через определенные промежутки времени (ежедневно, еженедельно и т. Д.); это идеально для нас, так как мы хотим часто оптимизировать нашу базу данных. Чтобы использовать Cron, мы собираемся создать новую функцию ( simple_optimization_cron_on ) и заполнить ее другим вызовом функции wp_schedule_event () . Для работы wp_schedule_event требуется три вещи: время выполнения, интервал между каждым запуском и функция для вызова; поэтому мы передадим ему параметры: ‘time ()’ (мы будем предполагать, что всякий раз, когда создается событие cron, самое подходящее время для вызова функции), ‘daily’, ‘optimize_database’ в этом порядке.

Отлично, теперь у нас есть функция optimize_database , добавляемая в список cron WP, или если бы мы вызывали функцию simple_optimization_cron_on . Это действительно небезопасно и плохая практика вызывать ваши собственные функции добавления событий, потому что через некоторую произвольную систему событий это может привести к тому, что функция будет вызываться несколько раз. В WordPress есть набор специальных хуков для плагинов для решения этой проблемы: register_activation_hook и register_deactivation_hook . Эти функции вызываются, когда плагин включен (активирован) и выключен (деактивирован). Таким образом, наша функция cron может быть добавлена ​​только один раз. Теперь у нас есть возможность удалить событие cron, если плагин перестает использоваться. Для работы этим функциям нужны две части информации: URL-адрес файла, который имеет функции активации и деактивации (здесь 99% времени «__FILE__» будет работать идеально), и имя функции активации и деактивации. Мы также создадим новую функцию ( simple_optimization_cron_off ) и заполним ее вызовом другой функции ( wp_clear_scheduled_hook (‘optimize_database’) ), чтобы удалить наше событие cron.


Последнее, что нам нужно сделать для нашего нового плагина, это заполнить файл readme.txt. Файл readme.txt используется каталогом плагинов WordPress для отображения всей предоставленной вами информации о вашем плагине. Лучший способ научиться писать эффективный файл readme.txt — это загрузить файл по умолчанию из WP и изменить его в соответствии с вашим плагином. Так как у нас все было так просто, вот чем я в итоге оказался:


Вы только что успешно написали свой первый плагин WordPress, который работает и готов для каталога плагинов WP. Кроме того, вы узнали о фильтрах и действиях, используя глобальные объекты WP, много о номенклатуре WordPress, о том, как взаимодействовать с базой данных, событиях cron и хуках активации / деактивации. Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий, и я отвечу, как только смогу.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
/*
Plugin Name: Simple Optimization
Plugin URI: http://net.tutsplus.com
Description: A super-simple plugin to improve your blog
Version: 1.0
Author: Jonathan Wolfe
Author URI: http://fire-studios.com
License: GPL2
.
This plugin written for NETTUTS at http://net.tutsplus.com
.
*/
 
// Clean up wp_head
// Remove Really simple discovery link
remove_action(‘wp_head’, ‘rsd_link’);
// Remove Windows Live Writer link
remove_action(‘wp_head’, ‘wlwmanifest_link’);
// Remove the version number
remove_action(‘wp_head’, ‘wp_generator’);
 
// Remove curly quotes
remove_filter(‘the_content’, ‘wptexturize’);
remove_filter(‘comment_text’, ‘wptexturize’);
 
// Allow HTML in user profiles
remove_filter(‘pre_user_description’, ‘wp_filter_kses’);
 
// SEO
// add tags as keywords
function tags_to_keywords(){
    global $post;
    if(is_single() || is_page()){ // only run on posts or pages
        $tags = wp_get_post_tags($post->ID);
        foreach($tags as $tag){ // loop through each tag
            $tag_array[] = $tag->name;
        }
        $tag_string = implode(‘, ‘,$tag_array);
        if($tag_string !== »){ // it we have tags
            echo «<meta name=’keywords’ content='».$tag_string.»‘ />\r\n»;
        }
    }
}
add_action(‘wp_head’,’tags_to_keywords’);
// add except as description
function excerpt_to_description(){
    global $post;
    if(is_single() || is_page()){ // only run on posts or pages
        $all_post_content = wp_get_single_post($post->ID);
        $excerpt = substr($all_post_content->post_content, 0, 100).’
        echo «<meta name=’description’ content='».$excerpt.»‘ />\r\n»;
    }
    else{ // only run if not a post or page
        echo «<meta name=’description’ content='».get_bloginfo(‘description’).»‘ />\r\n»;
    }
}
add_action(‘wp_head’,’excerpt_to_description’);
 
//Optimize Database
function optimize_database(){
    global $wpdb;
    $all_tables = $wpdb->get_results(‘SHOW TABLES’,ARRAY_A);
    foreach ($all_tables as $tables){ // loop through every table name
        $table = array_values($tables);
        $wpdb->query(«OPTIMIZE TABLE «.$table[0]);
    }
}
function simple_optimization_cron_on(){
    wp_schedule_event(time(), ‘daily’, ‘optimize_database’);
}
function simple_optimization_cron_off(){
    wp_clear_scheduled_hook(‘optimize_database’);
}
register_activation_hook(__FILE__,’simple_optimization_cron_on’);
register_deactivation_hook(__FILE__,’simple_optimization_cron_off’);
?>