WordPress 4.7: произвольные массовые действия, наследование тем и т.д.

Дата публикации:Октябрь 12, 2016

wp47

В 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}”. Это потребует меньше времени выполнения, а также не приведет к ранней остановке всех подцепленных функций. Такое улучшение было бы очень простым и удобным.

Произвольные массовые действия

bulka

Наконец-то в 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

Поделиться

7 комментариев

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

  2. вот бы еще rest api при моей жизни закончили :D

  3. Looler says:

    Спасибо большое, Дим!

  4. Полезная статья! А насчет появления опции отключить смайлы вообще через амдинку — не слышно пока? А то все время висит этот кусок в коде, и все время его через хуки приходится убирать — ну ни разу еще не приходилось делать сайт, клиенты которого просили бы использование смайлов

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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