Что такое WordPress хуки и как их использовать? Полезные советы по работе с хуками WordPress

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

ЧТО ТАКОЕ ХУК?

Для достижения определенного эффекта нам нужно слегка изменить принцип работы Wordpress. Некоторые модификации необходимо внести в файлы, которые были названы разработчиками файлами ядра – они нужны для того, чтобы Wordpress работал должным образом.
Но изменение файлов ядра – плохая идея: это может создать брешь в системе безопасности блога. Также, все модификации исчезнут, как только Вы обновите движок до новой версии.
Однако, расширение функциональности все же необходимо. Для этого разработчиками был придуман Plugin API.
Хуки являются одним из главных блоков для построения плагинов. Почти каждый подключаемый плагин использует хуки для расширения функциональности Wordpress.

КАК ИСПОЛЬЗОВАТЬ ХУКИ В ВАШЕМ БЛОГЕ

Пока Вы не написали свой плагин, Вы должны записать хуки в файл functions.php . Этот файл находится в директории wp-content/themes/yourtheme (где /yourtheme – директория, в которой находится текущая тема).
Вот пример, который показывает, как подключить Вашу пользовательскую функцию к функции ядра движка:
  1. add_action ( "publish_post" , "myCustomFunction" ) ;

В этом примере мы подключили пользовательскую функцию myCustomFunction() к функции ядра publish_post() . Функция myCustomFunction() будет выполняться при каждом выполнении функции publish_post() .
Конечно, мы можем также удалить хук, используя функцию remove_action() :

  1. remove_action ( "publish_post" , "myCustomFunction" ) ;

1. ОТКЛЮЧАЕМ АВТОМАТИЧСКОЕ ФОРМАТИРОВАНИЕ В WORDPRESS

