Хлебные крошки в Woocommerce

Хлебные крошки заданы функцией woocommerce_breadcrumb(), которая определена в файле \wp-content\plugins\woocommerce\includes\wc-template-functions.php

Шаблон хранится в файле \wp-content\plugins\woocommerce\templates\global\breadcrumb.php. Чтобы изменить его, необходимо скопировать этот файл в папку с Вашей темой
\wp-content\themes\ВАША_ТЕМА\woocommerce\global\breadcrumb.php

Саму функцию тоже можно переопределить, так как она обернута в

if ( ! function_exists( 'woocommerce_breadcrumb' ) ) { }
. Свою функцию с именем woocommerce_breadcrumb() можно задать в файле functions.php Вашей темы.

Параметры можно передавать через массив $args

Теперь разберем саму функцию:

function woocommerce_breadcrumb( $args = array() ) {
  $args = wp_parse_args( $args, apply_filters( 'woocommerce_breadcrumb_defaults', array(
    'delimiter'   => ' / ',
    'wrap_before' => '',
    'before'      => '',
    'after'       => '',
    'home'        => _x( 'Home', 'breadcrumb', 'woocommerce' ),
  ) ) );

  $breadcrumbs = new WC_Breadcrumb();

  if ( ! empty( $args['home'] ) ) {
    $breadcrumbs->add_crumb( $args['home'], apply_filters( 'woocommerce_breadcrumb_home_url', home_url() ) );
  }

  $args['breadcrumb'] = $breadcrumbs->generate();

  /**
   * @hooked WC_Structured_Data::generate_breadcrumblist_data() - 10
   */
  do_action( 'woocommerce_breadcrumb', $breadcrumbs, $args );

  wc_get_template( 'global/breadcrumb.php', $args );
} 

Разберем всё по порядку.

$args = wp_parse_args( $args, apply_filters( 'woocommerce_breadcrumb_defaults', array(

Здесь есть фильтр (apply_filters) и функция wp_parse_args().

wp_parse_args - сравнивает два массива. Первый, который мы передаем в качестве аргумента функции, сравнивается с массивом аргументов по-умолчанию. Если найдутся совпадения, то будут использоваться настройки переданные функцией, в противном случае, по-умолчанию.

Фильтр apply_filters меняет значения массива по умолчанию. Если нужно изменить только их, но не нужно переопределять всю функцию. Достаточно только добавить новый фильтр.

Например, заменим разделитель в хлебных крошках. Для этого в файле function.php добавим строки:

add_filter( 'woocommerce_breadcrumb_defaults', 'my_breadcrumbs_delimiter');
function my_breadcrumbs_delimiter($args) {
  $args['delimiter'] = ' | ';
  return $args;
}

Далее создается экземпляр класса $breadcrumbs = new WC_Breadcrumb();. Сам класс определен в файле \wp-content\plugins\woocommerce\includes\class-wc-breadcrumb.php. Там же и используемые функции add_crumb(), generate()

При инициализации нового экземпляра класса WC_Breadcrumb создается массив $crumbs в который и будут добавляться элементы хлебных крошек.

/**
 * Add a crumb so we don't get lost.
 *
 * @param string $name
 * @param string $link
 */
public function add_crumb( $name, $link = '' ) {
  $this->crumbs[] = array(
    strip_tags( $name ),
    $link,
  );
}

В этом массиве каждый элемент массива это массив из двух значений - имени и ссылки. Далее чтобы взаимодействовать с массивом всех крошек есть хук woocommerce_get_breadcrumb, применяемый в функции get_breadcrumb() том же файле.

/**
 * Get the breadcrumb.
 *
 * @return array
 */
public function get_breadcrumb() {
  return apply_filters( 'woocommerce_get_breadcrumb', $this->crumbs, $this );
}

С помощью этого фильтра можно изменить массив крошек.

Фильтр woocommerce_breadcrumb_home_url поможет заменить URL главной страницы в хлебных крошках на любой другой. Пример использования в functions.php:

add_filter( 'woocommerce_breadcrumb_home_url', 'woo_custom_breadrumb_home_url' );
function woo_custom_breadrumb_home_url() {
  return 'НЕОБХОДИМЫЙ_ВАМ_УРЛ';
}

Далее вызывается метод $breadcrumbs->generate(), который в зависимости от типа страницы возвращает хлебные крошки.

Последнее действие функции woocommerce_breadcrumb() это передача данных в шаблон с помощью wc_get_template( 'global/breadcrumb.php', $args );

© 2016 — 2020. При копировании материалов обязательна активная индексируемая ссылка на источник.