В этой серии мы рассмотрим действия 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 действий в этой статье. Надеюсь, вам понравилось и узнало что-то новое. Увидимся в следующем!
Я тоже хочу услышать ваши мысли. Что вы думаете об этих действиях? Оставьте свои комментарии ниже; и если вам понравилась статья, не забудьте поделиться ею!