Проблема.
Вы, наверное, уже замечали, что типограф Wordpress по умолчанию превращает «прямые» кавычки в «кривые» и делает другие мелкие изменения в форматировании поста.
Это хорошо, если блоггер размещает обычный контент (подразумеваются обычный текст и картинки). Но некоторые постят исходный код, чтобы потом его обсуждать, и они будут очень недовольны, когда из-за этих «кривых» кавычек интерпретатор иди компилятор выдадут им сообщения о синтаксических ошибках.
Решение.
Просто вставьте в файл functions.php нижеследующий код:
  1. function my_formatter($content ) {
  2. $new_content = "" ;
  3. $pattern_full = "{(\.*?\)}is" ;
  4. $pattern_contents = "{\(.*?)\}is" ;
  5. $pieces = preg_split ($pattern_full , $content , - 1 , PREG_SPLIT_DELIM_CAPTURE) ;
  6. foreach ($pieces as $piece ) {
  7. if (preg_match ($pattern_contents , $piece , $matches ) ) {
  8. $new_content .= $matches [ 1 ] ;
  9. } else {
  10. $new_content .= wptexturize(wpautop($piece ) ) ;
  11. return $new_content ;
  12. remove_filter("the_content" , "wpautop" ) ;
  13. remove_filter("the_content" , "wptexturize" ) ;
  14. add_filter("the_content" , "my_formatter" , 99 ) ;

После того, как Вы это сделали, можете использовать тэг для того, чтобы текст поста был не отформатирован автоматически:

This text will not be automatically formatted.
Объяснение кода.
Первым делом, мы создаем функцию, которая, основываясь на регулярных выражениях, находит тэг в содержании Вашего поста.
Далее, мы привязываем нашу функцию my_formatter() к функции the_content() , что означает выполнение нашей функции всякий раз, когда вызывается функция the_content() .
Для того, чтобы отключить автоформатирование, мы использовали функцию remove_filter() .

2. ОПРЕДЕЛЯЕМ БРАУЗЕР ПОСЕТИТЕЛЯ ПРИ ПОМОЩИ ХУКОВ

Проблема.
Кросс-браузерная совместимость – это наиболее распространенная проблема в web-разработке. Вы сэкономите много нервов и времени, если сможете определить браузер пользователя, зашедшего на Ваш блог, а затем создав CSS-класс для тэга body под каждый из браузеров.
Решение.
Ничего сложного: просто вставьте нижеследующий код в файл functions.php , сохраните его – все готово!
  1. add_filter("body_class" , "browser_body_class" ) ;
  2. function browser_body_class($classes ) {
  3. global $is_lynx , $is_gecko , $is_IE , $is_opera , $is_NS4 , $is_safari , $is_chrome , $is_iphone ;
  4. if ($is_lynx ) $classes = "lynx" ;
  5. elseif ($is_gecko ) $classes = "gecko" ;
  6. elseif ($is_opera ) $classes = "opera" ;
  7. elseif ($is_NS4 ) $classes = "ns4" ;
  8. elseif ($is_safari ) $classes = "safari" ;
  9. elseif ($is_chrome ) $classes = "chrome" ;
  10. elseif ($is_IE ) $classes = "ie" ;
  11. else $classes = "unknown" ;
  12. if ($is_iphone ) $classes = "iphone" ;
  13. return $classes ;

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

Объяснение кода.
Wordpress имеет глобальные переменные, которые возвращают true , если пользователь использует соответствующий браузер. Если пользователь использует браузер Google Chrome, то переменная $is_chrome примет значение true . Вот для чего мы и создаем функцию browser_body_class() . После этого мы присоединяем ее к Wordpress функции body_class() .

3. ОПРЕДЕЛЕНИЕ ТЕКСТА ПО УМОЛЧАНИЮ В РЕДАКТОРЕ TinyMCE

Проблема.
Многие блоггеры почти всегда используют для своего блога один и тот же формат. Сообщения в моем блоге WpRecipes.com всегда отображаются одинаково: текст, код, еще немного текста.
Можно сэкономить немало времени, если научить TinyMCE отображать какой-нибудь текст по умолчанию.
Решение.
Как всегда, решением является хук. Копируем код в файл functions.php и смотрим, как он работает.
  1. add_filter("default_content" , "my_editor_content" ) ;
  2. function my_editor_content( $content ) {
  3. $content = "If you enjoyed this post, make sure to subscribe to my rss feed." ;
  4. return $content ;
Объяснение кода.
Этот код хоть и простой, но очень мощный. Просто создаем функцию, которая возвращает требуемый текст (в этом примере мы определяем текст, который спрашивает у посетителей о подписке на RSS-ленту), и присоединяем ее к Wordpress-функции default_content() . Вот так.

4. ВСТАВЛЯЕМ КОНТЕНТ АВТОМАТИЧЕСКИ ПОСЛЕ КАЖДОГО ПОСТА

Проблема.
В большинстве блогов для вывода контента после каждого поста файл single.php , но вот беда: этот контент не будет отображаться в RSS-ленте. Хуки помогут исправить эту проблему.
Решение.
Все то же самое – просто копируем следующий код в файл fucntions.php .
  1. function insertFootNote($content ) {
  2. $content .= "
  3. $content .= "

    Enjoyed this article?

    "
    ;
  4. $content .= "

    Subscribe to our RSS feed and never miss a recipe!

    "
    ;
  5. $content .= "
" ;
  • return $content ;
  • add_filter ("the_content" , "insertFootNote" ) ;
  • Объяснение кода.
    Суть функции insertFootNote() проста: он лишь конкатенирует желаемый текст к переменной $content , в которой хранится содержание поста.
    Затем, мы присоединяем нашу функцию insertFootNote() к функции the_content() .
    Видите в строке 2 вот такой код:
    1. if (! is_feed() && ! is_home() ) {

    Если Вам нужно, чтобы текст попадал в RSS-ленту, то замените предыдущий код на этот:

    1. if (! is_home() ) {

    Вот и все.

    5. ОТКЛЮЧАЕМ СООБЩЕНИЕ С ПРОСЬБОЙ ОБНОВИТЬСЯ В ПАНЕЛИ УПРАВЛЕНИЯ WORDPRESS

    Проблема.
    Вы можете видеть информацию о наличии новой версии Wordpress вверху дашборда. Это действительно хорошая штука, так как обновление закрывает дыры в безопасности и позволяет пользоваться Вам последними возможностями движка. Но если блог не Ваш лично, а является проектом для кого-нибудь из клиентов, то давать возможность клиентам самим обновляться – не есть хорошая идея.
    Решение.
    Просто вставьте следующий код в файл fucntions.php .
    1. if (! current_user_can("edit_users" ) ) {
    2. add_action( "init" , create_function ( "$a" , "remove_action("init", "wp_version_check");" ) , 2 ) ;
    3. add_filter( "pre_option_update_core" , create_function ( "$a" , "return null;" ) ) ;

    После того, как Вы сохраните файл functions.php , сообщения Вы больше не увидите.

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

    6. ОТКЛЮЧАЕМ АВТОСОХРАНЕНИЕ ПОСТОВ

    Проблема.
    Wordpress периодически сохраняет пост по мере его введения. Это полезная возможность, но иногда она не требуется.
    Решение.
    Для того, чтобы отключить автосохранение поста, просто откройте файл functions.php и вставьте в него следующий код.
    1. function disableAutoSave() {
    2. wp_deregister_script("autosave" ) ;
    3. add_action( "wp_print_scripts" , "disableAutoSave" ) ;
    Объяснение кода.
    И вновь, ничего сложного: мы просто создаем функцию, которая отключается автосохранение и привязываем ее к Wordpress-функции wp_print_scripts() .

    7. ИЗБАВЛЯЕМСЯ ОТ ПОВТОРЯЮЩЕГОСЯ КОНТЕНТА НА СТРАНИЦАХ С КОММЕНТАРИЯМИ

    Проблема.
    Повторяющийся контент эта довольно распространенная SEO-проблема.
    Введенная в Wordpress версии 2.7 система разбиения комментариев на страницы эту проблему не решает.
    Для предупреждения повторяющегося контента в комментариях будем использовать атрибут rel=«canonical» .
    Решение.
    Копируем следующий код и вставляем его в файл functions.php .
    1. function canonical_for_comments() {
    2. global $cpage , $post ;
    3. if ( $cpage > 1 ) :
    4. echo "\n " ;
    5. echo "
    6. echo get_permalink( $post -> ID ) ;
    7. echo "" />\n " ;
    8. endif ;
    9. add_action( "wp_head" , "canonical_for_comments" ) ;
    Объяснение кода.
    Сначала, мы создаем функцию, которая добавляет к каждой странице с комментариями, кроме первой, тэг link с атрибутом rel=«canonical» . Затем, присоединяем эту функцию к Wordpress-функци wp_head() .

    8. ПОЛУЧЕНИЕ ПОСТА ИЛИ СТРАНИЦЫ В КАЧЕСТВЕ PHP-ПЕРЕМЕННОЙ

    Проблема.
    Возможность получить текущий пост или целую страницу в качестве PHP переменной – действительно крутая вещь. Скажем, Вы можете заменять некоторые части контента при помощи функции str_replace() или делать с ним еще что-нибудь.
    Решение.
    И снова ничего сложного. Делаем все то же самое: вставляем следующий код в файл functions.php .
    1. function callback($buffer ) {
    2. // modify buffer here, and then return the updated code
    3. return $buffer ;
    4. function buffer_start() {
    5. ob_start ("callback" ) ;
    6. function buffer_end() {
    7. ob_end_flush () ;
    8. add_action("wp_head" , "buffer_start" ) ;
    9. add_action("wp_footer" , "buffer_end" ) ;
    Объяснение кода.
    Для того, чтобы этот хак работал, необходимы три функции:
    • callback() : эта функция возвращает страницу целиком как переменную $buffer . Вы можете модифицировать ее как угодно, например, при помощи регулярных выражений;
    • buffer_start() : эта функция начинает буферизацию. Ее мы присоединяем к функции wp_head() ;
    • buffer_end() : эта функция очищает буфер. Ее мы присоединяем к функции wp_footer() .

    9. ИСПОЛЬЗУЕМ ХУКИ И CRON ДЛЯ СОБЫТИЙ ПО РАСПИСАНИЮ

    Проблема.
    Вы, наверное, уже знаете, что Wordpress может использовать события по расписанию. К примеру, можно публиковать посты в конкретное, установленное заранее, время. Используя хуки и wp-cron , мы можем запросто задать расписание для нашего собственного события. В следующем примере мы заставим блог отправлять нам сообщения на e-mail один раз каждый час.
    Решение.
    Вставляем следующий код в файл functions.php .
    1. if (! wp_next_scheduled("my_task_hook" ) ) {
    2. wp_schedule_event( time () , "hourly" , "my_task_hook" ) ;
    3. add_action( "my_task_hook" , "my_task_function" ) ;
    4. function my_task_function() {
    5. wp_mail("[email protected]" , "Automatic email" , "Hello, this is an automatically scheduled email from WordPress." ) ;
    Объяснение кода.
    Первое, что мы сделаем, конечно, - это создадим функцию, которая будет выполнять требуемое действие. В этом примере эта функция называется my_task_function() и она просто отправляет письмо на указанный e-mail адрес.
    Для того, чтобы запланировать выполнение этой функции, мы будем использовать функцию wp_schedule_event() . Последним аргументом, передаваемым ей, будет наш хук, поэтому мы «цепляем» нашу функцию my_task_function() к my_task_hook .

    10. СПИСОК ВСЕХ «ХУКНУТЫХ» ФУНКЦИЙ

    Проблема.
    Когда что-то идет не так, здорово может пригодиться список всех «хукнутых» функций.
    Решение.
    Как и все предыдущие фрагменты кода следующий также необходимо вставить в файл functions.php . Только не забудьте удалить его после использования. Если Вы этого не сделаете, то сообщения будут появляться и после отладки.
    1. function list_hooked_functions($tag = false ) {
    2. global $wp_filter ;
    3. if ($tag ) {
    4. $hook [ $tag ] = $wp_filter [ $tag ] ;
    5. if (! is_array ($hook [ $tag ] ) ) {
    6. trigger_error ("Nothing found for "$tag " hook" , E_USER_WARNING ) ;
    7. return ;
    8. else {
    9. $hook = $wp_filter ;
    10. ksort ($hook ) ;
    11. echo "
      "
      ;
      
    12. foreach ($hook as $tag => $priority ) {
    13. echo "
      >>>>>\t $tag
      "
      ;
    14. ksort ($priority ) ;
    15. foreach ($priority as $priority => $function ) {
    16. echo $priority ;
    17. foreach ($function as $name => $properties ) echo "\t $name
      "
      ;
    18. echo "" ;
    19. return ;

    После того, как Вы вставите этот код в файл functions.php , вызовите функцию list_hooked_functions() . Она и покажет Вам список всех «хукнутых» функций.

    Объяснение кода.
    Данный код выясняет, передается ли имя хука в качестве аргумента функции. Если передается, то на экран выводится имя хука. Также можно посмотреть хуки только для определенной функции:

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

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

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

    Введение в инициализационные хуки

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

    Так, инициализационные хуки используются в основном, как вы уже догадались, для инициализации процесса в темах и плагинах. Давайте посмотрим на доступные хуки init в порядке их исполнения:

    • init выполняется после того, как WordPress закончила загрузку, но до отправки заголовков.
    • widgets_init применяется для регистрации боковых виджетов приложения. Функция register_widget выполняется внутри этого хука.
    • admin_init выполняется в первую очередь, когда пользователь заходит в администраторскую часть WordPress. Обычно он используется для инициализации настроек, специфичных для админки.

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

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

    Определение admin_ init внутри хука init

    Если нужно, мы можем определять хуки WordPress одни внутри других. В стандартном запросе, хук admin_init исполняется перед хуком init. Поэтому давайте попробуем получить что-нибудь, встроив admin_init внутри хука init:

    add_action("init", "test_init"); function test_init(){ add_action("admin_init", "test_admin_init"); } function test_admin_init() { echo "Admin Init Inside Init"; }

    function test_init () {

    echo "Admin Init Inside Init" ;

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

    Определение внутри init хука admin_ init

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

    add_action("admin_init", "test_admin_init"); function test_admin_init() { add_action("init", "test_init"); } function test_init() { echo "Init Inside Admin Init"; }

    add_action ("admin_init" , "test_admin_init" ) ;

    function test_admin_init () {

    add_action ("init" , "test_init" ) ;

    function test_init () {

    echo "Init Inside Admin Init" ;

    Как и ожидалось, здесь мы не получим никакого результата, потому что хук init выполняется до хука admin_init, и таким образом он становится недоступным после определения admin_init.
    Как видите, для создания удачных плагинов необходимо понимать процедуру и порядок выполнения хуков. Последовательность запуска важна для всех хуков в WordPress.

    Исследование хуков init и admin_ init

    Среди множества хуков инициализации, init и admin_init стоят изучения, так как именно они широко используются во многих плагинах. Поэтому использование других хуков инициализации всегда сравнивается непосредственно с этими двумя.

    Сейчас мы рассмотрим функциональность init и admin_init хуков.

    init исполняется в каждом запросе как для фронт-энда, так и для администраторской части WordPress сайта. admin_init выполняется после того, как администраторская часть завершает процесс загрузки. Соответственно, он тоже выполняется в каждом запросе на чтение страницы в админской части сайта. Чтобы воспользоваться его преимуществами, пользователи должны быть авторизованы.

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

    Как правильно использовать init хуки

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

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

    init хук

    • Регистрация пользовательских типов записей – WordPress рекомендует использовать initхук для регистрации новых пользовательских типов контента.
    • Инициализация конфигурации и настроек вашего плагина – конфигурации и настройки плагина должны быть определены в каждом запросе и, следовательно, наилучшим подходом к этому будет включить их в хук init.
    • Доступ к данным, отправленным пользователем (Используя $_GET и $_POST) – Мы можем без каких-либо действий перехватить данные, отправленные пользователем, но рекомендуется использовать init хук, так как при этом гарантируется выполнение действия в каждом запросе.
    • Добавление новых правил перезаписи – Можно определить новые правила перезаписи, используя хук init, но помните, что новые правила возымеют эффект только после обновления всех правил перезаписи.
    • Добавление или удаление пользовательских действий – Плагины содержат множество пользовательских действий, позволяющих расширить функциональность. Могут быть такие сценарии, где нам потребуется добавить новые пользовательские действия, равно как удалить существующие. В этих случаях, необходимо выполнять эти действия внутри init хука.
    • Указание пути к языковым файлам плагина — WordPress предлагает многоязыковую поддержку, и поэтому мы можем загрузить файл, в котором содержатся переведенные строки. Это также можно разместить внутри init хука.

    Хук admin_ init.

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

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

    Типичные ошибки при использовании хуков инициализации

    Часто мы обнаруживаем сценарии, в которых разработчики неправильно понимают, как использовать хуки инициализации. Неправильное их использование может привести к проблемам с производительностью (а также к низкому качеству ваших плагинов).

    Давайте определим основные ошибки и найдем, как их избежать:

    • Обновление правил перезаписи – Это ресурсоемкая операция, которая обновляет и сортирует все правила перезаписи для добавления новых и удаления ненужных правил. Многие разработчики предпочитают обновлять правила перезаписи внутри действий init и заканчивают тем, что создают избыточную нагрузку в каждом запросе. Чтобы избежать этого, мы должны придумать, как провести обновление правил перезаписи вручную, используя кнопку, или обновлять их внутри таких нерегулярных действий, как сохранение настроек плагина.
    • Доступ к базе данных – Предоставление различной функциональности требует доступа к базе данных, но важно убрать лишние запросы к БД внутри хуков инициализации, так как в противном случае они будут выполняться в каждом запросе. В данном случае, идеальным решением будет встроить хуки с запросами к БД в функционально-специфичные хуки, чтобы избежать чрезмерной нагрузки.
    • Выполнение процедур обновления до новых версий – Чтобы иметь возможность обновить функционал плагинов до новых версий, в них должна быть продумана процедура апгрейда. Обычно разработчики применяют init хуки, чтобы проверить версии плагинов и настроек перед тем, как запустить процесс апгрейда. Мы можем позволить пользователям обновить плагин, предоставив им пользовательское окно, вместо автоматической проверки в каждом запросе.
    • Выполнение хуков инициализации вместо функционально-специфичных хуков – Это одна из самых типичных ошибок, допускаемых разработчиками. Существует множество хуков в WordPress, которые созданы для разных, уникальных целей. Важно использовать их, чтобы избежать возможных конфликтов и сделать код расширяемым. Такие хуки как admin_init и init, в принципе, могут использоваться вместо специальных, поэтому разработчики склонны применять их, не задумываясь о последствиях. Некоторые из типичных сценариев, где разработчики используют init и admin_init хуки вместо рекомендуемых:
    • admin _ menu – Можно добавлять страницы меню, используя функцию add_menu_page. Рекомендуется использовать admin_menu хук для создания страниц админки. Однако многие разработчики предпочитают применять admin_init, так как он исполняется после admin_menu хука.
    • wp _ enqueue _ scripts – Наиболее удачный способ добавления скриптов и стилей– это использовать wp_enqueue_scripts хук. Но многие применяют для загрузки скриптов и стилей wp_enqueue_script внутри init.

    Существует много похожих ситуаций, где разработчики используют привычный хук init вместо функционально-специфичного хука, и этого нужно по возможности избегать.

    Хуки инициализации: двигаемся дальше

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

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

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

    ЧТО ТАКОЕ ХУК?

    Для достижения определенного эффекта нам нужно слегка изменить принцип работы Wordpress. Некоторые модификации необходимо внести в файлы, которые были названы разработчиками файлами ядра – они нужны для того, чтобы Wordpress работал должным образом.
    Но изменение файлов ядра – плохая идея: это может создать брешь в системе безопасности блога. Также, все модификации исчезнут, как только Вы обновите движок до новой версии.
    Однако, расширение функциональности все же необходимо. Для этого разработчиками был придуман Plugin API.
    Хуки являются одним из главных блоков для построения плагинов. Почти каждый подключаемый плагин использует хуки для расширения функциональности Wordpress.

    КАК ИСПОЛЬЗОВАТЬ ХУКИ В ВАШЕМ БЛОГЕ

    Пока Вы не написали свой плагин, Вы должны записать хуки в файл functions.php . Этот файл находится в директории wp-content/themes/yourtheme (где /yourtheme – директория, в которой находится текущая тема).
    Вот пример, который показывает, как подключить Вашу пользовательскую функцию к функции ядра движка:
    1. add_action ( "publish_post" , "myCustomFunction" ) ;

    В этом примере мы подключили пользовательскую функцию myCustomFunction() к функции ядра publish_post() . Функция myCustomFunction() будет выполняться при каждом выполнении функции publish_post() .
    Конечно, мы можем также удалить хук, используя функцию remove_action() :

    1. remove_action ( "publish_post" , "myCustomFunction" ) ;

    1. ОТКЛЮЧАЕМ АВТОМАТИЧСКОЕ ФОРМАТИРОВАНИЕ В WORDPRESS

    Проблема.
    Вы, наверное, уже замечали, что типограф Wordpress по умолчанию превращает «прямые» кавычки в «кривые» и делает другие мелкие изменения в форматировании поста.
    Это хорошо, если блоггер размещает обычный контент (подразумеваются обычный текст и картинки). Но некоторые постят исходный код, чтобы потом его обсуждать, и они будут очень недовольны, когда из-за этих «кривых» кавычек интерпретатор иди компилятор выдадут им сообщения о синтаксических ошибках.
    Решение.
    Просто вставьте в файл functions.php нижеследующий код:
    1. function my_formatter($content ) {
    2. $new_content = "" ;
    3. $pattern_full = "{(\.*?\)}is" ;
    4. $pattern_contents = "{\(.*?)\}is" ;
    5. $pieces = preg_split ($pattern_full , $content , - 1 , PREG_SPLIT_DELIM_CAPTURE) ;
    6. foreach ($pieces as $piece ) {
    7. if (preg_match ($pattern_contents , $piece , $matches ) ) {
    8. $new_content .= $matches [ 1 ] ;
    9. } else {
    10. $new_content .= wptexturize(wpautop($piece ) ) ;
    11. return $new_content ;
    12. remove_filter("the_content" , "wpautop" ) ;
    13. remove_filter("the_content" , "wptexturize" ) ;
    14. add_filter("the_content" , "my_formatter" , 99 ) ;

    После того, как Вы это сделали, можете использовать тэг для того, чтобы текст поста был не отформатирован автоматически:

    This text will not be automatically formatted.
    Объяснение кода.
    Первым делом, мы создаем функцию, которая, основываясь на регулярных выражениях, находит тэг в содержании Вашего поста.
    Далее, мы привязываем нашу функцию my_formatter() к функции the_content() , что означает выполнение нашей функции всякий раз, когда вызывается функция the_content() .
    Для того, чтобы отключить автоформатирование, мы использовали функцию remove_filter() .

    2. ОПРЕДЕЛЯЕМ БРАУЗЕР ПОСЕТИТЕЛЯ ПРИ ПОМОЩИ ХУКОВ

    Проблема.
    Кросс-браузерная совместимость – это наиболее распространенная проблема в web-разработке. Вы сэкономите много нервов и времени, если сможете определить браузер пользователя, зашедшего на Ваш блог, а затем создав CSS-класс для тэга body под каждый из браузеров.
    Решение.
    Ничего сложного: просто вставьте нижеследующий код в файл functions.php , сохраните его – все готово!
    1. add_filter("body_class" , "browser_body_class" ) ;
    2. function browser_body_class($classes ) {
    3. global $is_lynx , $is_gecko , $is_IE , $is_opera , $is_NS4 , $is_safari , $is_chrome , $is_iphone ;
    4. if ($is_lynx ) $classes = "lynx" ;
    5. elseif ($is_gecko ) $classes = "gecko" ;
    6. elseif ($is_opera ) $classes = "opera" ;
    7. elseif ($is_NS4 ) $classes = "ns4" ;
    8. elseif ($is_safari ) $classes = "safari" ;
    9. elseif ($is_chrome ) $classes = "chrome" ;
    10. elseif ($is_IE ) $classes = "ie" ;
    11. else $classes = "unknown" ;
    12. if ($is_iphone ) $classes = "iphone" ;
    13. return $classes ;

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

    Объяснение кода.
    Wordpress имеет глобальные переменные, которые возвращают true , если пользователь использует соответствующий браузер. Если пользователь использует браузер Google Chrome, то переменная $is_chrome примет значение true . Вот для чего мы и создаем функцию browser_body_class() . После этого мы присоединяем ее к Wordpress функции body_class() .

    3. ОПРЕДЕЛЕНИЕ ТЕКСТА ПО УМОЛЧАНИЮ В РЕДАКТОРЕ TinyMCE

    Проблема.
    Многие блоггеры почти всегда используют для своего блога один и тот же формат. Сообщения в моем блоге WpRecipes.com всегда отображаются одинаково: текст, код, еще немного текста.
    Можно сэкономить немало времени, если научить TinyMCE отображать какой-нибудь текст по умолчанию.
    Решение.
    Как всегда, решением является хук. Копируем код в файл functions.php и смотрим, как он работает.
    1. add_filter("default_content" , "my_editor_content" ) ;
    2. function my_editor_content( $content ) {
    3. $content = "If you enjoyed this post, make sure to subscribe to my rss feed." ;
    4. return $content ;
    Объяснение кода.
    Этот код хоть и простой, но очень мощный. Просто создаем функцию, которая возвращает требуемый текст (в этом примере мы определяем текст, который спрашивает у посетителей о подписке на RSS-ленту), и присоединяем ее к Wordpress-функции default_content() . Вот так.

    4. ВСТАВЛЯЕМ КОНТЕНТ АВТОМАТИЧЕСКИ ПОСЛЕ КАЖДОГО ПОСТА

    Проблема.
    В большинстве блогов для вывода контента после каждого поста файл single.php , но вот беда: этот контент не будет отображаться в RSS-ленте. Хуки помогут исправить эту проблему.
    Решение.
    Все то же самое – просто копируем следующий код в файл fucntions.php .
    1. function insertFootNote($content ) {
    2. $content .= "
    3. $content .= "

      Enjoyed this article?

      "
      ;
    4. $content .= "

      Subscribe to our RSS feed and never miss a recipe!

      "
      ;
    5. $content .= "
    " ;
  • return $content ;
  • add_filter ("the_content" , "insertFootNote" ) ;
  • Объяснение кода.
    Суть функции insertFootNote() проста: он лишь конкатенирует желаемый текст к переменной $content , в которой хранится содержание поста.
    Затем, мы присоединяем нашу функцию insertFootNote() к функции the_content() .
    Видите в строке 2 вот такой код:
    1. if (! is_feed() && ! is_home() ) {

    Если Вам нужно, чтобы текст попадал в RSS-ленту, то замените предыдущий код на этот:

    1. if (! is_home() ) {

    Вот и все.

    5. ОТКЛЮЧАЕМ СООБЩЕНИЕ С ПРОСЬБОЙ ОБНОВИТЬСЯ В ПАНЕЛИ УПРАВЛЕНИЯ WORDPRESS

    Проблема.
    Вы можете видеть информацию о наличии новой версии Wordpress вверху дашборда. Это действительно хорошая штука, так как обновление закрывает дыры в безопасности и позволяет пользоваться Вам последними возможностями движка. Но если блог не Ваш лично, а является проектом для кого-нибудь из клиентов, то давать возможность клиентам самим обновляться – не есть хорошая идея.
    Решение.
    Просто вставьте следующий код в файл fucntions.php .
    1. if (! current_user_can("edit_users" ) ) {
    2. add_action( "init" , create_function ( "$a" , "remove_action("init", "wp_version_check");" ) , 2 ) ;
    3. add_filter( "pre_option_update_core" , create_function ( "$a" , "return null;" ) ) ;

    После того, как Вы сохраните файл functions.php , сообщения Вы больше не увидите.

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

    6. ОТКЛЮЧАЕМ АВТОСОХРАНЕНИЕ ПОСТОВ

    Проблема.
    Wordpress периодически сохраняет пост по мере его введения. Это полезная возможность, но иногда она не требуется.
    Решение.
    Для того, чтобы отключить автосохранение поста, просто откройте файл functions.php и вставьте в него следующий код.
    1. function disableAutoSave() {
    2. wp_deregister_script("autosave" ) ;
    3. add_action( "wp_print_scripts" , "disableAutoSave" ) ;
    Объяснение кода.
    И вновь, ничего сложного: мы просто создаем функцию, которая отключается автосохранение и привязываем ее к Wordpress-функции wp_print_scripts() .

    7. ИЗБАВЛЯЕМСЯ ОТ ПОВТОРЯЮЩЕГОСЯ КОНТЕНТА НА СТРАНИЦАХ С КОММЕНТАРИЯМИ

    Проблема.
    Повторяющийся контент эта довольно распространенная SEO-проблема.
    Введенная в Wordpress версии 2.7 система разбиения комментариев на страницы эту проблему не решает.
    Для предупреждения повторяющегося контента в комментариях будем использовать атрибут rel=«canonical» .
    Решение.
    Копируем следующий код и вставляем его в файл functions.php .
    1. function canonical_for_comments() {
    2. global $cpage , $post ;
    3. if ( $cpage > 1 ) :
    4. echo "\n " ;
    5. echo "
    6. echo get_permalink( $post -> ID ) ;
    7. echo "" />\n " ;
    8. endif ;
    9. add_action( "wp_head" , "canonical_for_comments" ) ;
    Объяснение кода.
    Сначала, мы создаем функцию, которая добавляет к каждой странице с комментариями, кроме первой, тэг link с атрибутом rel=«canonical» . Затем, присоединяем эту функцию к Wordpress-функци wp_head() .

    8. ПОЛУЧЕНИЕ ПОСТА ИЛИ СТРАНИЦЫ В КАЧЕСТВЕ PHP-ПЕРЕМЕННОЙ

    Проблема.
    Возможность получить текущий пост или целую страницу в качестве PHP переменной – действительно крутая вещь. Скажем, Вы можете заменять некоторые части контента при помощи функции str_replace() или делать с ним еще что-нибудь.
    Решение.
    И снова ничего сложного. Делаем все то же самое: вставляем следующий код в файл functions.php .
    1. function callback($buffer ) {
    2. // modify buffer here, and then return the updated code
    3. return $buffer ;
    4. function buffer_start() {
    5. ob_start ("callback" ) ;
    6. function buffer_end() {
    7. ob_end_flush () ;
    8. add_action("wp_head" , "buffer_start" ) ;
    9. add_action("wp_footer" , "buffer_end" ) ;
    Объяснение кода.
    Для того, чтобы этот хак работал, необходимы три функции:
    • callback() : эта функция возвращает страницу целиком как переменную $buffer . Вы можете модифицировать ее как угодно, например, при помощи регулярных выражений;
    • buffer_start() : эта функция начинает буферизацию. Ее мы присоединяем к функции wp_head() ;
    • buffer_end() : эта функция очищает буфер. Ее мы присоединяем к функции wp_footer() .

    9. ИСПОЛЬЗУЕМ ХУКИ И CRON ДЛЯ СОБЫТИЙ ПО РАСПИСАНИЮ

    Проблема.
    Вы, наверное, уже знаете, что Wordpress может использовать события по расписанию. К примеру, можно публиковать посты в конкретное, установленное заранее, время. Используя хуки и wp-cron , мы можем запросто задать расписание для нашего собственного события. В следующем примере мы заставим блог отправлять нам сообщения на e-mail один раз каждый час.
    Решение.
    Вставляем следующий код в файл functions.php .
    1. if (! wp_next_scheduled("my_task_hook" ) ) {
    2. wp_schedule_event( time () , "hourly" , "my_task_hook" ) ;
    3. add_action( "my_task_hook" , "my_task_function" ) ;
    4. function my_task_function() {
    5. wp_mail("[email protected]" , "Automatic email" , "Hello, this is an automatically scheduled email from WordPress." ) ;
    Объяснение кода.
    Первое, что мы сделаем, конечно, - это создадим функцию, которая будет выполнять требуемое действие. В этом примере эта функция называется my_task_function() и она просто отправляет письмо на указанный e-mail адрес.
    Для того, чтобы запланировать выполнение этой функции, мы будем использовать функцию wp_schedule_event() . Последним аргументом, передаваемым ей, будет наш хук, поэтому мы «цепляем» нашу функцию my_task_function() к my_task_hook .

    10. СПИСОК ВСЕХ «ХУКНУТЫХ» ФУНКЦИЙ

    Проблема.
    Когда что-то идет не так, здорово может пригодиться список всех «хукнутых» функций.
    Решение.
    Как и все предыдущие фрагменты кода следующий также необходимо вставить в файл functions.php . Только не забудьте удалить его после использования. Если Вы этого не сделаете, то сообщения будут появляться и после отладки.
    1. function list_hooked_functions($tag = false ) {
    2. global $wp_filter ;
    3. if ($tag ) {
    4. $hook [ $tag ] = $wp_filter [ $tag ] ;
    5. if (! is_array ($hook [ $tag ] ) ) {
    6. trigger_error ("Nothing found for "$tag " hook" , E_USER_WARNING ) ;
    7. return ;
    8. else {
    9. $hook = $wp_filter ;
    10. ksort ($hook ) ;
    11. echo "
      "
      ;
      
    12. foreach ($hook as $tag => $priority ) {
    13. echo "
      >>>>>\t $tag
      "
      ;
    14. ksort ($priority ) ;
    15. foreach ($priority as $priority => $function ) {
    16. echo $priority ;
    17. foreach ($function as $name => $properties ) echo "\t $name
      "
      ;
    18. echo "" ;
    19. return ;

    После того, как Вы вставите этот код в файл functions.php , вызовите функцию list_hooked_functions() . Она и покажет Вам список всех «хукнутых» функций.

    Объяснение кода.
    Данный код выясняет, передается ли имя хука в качестве аргумента функции. Если передается, то на экран выводится имя хука. Также можно посмотреть хуки только для определенной функции:

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

    Но даже если вы хотите получить более глубокие познания, то вам всё-равно необходимо знать, как применять хуки.

    Мы расскажем вам о системе хуков WordPress и их использовании, а также рассмотрим хуки действия и фильтров.

    Перед тем, как начать, убедитесь, что вы имеете всё необходимое для работы, и у вас установлена последняя версия WordPress.

    Что такое хуки?

    До того, как мы рассмотрим WordPress хуки, необходимо понять событийно-ориентированную архитектуру разработки.

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

    Архитектура, управляемая событиями (англ. event-driven architecture, EDA) является шаблоном архитектуры программного обеспечения, позволяющим создание, определение, потребление и реакцию на события.

    Если вы только начали работать с шаблонами проектов или разработкой, то это может показаться вам сложным, но лучше воспринимать это так:

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

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

    Использование JavaScript

    Представьте, что вы работаете в сфере фронтенд разработки. У вас есть кнопка с ID атрибутом command-button , и когда пользователь нажимает на неё, то должно открыться диалоговое окно.

    С помощью jQuery вы можете реализовать этот функционал вот так:

    (function($) { "use strict"; // jQuery"s DOM-ready event-handler $(function() { /** * Listen for the "click" event on the button identified * with the "command-button" ID attribute. * * When the user clicks on it, display an alert dialog. */ $("#command-button").bind("click", function(evt) { alert("You clicked the button."); }); }); })(jQuery);

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

    Конечно, другие библиотеки, платформы или vanilla JavaScript предлагают тот же самый набор функций. Причиной, почему мы рассказываем о jQuery, является то, что это одна из самых распространённых библиотек JavaScript, и потому что она связана с WordPress.

    Использование WordPress

    Применение этого шаблона разнится в зависимости от языка программирования или парадигмы. Это часто зависит от API, который предоставляет платформа или приложение.

    В WordPress регистрация собственного кода, запускающего события, немного отличается. К примеру, давайте представим, что вы работаете с административной страницей в WordPress и хотите добавить новый элемент подменю в меню Настройки . Назовём его Tuts+ Options .

    Для этого мы добавляем следующий код в файл functions.php , или в плагин, или в любой тип проекта, с которым мы работаем:

    Вы можете зайти на Codex, чтобы больше узнать о хуках admin_menu и функции add_submenu_page .

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

    Это и есть два примера реализации и использования событийно-управляемого шаблона разработки.

    Понимание WordPress Actions

    Мы успели ознакомиться с событийно-управляемым шаблоном разработки и двумя видами реализации шаблонов, а теперь давайте рассмотрим хуки действий WordPress. Мы расскажем о доступных хуках и их применении.

    Настройка нашего файла

    Для кода в этом руководстве мы будем использовать тему Twenty Sixteen , предоставляемую WordPress.

    Создайте файл с названием tutsplus-actions.php в корне директории темы. Потом в functions.php добавьте следующие строки кода:

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

    Краткое определение Actions

    В WordPress хуки могут быть двух видов: хуки действий (actions) и хуки фильтров (filters). Хуки действий позволяют вам добавлять, удалять или менять определённые функции. А хуки фильтров отвечают за добавление, удаление и изменение информации.

    Короче говоря, хуки действий работают с функциональностью, а фильтры с информацией.

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

    Хотя технически всё правильно, но лучше определить тип хука, над которым вы работаете.

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

    Работа с Actions

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

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

    А одной из особенностей, которая делает WordPress расширяемым, является возможность представлять собственные типы записей (custom post types). WordPress называет их пользовательскими типами записей, и они пригодятся, если вам нужно создать тип контента, которому нужен собственный тип атрибутов, и которому не подходят названия «запись» или «страница».

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

    1. Определить функцию, которая цепляется за хук init , как указано на WordPress
    2. Зарегистрировать наш тип записи с помощью одной из доступных функций API

    Регистрация Action

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

    Наш код должен выглядеть так:

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

    Теперь нужно определить функцию.

    Ключ к пониманию названия функции прост: Мы назвали ее tutsplus_register_post_type , поскольку это второй аргумент, который мы переместили в вызов add_action .

    Он буквально говорит WordPress делать следующее: во время init вызвать функцию tutsplus_register_post_type .

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

    Давайте это исправим.

    Создание пользовательского типа записи

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

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

    Мы выбрали следующие:

    • label
    • labels
    • description
    • public
    • show_ui
    • supports

    Мы надеемся, что остальные функции WordPress предоставляет автоматически. Аргументы будут выглядеть так:

    "Time Travelers", "labels" => array("name" => "Time Travelers", "singular_name" => "Time Traveler", "add_new_item" => "Add New Traveler", "edit_item" => "Edit Traveler", "new_item" => "New Traveler", "view_item" => "View Traveler", "search_items" => "Search Travelers", "not_found" => "No Travelers",), "description" => "A post type used to provide information on Time Travelers.", "public" => true, "show_ui" => true, "supports" => array("title", "editor", "excerpt",),);

    И наконец, полная версия кода для регистрации типа записи:

    "Time Travelers", "labels" => array("name" => "Time Travelers", "singular_name" => "Time Traveler", "add_new_item" => "Add New Traveler", "edit_item" => "Edit Traveler", "new_item" => "New Traveler", "view_item" => "View Traveler", "search_items" => "Search Travelers", "not_found" => "No Travelers",), "description" => "A post type used to provide information on Time Travelers.", "public" => true, "show_ui" => true, "supports" =>

    После обновления Консоли должен появиться новый пункт прямо под Комментариями с названием Time Travelers.

    Когда вы нажмёте Добавить новую , вы увидите место для заголовка (или имени путешественника), редактор (для информации путешественника) и цитату (наверное, для заметок о путешественнике). Вы также увидите мета-поле для публикации информации.

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

    Определение Custom Actions

    Когда наступает время создать собственные хуки действия, необходимо сделать три базовые вещи:

    1. определить хук
    2. наделить хук функцией
    3. разрешить разработчикам вызывать хук

    Самый простой пример:

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

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

    После обновления консоли, вы увидите надпись «This is a custom action hook » вверху консоли.

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

    К вопросу о нашем типе записи

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

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

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

    Для этого мы присоединяем наш пользовательский хук к хуку инициализации:

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

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

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

    $plural, "labels" => array("name" => $plural, "singular_name" => $singular, "add_new_item" => "Add New Traveler", "edit_item" => "Edit Traveler", "new_item" => "New Traveler", "view_item" => "View Traveler", "search_items" => "Search Travelers", "not_found" => "No Travelers",), "description" => "A post type used to provide information on Time Travelers.", "public" => true, "show_ui" => true, "supports" => array("title", "editor", "excerpt",),); register_post_type("time_traveler", $args); }

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

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

    Итоги

    Не тяжело понять, что такое хуки. Они добавляют разработчикам мощности и гибкости. Возможно, наиболее пугающей вещью в коде является определение хука в контексте другого хука (определение tutsplus_register_custom_post_type в init ).

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

    Регистрировать хук легко: вы просто должны не соединять его с уже существующим, и сделайте вызов базовой функции, как в коде admin_notices .

    Вопрос: Жизненный опыт?

    Ответ: Так уж получилось, что я пошёл учиться по специальности программиста практически случайно (это была вторая специальность по приоритетам). После обучения посчастливилось сразу устроиться программистом 1С, в итоге я задержался в этой сфере на целых 5 лет.

    В итоге, когда в этом стало совсем скучно ковыряться, решил кардинально сменить профиль деятельности и стал ассистентом режиссера на региональном ТВ.

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

    Первым коммерческим опытом веб-разработки был проект, который я разрабатывал на Joomla, это было долгое, трудное, малоденежное занятие, но я выдержал этот период, набрался опыта и начал понимать, как работать на результат, и как общаться непосредственно с заказчиком. Далее был самостоятельный опыт разработки пары магазинов на Joomla+Virtuemart, знания и решения черпались непосредственно с курса «Интернет-магазин на Joomla» (https://сайт/jshop/).

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

    Вопрос:

    Ответ: В этом плане сомнения были минимальными, и только в одном - насколько быстро окупятся потраченные средства. А в том, что они окупятся, была полная уверенность.

    Вопрос: Назовите самые значимые для Вас убеждения и ценности в жизни в целом и веб-разработке в частности?

    Ответ: Главное в жизни - это любовь. Что касается веб-разработки - постоянное развитие и принятие новых вызовов.

    Вопрос:

    Ответ: Была основная проблема: так как я был полным новичком в мире веб-разработки - у меня не было четкого структурированного плана о том, с чего начать, и в каком направлении действовать. После приобретения курса по PHP я узнал все основы этого языка, как строить приложения, и от этого уже появилось понимание и видение, как и куда это все развивать.

    Вопрос: Каких успехов Вы достигли?

    Ответ: Моя разработка стала более быстрой и качественной, я овладел несколькими технологиями, избавился от походов в офис, да и вообще профессия веб-разработчика позволяет мне зарабатывать в комфортных для меня условиях и в удобное время.

    Вопрос:

    Ответ: Семья, дети, путешествия и мое хобби перешло в основную деятельность, которым я зарабатываю (это я про веб-разработку).

    Унгер Олег

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

    Вопрос: Жизненный опыт?

    Ответ: После школы поступал на программиста, но баллов не хватило. Учился на инженера-электронщика. Работал в разных сферах, в основном - на производстве. Та сфера, которая раньше приносила неплохой доход - перекочевала в Китай, работу стало сложно найти, да и надоело уже.

    Вопрос: Опишите себя в начале пути?

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

    Вопрос: Опишите себя сейчас?

    Ответ: Прошло почти три года, я уже обладаю определенными знаниями и постоянно получаю новые благодаря курсам от WebForMySelf.

    Вопрос: Как Вы узнали о наших курсах?

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

    Вопрос: Что впервые подумали, когда узнали о нашем проекте?

    Ответ: Подумал, как хорошо, что столько информации есть в одном месте.

    Вопрос: Вы испытывали какие-то сомнения?

    Ответ: Честно говоря, сомнения были. Но я подписался на Премиум клуб. И я многому научился по видео: PHP, JavaScript, регулярные выражения, курс по объектно-ориентированному программированию (ООП PHP) и пр.

    Вопрос: Что Вам понравилось?

    Ответ: Мне очень понравилось, что бонусом к курсу шли другие курсы и видео из премиум доступа . И так удачно было, что мне не пришлось выбирать между Yii2 и Laravel, потому что они шли в комплекте.

    Вопрос:

    Ответ: Мне пришлось бы потратить много времени на поиски более-менее структурированной информации по нужным темам.

    Вопрос: Каких успехов Вы достигли?

    Ответ: Как-то незаметно для себя, стал разбираться в том, что раньше казалось недоступным для понимания. На данный момент почти год работаю программистом (Yii, MS SQL Server, JavaScript), участвую в разработке нового функционала и сопровождении проекта CRM в организации, занимающейся системами безопасности, автоматики и связи.

    Вопрос:

    Ответ: Чувствую себя уверенно, оптимистично. Планирую и дальше повышать свой профессиональный уровень.

    Вопрос: Какие перемены к лучшему произошли в жизни?

    Ответ: Перемены к лучшему: я востребован на рынке труда, несмотря на возраст, у меня появилось четкое понимание, в каком направлении мне дальше двигаться. Будущее уже не такое туманное и пугающее, как раньше.

    Я никогда не жалел денег на самообразование, а отговорки типа «поздно начинать» или «я не смогу», для меня не приемлемы

    Вопрос: Опишите себя в начале пути?

    Ответ: В начале пути для меня веб-программирование было «темным лесом», где было страшно и неуютно, но жажда знаний заставила двигаться вперед , да, на Делфи мне приходилось писать парсеры, были написаны Ebay снайпер, программа для участия на тендерах. На данный момент я понимаю, что написать подобное лучше на PHP (не нужно «придумывать велосипед» с библиотекой Synapse).

    Вопрос: Что Вы скажете по поводу возражений, с которыми Вы, возможно, сталкивались перед покупкой информационных продуктов, как преодолевали данные возражения (нет денег; у меня не получится; слишком поздно начинать; слишком рано начинать; родственники против; слишком сложно; возможно, какие-либо Ваши возражения)?

    Ответ: Я никогда не жалел денег на самообразование, а отговорки типа «поздно начинать» или «я не смогу», для меня не приемлемы - дорогу осилит идущий.

    Вопрос: Какую проблему Вы пытались решить, какие проблемы испытывали до приобретения курса?

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

    Вопрос: О чем Вы думали в начале пути?

    Ответ: Нашел через интернет, на тот момент нужно было срочно сделать сайт-галерею, и я приобрел первый курс по верстке. Тот проект я благополучно завалил - не хватало знаний. Сверстать макет я смог, прикрутил даже JQuery, а дальше мои знания закончились, нужна была админка, нужно было хранить где-то данные. Тут произошло мое знакомство с паттерном MVC и желание освоить PHP (с MySQL проблем не было, так как по роду своей деятельности я хорошо знаком с SQL, часто приходится вытаскивать данные из БД в разрезе складов, контрагентов и т.д.).

    Вопрос: Какие изменения стали происходить, когда Вы узнали о курсах?

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

    Вопрос: Что могло бы случиться, если бы Вы не смогли решить свои проблемы, если бы Вы не воспользовались нашими продуктами?

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

    Вопрос: Каких успехов Вы достигли?

    Ответ: Каких успехов добился? Буквально за 2 недели написал сайт для сервисных центров Huawei в Казахстане , сейчас этот сайт уже не действует, так как Huawei интегрировали внесение заявок в свою систему. Писал сайт для транспортной компании с возможностью отследить расположение груза онлайн , сайт интернет-магазина, сайт для сестры - она практикующий психолог. Особо-то и хвастаться нечем, это для меня прежде всего хобби.

    Вопрос: Как Вы себя чувствуете? О чем думаете? Какие планы?

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

    Мне очень нравятся курсы и уроки Андрея Кудлая. Как по мне, так он просто волшебник в вебе

    Вопрос: Жизненный опыт?

    Ответ: Начиналось все с верстки, постигал все азы с нуля, начинал брать несложные заказы на фрилансе. Далее познакомился с Joomla, но как-то не срослось с ней, не знаю, почему. Наткнулся на Wordpress - и тут мы нашли друг друга. Начал тщательно изучать эту CMS и плотно с ней работать. Изучил бесплатный курс от WFM по созданию темы с нуля, решил купить сразу курс WordPress-Профессионал - так как там был бонусом еще и курс по PHP, который мне очень нужен был тогда. В процессе изучения пришло понимание, что не все так сложно, как кажется, понемногу начал брать заказы и на создание тем для WordPress. Сейчас на фриланс биржи не заглядываю даже, есть свои постоянные заказчики. Основной профиль - создание тем для Wordpress с нуля.

    Вопрос: Опишите себя в начале пути?

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

    Вопрос: Опишите себя сейчас?

    Ответ: Сейчас мой основной профиль - это создание тем для WordPress с нуля. На фриланс биржи не заглядываю, есть заказчики и поток постоянной интересной работы. Точно знаю, что заработать в вебе можно. Есть желание расширить свои знания в области PHP, поэтому купил курс PHP мастер от команды WFM от Андрея Кудлая. Его курсы и уроки мне очень нравятся - у него получается прекрасно объяснять материал. Помимо этого, его курсы/уроки мне очень интересно смотреть, они для меня не скучные, что ли. Не знаю, как это объяснить корректно, но на своем пути я встречал много уроков, при просмотре которых хотелось засыпать).

    Вопрос: В какой момент Вы решили купить курсы?

    Ответ: Понимал, что для дальнейшего роста мне необходим новый набор структурированных знаний. Искал курсы/уроки для себя. На тот момент, в рунете я не видел конкурентов WFM в курсах по WordPress. Вообще я всегда нахожусь в поиске нужных мне качественных материалов для развития.

    Вопрос : Что Вам понравилось?

    Ответ: Мне очень нравятся курсы и уроки Андрея Кудлая. Как по мне, так он просто волшебник в вебе). Стоит отметить его прекрасный навык в объяснении сложной информации.

    Вопрос: Каких успехов Вы достигли?

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

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

    С помощью ваших курсов я научился создавать веб сайты с нуля. Сейчас создаю сайты на заказ. Начал я с нуля. Проблем и вопрос было масса. А конкретных ответов в сети найти практически не возможно.

    Ваша команда просто супер. Потому что объясняете доходчиво, чётко все по делу. По-моему друзья вам нету аналогов в сети интернет! Спасибо вам огромное за ваши труды.

    Изучив курсы научился создавать сайты!

    Что запомнилось больше все из курса? Честно? Все запомнилось!))) Планирую создать свой интернет магазин и внедриться в рынок Армении со своим продуктом. Ещё раз хочу поблагодарить вас. Огромное вам спасибо!

    ...И перед тем как сдаться я увидела в ютюбе ролик от Автора команды WebForMyself. Посмотрела один, второй и не смогла оторваться

    Привет, меня зовут Юлия Ритфелд, я фронт энд разработчик в Министерстве Юстиции в Нидерландах.

    Я очень сомневалась купить ли мне курс о Ларавел. Я уже 5 лет работаю верстальщицей и графическим дизайнером и мне всегда казалось, что php (и другие языки бэкенд) - это удел супер умных программистов. Но в какой-то момент мой начальник сказал, что мне надо тоже выучить пхп, а именно Ларавел, чтобы помочь в разработке аппликаций. Я очень долго сомневалась потяну ли такую сложную теорию. Как я как креативный человек смогу ли строить сложные вещи, да еще и в пхп?

    Стоит ли инвестировать столько времени и средств?

    Я посмотрела курс о Ларавел на lynda.com. Потом купила несколько курсов об этом фреймворке на Udemy.com. Потом были курсы на pluralsight.com. Все было сложно. И даже не в языке дело, на английском я учусь и работаю уже 2 десятка лет. И перед тем как сдаться я увидела в ютюбе ролик Виктора. Посмотрела один, второй и не смогла оторваться.

    Но пойдя на данный момент уже 19 из 39 уроков (50%) теоретической части курса о Ларавел хочу сказать с полной уверенностью, что все мои страхи были напрасны. Виктор просто предугадывает мои вопросы и мысли типа ‘а что если..’. Видео записаны в отличном качестве и картинки на которых он объясняет о том, что такое, например, Middleware для меня как визуального человека просто спасение.

    С уважением и признанием,
    Юлия Рифтелд

    Я узнала что такое вёрстка, виртуальный сервер, база данных, язык PHP и т.д. и я знаю как с этим работать

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

    Больше всего, помимо качественной подачи материала, мне нравится стиль подачи. Т.к. всё же мы изучаем материалы самостоятельно, то многие моменты приходится пересматривать несколько раз. Мне нравится что в курсе чёткая структура уроков, я сразу знаю какой урок мне необходимо повторить, чтобы уточнить какой-либо вопрос. Я изучаю записи по нескольку часов и не устаю от прослушивания: голос у авторов курса приятный, спокойный, не торопливый. Это очень важно для меня.

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



    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: