В этой серии мы рассмотрим действия WordPress: тип хука, предлагаемый приложением, который позволяет нам настраивать выполнение. В последней статье мы рассмотрели второй набор из 10 действий, в результате чего мы получили до 20, которые мы уже рассмотрели.
В соответствии с духом предыдущих статей мы рассмотрим еще 10 действий и примеры каждого из них.
С этим сказал, давайте продолжим.
 Управление get_posts() до его обработки 
  Действие pre_get_posts обрабатывает одну из самых важных функций запроса: get_posts() . 
Включение пользовательских типов записей в результаты поиска
Допустим, вы ведете блог с обзором фильмов, и вам нужен тип записи «Фильмы», чтобы отображаться в результатах поиска. Вы можете включить любой тип сообщения с помощью следующих строк кода:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
 | 
 <?php 
add_action( ‘pre_get_posts’, ‘pre_get_posts_example’ ); 
function pre_get_posts_example( $query ) { 
    if ( ! is_admin() && $query->is_main_query() ) { 
             if ( $query->is_search ) { 
            $query->set( ‘post_type’, array( ‘post’, ‘movie’ ) ); 
        } 
    } 
} 
// Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts 
?> 
 | 
Вуаля! Теперь результаты поиска на вашем веб-сайте будут включать тип записи «Фильмы» в дополнение к обычным публикациям.
Работа с изменениями статуса поста
  На самом деле существует много действий для перехода статуса сообщения: draft_to_publish , new_to_future , publish_to_private и так далее.  WordPress собирает этот набор действий и называет его {$old_status}_to_{$new_status} в Кодексе . 
  Но если вам нужно действие, чтобы следить за всеми изменениями статуса, вы можете использовать действие transition_post_status . 
Отправка электронной почты администратору при каждом изменении статуса сообщения
Представьте, что вы ведете блог с несколькими авторами с тремя редакторами, и вам нужна информация о каждом изменении статуса сообщения. Если это так, вы можете использовать фрагмент кода ниже:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
 | 
 <?php 
add_action( ‘transition_post_status’, ‘transition_post_status_example’, 10, 3 ); 
function transition_post_status_example( $new_status, $old_status, $post ) { 
    if( $post->post_type !== ‘post’ ) { 
        return; 
    } 
    $title = $post->post_title; 
    $to = get_option( ‘admin_email’ ); 
    $subject = ‘Post status changed’; 
    $body = «Hey,\n\nThe status of the post \»$title\» has been changed from \»$old_status\» to \»$new_status\».\n\nCheers!»; 
    wp_mail( $to, $subject, $body ); 
} 
?> 
 | 
Сценарии постановки в очередь для страниц администратора
  Если вам когда-нибудь понадобится внедрить файл JavaScript в панель администрирования вашего сайта, действие admin_enqueue_scripts предназначено для вас: это небольшое admin_enqueue_scripts действие отвечает за постановку в очередь сценариев (и стилей) внутри панели управления WordPress. 
Внедрение сценария для экранов добавления / редактирования записей
  Допустим, вы создали специальный мета-блок, но вам нужен файл JavaScript в папке вашего плагина, чтобы мета-блок работал.  Чем ты занимаешься?  Вы не печатаете <script> в своем коде — вы используете код ниже! 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
 | 
 <?php 
add_action( ‘admin_enqueue_scripts’, ‘admin_enqueue_scripts_example’ ); 
function admin_enqueue_scripts_example( $hook ) { 
    if( ‘edit.php’ != $hook ) { 
        return; 
    } 
         wp_enqueue_script( ‘my_custom_script’, plugin_dir_url( __FILE__ ) . ‘myscript.js’ ); 
} 
// Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts 
?> 
 | 
Управление процессом сохранения постов
Как следует из названия, это полезное действие вызывается, когда сообщение сохраняется в базе данных.
  Требовать показанного изображения перед публикацией или планированием 
Иногда я забываю установить избранные изображения для своих сообщений, хотя все мои сообщения должны иметь одно. В поисках ответа на мою проблему я наткнулся на это элегантное решение:
| 
 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 
 | 
 <?php 
add_action( ‘save_post’, ‘save_post_example’ ); 
add_action( ‘admin_notices’, ‘admin_notices_example’ ); 
function save_post_example( $post_id ) { 
    // change to any custom post type 
    if( get_post_type( $post_id ) != ‘post’ ) { 
        return; 
    } 
          if ( ! has_post_thumbnail( $post_id ) ) { 
             // set a transient to show the users an admin message 
        set_transient( ‘has_post_thumbnail’, ‘no’ ); 
                 // unhook this function so it doesn’t loop infinitely 
        remove_action( ‘save_post’, ‘wpds_check_thumbnail’ ); 
                 // update the post set it to draft 
        wp_update_post( array( ‘ID’ => $post_id, ‘post_status’ => ‘draft’ ) ); 
        add_action( ‘save_post’, ‘wpds_check_thumbnail’ ); 
             } else { 
        delete_transient( ‘has_post_thumbnail’ ); 
    } 
     } 
  function admin_notices_example() { 
    // check if the transient is set, and display the error message 
    if ( get_transient( ‘has_post_thumbnail’ ) == ‘no’ ) { 
        echo ‘<div id=»message» class=»error»><p>You must select a featured image for your post.</p></div>’; 
        delete_transient( ‘has_post_thumbnail’ ); 
    } 
  } 
// Example Source: http://wpdevsnippets.com/require-post-thumbnail-uploaded-before-publishing/ 
?> 
 | 
Длинный, но потрясающий пример, я прав?
Добавление мета-боксов для типов записей
  Возможно, метабоксы являются одной из фундаментальных причин того, что WordPress является самой гибкой системой управления контентом в мире.  Это правда: вы можете создать практически все в виде мета-блока и позволить своим пользователям создавать данные постов с ними.  А действие add_meta_boxes — это основной хук, который мы используем для создания мета-блоков. 
Создание простого мета-бокса
  Мы проходим через действия, и я не хочу отступать от темы, поэтому я просто покажу вам, как используется это действие: заполнив функцию функцией (ами) add_meta_box() ) и подключив ее к действие add_meta_boxes : 
| 
 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 
 | 
 <?php 
// action for the ‘post’ post type 
add_action( ‘add_meta_boxes’, ‘add_meta_boxes_example’, 10, 2 ); 
// action for the ‘event’ post type 
add_action( ‘add_meta_boxes_event’, ‘add_meta_boxes_example’, 10, 2 ); 
function add_meta_boxes_example( $post_type, $post ) { 
    add_meta_box( 
        ‘my-meta-box’, 
        __( ‘My Meta Box’ ), 
        ‘render_my_meta_box’, 
        ‘post’, 
        ‘normal’, 
        ‘default’ 
    ); 
} 
function render_my_meta_box() { 
    // code to create the meta box 
} 
// Example Source: http://codex.wordpress.org/Plugin_API/Action_Reference/add_meta_boxes 
?> 
 | 
[tip] Если вы хотите больше узнать о создании пользовательских мета-блоков, ознакомьтесь с этим удивительным учебником по этой теме, написанным Кристофером Дэвисом. [/ tip]
Играя с разделом «с первого взгляда»
  Раздел «Краткий обзор», который ранее назывался «Прямо сейчас», является основным виджетом панели мониторинга для каждой установки WordPress.  С activity_box_end action_box_end вы можете безопасно играть с этой областью. 
Размещение вашей контактной информации в разделе «Краткий обзор»
Допустим, вы независимый разработчик WordPress и хотите, чтобы ваши клиенты запомнили ваш номер телефона. С помощью приведенного ниже фрагмента кода вы можете оставить для них заметку и указать свой номер телефона в разделе «Краткий обзор»:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
 <?php 
add_action( ‘activity_box_end’, ‘activity_box_end_example’ ); 
function activity_box_end_example() { 
   _e( «If you have any questions, you can reach the webmaster at +1-999-526-0130. Have a nice day!» ); 
} 
?> 
 | 
Не указывайте свой личный номер: вы не хотели бы, чтобы вам звонили в 11 вечера в субботу.
Управление стандартным виджетом Meta
  Есть много виджетов по умолчанию, которые WordPress предлагает в своей основе, и виджет «Мета» является одним из них.  С помощью действия wp_meta мы можем настроить виджет так, как вам нравится. 
