Статьи

Пятьдесят действий WordPress — 50 примеров (от 21 до 30)

В этой серии мы рассмотрим действия 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 вечера в субботу.

Есть много виджетов по умолчанию, которые WordPress предлагает в своей основе, и виджет «Мета» является одним из них. С помощью действия wp_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 в разделе комментариев (без официального плагина) и хотите видеть последние комментарии на своей панели, вы можете использовать фрагмент кода ниже, чтобы добавить виджет панели:

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 действий в этой статье. Надеюсь, вам понравилось и узнало что-то новое. Увидимся в следующем!

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