WordPress 4.7: произвольные массовые действия, наследование тем и т.д.
В WordPress 4.7 появится много новых возможностей, таких как, к примеру, задание произвольных массовых действий, наследование тем и т.д. Однако некоторые вещи могут привести к тому, что сайты ваших клиентов перестанут работать. Далее мы рассмотрим это в деталях.
Нововведения в ядре WordPress
Я всегда рад тому, когда в ядре появляются новые функции, которыми можно воспользоваться. Ниже мы коснемся самых свежих изменений и рассмотрим некоторые примеры.
Наследование тем стало проще
Наследование тем в WordPress появилось уже давно. В данный момент оно реализовано с помощью функции locate_template. В WordPress 4.7 появится несколько дополнительных функций, которые предназначены для того же самого:
- get_theme_file_uri
- get_parent_theme_file_uri
- get_theme_file_path (почти как locate_template)
- get_parent_theme_file_path
Названия функций говорят сами за себя. К примеру, вызов get_theme_file_uri( ‘inc/foo.php’ ) приведет к поиску файла “inc/foo.php” сначала в дочерней теме, а затем уже в родительской теме. Как только файл будет найден, функция вернет URL файла или путь, если использовалась функция get_theme_file_path.
Если этого недостаточно, то фильтры по типу theme_file_path помогут расширить возможности. Представьте себе плагин, который идет вместе со своими шаблонами. Добавить эти шаблоны можно будет следующим образом:
add_filter( 'theme_file_path', function ( $path, $file ) { if ( $path ) { // already found in child- or parent-theme => keep it like that return $path; } // look up in my plugin if ( file_exists ( WP_PLUGIN_DIR . '/' . $file ) ) { return WP_PLUGIN_DIR . '/' . $file; } } ); // within the plugin do something like this: if ( $path = get_theme_file_path( 'my-plugin-slug/a-template.php' ) ) { require_once $path; }
Преимущество состоит в том, что WordPress ищет файл «my-plugin-slug/a-template.php» в следующих локациях:
- wp-content/themes/child-theme/my-plugin-slug/a-template.php
- wp-content/themes/parent-theme/my-plugin-slug/a-template.php
- wp-content/plugins/my-plugin-slug/a-template.php
Теперь тема сможет переопределить то, как будет выглядеть шорткод или виджет, с помощью простого хука. Мне хотелось бы видеть это везде.
Переопределяем любой шорткод
В WordPress 4.7 появится очень удобный фильтр для изменения шорткодов «на лету». Некоторые темы или плагины несут в себе прописанные шорткоды, и ваш клиент может захотеть их несколько видоизменить. Фильтр “pre_do_shortcode_tag” позволяет переопределить шорткод с помощью вашей функции:
// lets change the fictional [marquee] shortcode add_filter( 'pre_do_shortcode_tag', function ( $short_circuit, $tag, $attr ) { if ( 'marquee' != $tag ) { // not the marquee shortcode => ignore return $short_circuit; } // seems to be marquee => show something else return 'rly? marquee? is it 1990 again?'; }, 10, 3 );
Теперь шорткод перезаписан с помощью вашей функции, что определено в документации:
«Передача truthy (истинного, если говорить условно) значения в фильтр позволит эффективно внедриться в процесс генерации шорткода, в результате чего будет возвращено новое значение».
Очень полезно, если вы покупаете тему и хотите изменить поведение шорткода для некоторых страниц или отключить шорткоды в некоторых местах. Помните, что даже строки с пробелами являются истинным значением.
Я надеюсь, что фильтр “pre_do_shortcode_tag” будет более динамичным благодаря использованию фильтра “pre_do_shortcode_{$shortcode}”. Это потребует меньше времени выполнения, а также не приведет к ранней остановке всех подцепленных функций. Такое улучшение было бы очень простым и удобным.
Произвольные массовые действия
Наконец-то в WordPress будут поддерживаться произвольные массовые действия. Их можно будет очень легко зарегистрировать, и это будет осуществимо для любого типа записей:
add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' ); function register_my_bulk_actions( $bulk_actions ) { $bulk_actions['export_multiple'] = __( 'Export', 'acme'); return $bulk_actions; }
Как только будет отмечено несколько строк и выбрано наше произвольное массовое действие, нам нужно будет только обработать его. Как обычно, мы подцепляем функции:
add_filter( 'handle_bulk_actions-edit-post', 'my_bulk_action_handler', 10, 3 ); function my_bulk_action_handler( $redirect_to, $action, $post_ids ) { if ( $action !== 'export_multiple' ) { return $redirect_to; } foreach ( $post_ids as $post_id ) { // Perform action for each post. } // after doing so allow a notice via URL-Query $redirect_to = add_query_arg( 'bulk_export_multiple', count( $post_ids ), $redirect_to ); return $redirect_to; }
Далее мы можем управлять параметром “bulk_export_multiple” и выводить уведомление пользователю:
add_action( 'admin_notices', 'my_bulk_export_multiple_notice' ); function my_bulk_export_multiple_notice() { if ( empty( $_REQUEST['bulk_export_multiple'] ) ) { // none of our business => early exit return; } // inform the user how many have been exported $count = intval( $_REQUEST['bulk_export_multiple'] ); printf( '<div id="message" class="updated fade">' . __( '%s exported.', 'acme' ) . '</div>', $emailed_count ); }
Это яркий пример того, как могут быть добавлены произвольные массовые действия. Интересно, сколько новых плагинов появится в каталоге WordPress, позволяющих улучшить и расширить этот функционал.
Смайлы, логотипы и сокращения
Представьте себе такую ситуацию: вы хотите, чтобы, если ваш клиент написал “LMFAO” или “:LOGO:” в тексте, то эта фраза была заменена на смайл или на логотип компании. Или, к примеру, вы хотите заменить некоторые сокращения на их полный текст. Все это будет возможно в WordPress 4.7. В данной версии будет решен вопрос с фильтрами для стандартных смайлов. Расширить набор смайлов можно будет с помощью простого фильтра:
add_filter( 'smilies', function ( $wpsmiliestrans ) { $wpsmiliestrans[':logo:'] = 'logo.png' } );
Этот фильтр позволит вам добавлять или удалять emoji в зависимости от контекста. Теперь функция translate_smiley() будет возвращать путь вида «wp-includes/images/smilies/logo.png». Это можно скорректировать с помощью фильтра «smilies_src»:
add_filter( 'smilies_src', function ( $smiley_url, $img ) { if ( file_exists( get_stylesheet_directory() . '/img/' . $img ) ) { // found image in theme => use it return get_stylesheet_uri() . '/img/logo.png'; } // otherwise do nothing return $smiley_url } );
Создаем свою собственную систему событий с помощью WP_Hook
Новый класс WP_Hook будет введен для покрытия системы фильтров и хуков WordPress. Чем он хорош? Тем, что вы можете создавать свою собственную систему событий:
$_my_own_events = array(); // add callbacks to a task add_task( 'cat', 'purr_function' ); add_task( 'cat', 'eat_function' ); // execute a task do_task( 'cat' ); // and here are the according functions (summarized) function add_task( $tag, $callable ) { global $_my_own_events; if ( ! isset( $_my_own_events[ $tag ] ) ) { // not yet registered => create new hook $_my_own_events[ $tag ] = new WP_Hook(); } $_my_own_events[ $tag ]->add_filter( $tag, $callable, 10, 0 ); } function do_task( $tag, $args ) { global $_my_own_events; if ( ! isset( $_my_own_events[ $tag ] ) ) { // task does not exist => do nothing return false; } $_my_own_events[ $tag ]->do_action( $args ); }
Это подойдет в том случае, если вы хотите управлять брокером сообщений, отделенным от фильтров и действий WordPress. Также есть масса иных вариантов, где может быть применен этот фильтр.
Другие возможности
Это было бы прекрасно! После установки WordPress вы сразу же входите в консоль. Вместо того чтобы перенаправляться к экрану входа, вы тут же переноситесь в консоль сразу после установки и можете продолжить работу. Код говорит – «Да!», но демо говорит «Нет!». После установки самой свежей версии WordPress я по-прежнему был перенесен к странице входа.
Если у вас есть выпадающие списки, которые показывают всех пользователей, то теперь новая функция wp_dropdown_users позволяет вам фильтровать их по роли. Вы можете задавать опцию ‘role__in’, чтобы получить только некоторых пользователей (подписчиков, администраторов и т.д.), либо опцию ‘role__not_in’, чтобы получить всех остальных пользователей, не имеющих данной роли.
Еще одна новинка – ссылка View posts. Эта ссылка будет расположена в админ-баре и будет вести на страницу архивов. Если вы боитесь, что ваши клиенты наедут на вас из-за того, что страница архивов не проработана должным образом, вы можете просто удалить пункт с ID «archive» из админ-бара.
Пароли для защищенных записей теперь поддерживают длину до 255 символов. Этому тикету стукнуло 12 лет. Он наконец-то будет решен в WordPress 4.7.
Что еще:
- Функция get_the_archive_description теперь будет показывать описание автора на архивной странице этого автора.
- WP_Term_Query позволит проводить сортировку по разделенному запятыми списку term_ids (get_terms([‘includes’=>’2,3’, ‘orderby’=>’includes’]).
- Заголовки загружаемых файлов теперь будут чиститься. Появится возможность изменить заголовок через фильтр sanitize_title.
- Теперь можно будет загружать шаблоны рубрик с названиями на языках, отличающихся от английского. К примеру, раньше нельзя было создать “category-машина.php”. Теперь будет можно.
Изменения, о которых вы должны знать
Собирая информацию о новых возможностях WordPress 4.7, я также обнаружил некоторые из них, которые могут повредить сайты ваших клиентов. Либо я что-то упустил из виду, либо функции пока еще не доработаны до конца. WordPress славится своей великолепной обратной совместимостью, но следующие вещи выглядят полной противоположностью этому. Будьте готовы к этому, обновляя клиентские сайты или обслуживая свои плагины/темы.
Кастомайзер: IE8 больше не поддерживается
Поддержка Internet Explorer 8 будет прекращена. Этой версии браузера стукнуло уже 7 лет, а PHP 5.2 – уже 10 лет. Почему я об этом говорю? Просто так.
Это изменение затрагивает только кастомайзер в предстоящем выпуске WordPress. Если у вас есть клиенты, по каким-то причинам все еще работающие с IE8, то в таком случае вот интересная вещь для вас:
<!--[if lte IE 8]> <script type="text/javascript"> document.body.className = document.body.className.replace( /(^|s) (no-)?customize-support(?=s|$)/, '' ) + ' no-customize-support'; </script> <![endif]-->
Класс CSS “no-customize-support” показывает, что текущий браузер не может обработать кастомайзер соответствующим образом. Вы можете подцепиться и показать какое-либо уведомление.
Другие функции, которые считаются устаревшими в WordPress 4.7
Функция wp_get_network, которая появилась в WordPress 3.9, перейдет в разряд устаревших в WordPress 4.7. Вместо нее теперь следует использовать get_network.
Мелкие, но очень важные изменения
Для создания меню у нас был простой поиск, который помогает нам искать записи, страницы и т.д. Он отображал неопубликованные записи и страницы, которые больше не представлены на сайте. Согласно коммиту в “Menu Customizer: Adding draft items?”, запрос был изменен. Если вы используете что-то по типу запланированных пунктов меню, то в таком случае посмотрите, все ли работает как надо.
Обе функции wp_enqueue_style и wp_enqueue_script получили измененную сигнатуру. Значение по умолчанию для аргументов «src» теперь пустая строка вместо логического значения false. Если вы используете строгую проверку на булев false, то в таком случае протестируйте ваш плагин в текущей альфа-версии WordPress 4.7.
Некоторые плагины и темы добавляют свои собственные таблицы и используют для этого dbDelta. Часто они задают индекс своих таблиц в виде «IDX_NAMES», что будет автоматически переведено WordPress в нижний регистр “idx_names”. Учтите, что все будет очищаться в dbDelta, а индексы получат другое наименование.
Кастомайзер всегда имел ссылки без подчеркивания, но теперь практически каждая ссылка получит подчеркивание.
В WP_Rest_Request есть публичный метод ::sanitize_params(), который чистит параметры, передаваемые в запросе. Раньше этот метод возвращал null, если все работало как надо. В версии WordPress 4.7 он будет возвращать true, что является совершенно другой вещью даже в PHP. Если вы проверяете на null, то в таком случае смените проверку на true для WP 4.7 и выше.
Источник: https://wp-includes.org