Добавление ссылки «Follow Us on Twitter» в виджет «Meta»
Конечно, виджет «Мета» не самый популярный среди виджетов WordPress по умолчанию, но вы можете сделать его более функциональным и привлекательным, добавив дополнительные строки и ссылки на него, например:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
 | 
 <?php 
add_action( ‘wp_meta’, ‘wp_meta_example’ ); 
function wp_meta_example() { 
    $twitter_username = ‘BarisUnver’; 
    echo ‘<li>Follow us on Twitter:<a href=»https://twitter.com/’ . $twitter_username . ‘»>’ . 
     } 
?> 
 | 
Конечно, это просто глупый пример, но эй, это работает!
Играя с приборной панелью
  «Панель инструментов» — это главная страница панели администрирования каждой установки WordPress.  С действием wp_dashboard_setup вы можете настроить панель так, как вам нравится. 
Отображение последних комментариев Disqus в виджете Dashboard
Если вы используете Disqus в разделе комментариев (без официального плагина) и хотите видеть последние комментарии на своей панели, вы можете использовать фрагмент кода ниже, чтобы добавить виджет панели:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
 <?php 
add_action( ‘wp_dashboard_setup’, ‘wp_dashboard_setup_example’ ); 
function wp_dashboard_setup_example() { 
    $disqus_username = ‘USERNAME’; 
    $number_of_comments = 5; 
         wp_add_dashboard_widget( ‘disqus-feed’, ‘Latest Disqus Comments’, ‘acme_display_disqus_comments’ ); 
} 
function acme_display_disqus_comments() { 
    echo ‘<div id=»recentcomments» class=»dsq-widget»>’ . 
} 
?> 
 | 
  Измените переменные $disqus_username $number_of_comments и все $disqus_username ! 
Настройка текущего пользователя
О, смотри, действие для подключаемой функции! WordPress определяет «подключаемые функции» следующим образом:
Эти функции можно заменить с помощью плагинов. Если плагины не переопределяют эти функции, они будут использоваться вместо этого.
  И это удобное небольшое действие является частью подключаемой основной функции wp_set_current_user , которая меняет текущего пользователя по ID или имени. 
Удаление панели инструментов для подписчиков
Мы не собираемся менять пользователя сейчас, но вместо этого мы собираемся воспользоваться действием и проверить возможности текущего пользователя, а затем отключить панель инструментов, если пользователь всего лишь подписчик:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
 | 
 <?php 
add_action( ‘set_current_user’, ‘set_current_user_example’ ); 
function set_current_user_example() { 
    if ( ! current_user_can( ‘edit_posts’ ) ) { 
        show_admin_bar( false ); 
    } 
     } 
?> 
 | 
Загрузка плагинов
  Если вам нужно сделать что-то после того, как WordPress завершит загрузку активированных плагинов, вы можете рассчитывать на действие plugins_loaded . 
Начните свой плагин
  Правильный способ инициализации вашего плагина и его запуска — подключить его основную функцию к действию plugins_loaded .  Здесь у нас есть самый простой пример в мире: 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
 | 
 <?php 
add_action( ‘plugins_loaded’, ‘plugins_loaded_example’ ); 
function plugins_loaded_example() { 
    add_action( ‘wp_footer’, ‘display_message’, 100 ); 
} 
function display_message() { 
    echo ‘<p>This is some dummy text!</p>’; 
} 
// Example Source: http://www.scratchinginfo.com/common-wordpress-action-hooks-for-plugin-development/ 
?> 
 | 
Если вам нужен лучший пример, и я уверен, что вы это сделаете, вам определенно стоит проверить «макет WordPress Plugin Boilerplate» Тома Макфарлина, в котором есть все необходимое для создания плагина WordPress с учетом концепции объектно-ориентированного программирования.
Конец третьей части
Мы прошли третью серию из 50 действий в этой статье. Надеюсь, вам понравилось и узнало что-то новое. Увидимся в следующем!
Я тоже хочу услышать ваши мысли. Что вы думаете об этих действиях? Оставьте свои комментарии ниже; и если вам понравилась статья, не забудьте поделиться ею!