14 октября 2020

Отправить данные ecommerce datalayer в prestashop

 <Script type = "text / javascript">

dataLayer = ( {
 'transactionId' : '{literal} {$order_id} {/literal}' ,       
 'transactionTotal' : {literal } { $total_a_payment } {/literal } , 
 'transactionTax' : { literal } { $tax } { /literal } , 
 'transactionShipping' : { literal } { $ expenses_envoice } { /literal 
   } , 
   'transactionProducts' : [ { /literal } { foreach from = $ products 
  item = product name = products } { /literal } 
  {
 'Sku' : '{literal}{$producto.id_product}{/literal}' , 
 'Name' : '{literal}{$producto.name}{/literal}' , 
 'Price' : {  literal } { $ product . Price_wt } { /literal } , 
 'Quantity' : {  literal } { $ product . Quantity } { /literal } 
  } {  Literal} {if $ smarty.foreach.productos.iteration! = $ Products 
  | @count} {literal}, {/ literal } { / if } { /literal }
   {  Literal} {/ foreach } ] , { /literal }
  'Event' : 'transactionComplete' 
   } )
  </ Script>
  { / Literal }
Правим файл controllers/front/OrderConfirmationController.php. Находим function displayOrderConfirmation вставляем код:
$order = new Order($this->id_order);
$currency = new Currency($order->id_currency);
/* added part */
$cart = new Cart($order->id_cart);
$products = $cart->getProducts();
$this->context->smarty->assign(array(
 'order_id'=> $this->id_order,
 'total_a_payment'=> $order->total_paid_tax_incl,
 'expenses_envoice'=> $order->total_shipping_tax_incl,
 'tax'=> ($order->total_paid_tax_incl - $order->total_paid_tax_excl),
 'products' => $products
));
/*end of added*/

12 сентября 2020

5 ПОПУЛЯРНЫХ PHP-ШАБЛОНИЗАТОРОВ

Введение

Несмотря на то, что PHP уже сам по себе в какой-то степени шаблонизатор, существует достаточно других шаблонизаторов, которые появились не просто так. В этой статье я сравню между собой популярные шаблонизаторы на PHP.

Зачем нужны шаблонизаторы?

Чем сложнее приложение, тем важнее разделять логику и представление. Только в случае успешного разделения логики от представления backend-разработчики смогут эффективно сотрудничать с frontend-разработчиками. Благодаря шаблонизаторам frontend-разработчики (или в простонародье — верстальщики) могут изменять внешний вид web-приложения, используя понятный синтаксис выбранного шаблонизатора. Обычно шаблоны представляют собой небольшие куски HTML-кода, в которые встроен вывод переменных, подготовленных backend-разработчиком. 

<a href="{$uri}" class="{$classnames}" title="{$menutitle}">{$menutitle}</a>

Иногда фронт вообще написан на JavaScript, а общение с бэком происходит посредством API, но это совсем другая история.

Список шаблонизаторов для сравнения

К шаблонизаторам применялись следующие критерии: они должны быть написаны на PHP, активно поддерживаться и быть признанными сообществом PHP.

Blade

Этот шаблонизатор используется в Laravel — PHP-фреймворке, начавшем свою жизнь в 2011 г и ставшим одним из популярных PHP-фреймворков. По слухам, причиной скорости Blade является небольшой список регулярных выражений для замены. 

Laravel Github: https://github.com/laravel/laravel

<html>
    <head>
        <title>App Name - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Mustache

Mustache доступен для практически неограниченного количества языков, в том числе и PHP. Также он содержит минимум логики: замена, цикл foreach, проверка на null. 

Github: https://github.com/janl/mustache.js/

Hello {{name}}
You have just won {{value}} dollars!
{{#in_ca}}
Well, {{taxed_value}} dollars, after taxes.
{{/in_ca}}

Smarty

Smarty появился в начала нулевых, до сих пор развивается и конкурирует с более молодыми проектами.

Github: https://github.com/smarty-php/smarty

<html>
<head>
<title>{$title}</title>
</head>
<body>
{* Comment  *}
{include file='content.tpl'}
</body>
</html>

Twig

Данный шаблонизатор обрёл свою популярность благодаря Фабьену Потенцеруб, внедрившему его в систему представлений фреймворка Symfony. Тем не менее, Twig может быть внедрён практически в любой проект, то есть независимо от фреймворка. 

Github: https://github.com/twigphp/Twig

{{ foo }}
{# comment #}
{% if foo %}{% endif %}

Volt

Volt используется в фреймворке Phalcon (фреймворк, написанный на C и распространяемый как PHP-расширение). Из недостатков можно отметить лишь то, что Volt можно использовать только в Phalcon, то есть нет возможности использовать в проекте на другом фреймворке. 

Phalcon Github: https://github.com/phalcon/cphalcon

{# app/views/products/show.volt #}

{% block last_products %}

{% for product in products %}
    * Name: {{ product.name|e }}
    {% if product.status === "Active" %}
       Price: {{ product.price + product.taxes/100 }}
    {% endif  %}
{% endfor  %}

{% endblock %}

Как выбрать шаблонизатор?

При выборе шаблонизатора нужно учитывать следующие факторы: синтаксис, логика, расширяемость, документация, активность разработки, поддержка сообщества и производительность. 

Blade

Синтаксис и функциональность

Blade поддерживает наследование шаблонов, секции, безопасный ввод содержимого и простой синтаксис. Blade разрешает использование PHP внутри шаблонов.

Документация и поддержка

Blade отлично документирован, но документация носит характер обзоров, в то время как более детальная информация содержится на сторонних ресурсах. 

Производительность

Во время теста скорость достигала 100 000 шаблонов в секунду. Но если учитывать обработку шаблонов вместе с загрузкой фреймворка, то скорость около 2 200 шаблонов в секунду. 

Mustache

Синтаксис и функциональность

Шаблоны Mustache не могут содержать логику, поэтому backend-разработчикам приходится реализовывать излишнюю логику, связанную с представлением. 

Документация и поддержка

Ввиду ограниченных возможностей Mustache не требуется большой и подробной документации. 

Производительность

Mustache, по очевидным причинам, оказался очень быстрым (6,000 шаблонов в секунду).

Smarty

Синтаксис и функциональность

Синтаксис лаконичен и прост для восприятия. Функционал большой и расширяемый. 

Документация и поддержка

Документация у Smarty хорошо организована. Сайт выглядит немного устаревшим, но это является проблемой. 

Производительность

Smarty довольно быстро обрабатывает некэшируемые шаблоны (9 634 шаблонов в секунду) and ещё быстрее — кэшируемые (57 115 шаблонов в секунду). 

Twig

Синтаксис и функциональность

Twig поставляется с полным набором функций, фильтров, тестов и расширяемых макросов.

Документация и поддержка

Документация отлично организована, информативна и содержит наглядную информацию. Сообщество вокруг Twig большое, ведётся активная разработка на GitHub. Twig используется в Drupal 8, второй по популярности CMS. 

Производительность

Обработка некэшируемых шаблонов происходит со скоростью 4 318 шаблонов в секунду, а кэшированных — 5 982.

Volt

Синтаксис и функциональность

Volt очень похож на Twig. В нём доступен функционал для создания собственных фильтров, макросов и расширений движка.

Документация и поддержка

Документация чистая, информативная и наглядная. Разработка Volt, как и Phalcon, идёт на GitHub полным ходом.

Производительность

Ввиду того, что фреймворк написан на C, Volt обрабатывает 23 900 шаблонов в секунду и вдвое больше при включении кэширования. 

Выводы

Наиболее оптимальным вариантом является Twig. Потому что шаблонизатор не зависит от фреймворка, запускается очень быстро, содержит достаточно функционала, имеет отличную документацию и активно развивается. 

В качестве бонуса замечу, что синтаксис идентичен синтаксису Volt. 

Закрыть от индексации динамические страницы на Wordpress

<code>
<? $noindex = [
'mob\/',
'novosti\/sajt-znakomstv\/',
'room_type=',
'position_type=',
'fb_comment_id=',
'url=',
'uslugi\/retro-igry\/',
'novosti\/zavtrak\/',
'source=',
'phrase='
];
foreach ($noindex as $uri) { 
if (preg_match('#'.$uri.'#', $_SERVER['REQUEST_URI'])) { ?>
<meta name="robots" content="noindex, nofollow"> <?
break;
};
}; ?>
</code>

19 августа 2020

htaccess основное для Wordpress

 ############################################################################

#### Удаляем index.html из URL                                       

############################################################################

RewriteRule ^(.*)index\.html$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteRule ^(.*)index\.htm$ https://%{HTTP_HOST}/$1 [R=301,L]


############################################################################

# удалить .html на конце

############################################################################

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP

RewriteRule ^([^.]+)\.html$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !(\.[^./]+)$

RewriteCond %{REQUEST_fileNAME} !-d

RewriteCond %{REQUEST_fileNAME} !-f

RewriteRule (.*) /$1.html [L]


############################################################################

#### Добавляем слеш(/), если его нет, и это не файл.                    ####

############################################################################

RewriteCond %{REQUEST_URI} !(.*)/$

   # Если слеша в конце нет.

RewriteCond %{REQUEST_FILENAME} !-f

   # Не является файлом.

RewriteCond %{REQUEST_URI} !\..+$

   # В URL нет точки (файл).

RewriteRule ^(.*)$ $1/ [L,R=301]

   # Добавляем слеш в конце.


############################################################################

# Переключает url в нижний регистр, если найдены символы в верхнем регистре

############################################################################

RewriteCond %{REQUEST_URI} [A-Z]

# Убедитесь, что это не файл на диске.

RewriteCond %{REQUEST_FILENAME} !-s

RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]


############################################################################

# удалить .php на конце

############################################################################

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.php\ HTTP

# исключение для wp-admin

RewriteCond %{REQUEST_URI} !wp-admin

RewriteRule ^([^.]+)\.php$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !(\.[^./]+)$

RewriteCond %{REQUEST_fileNAME} !-d

RewriteCond %{REQUEST_fileNAME} !-f

# исключение для wp-admin

RewriteCond %{REQUEST_URI} !wp-admin

RewriteRule (.*) /$1.php [L]

13 августа 2020

HTTPS для Wordpress

Перейдите на свой веб-сайт через FTP ещё раз и найдите файл .htaccess в каталоге public_html. Откройте его и найдите ранее добавленный код, чтобы установить переадресацию 301. Это должно выглядеть следующим образом:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

01 августа 2020

Wordpress отключение Emoji

//полное отключение Emoji start
add_filter('emoji_svg_url', '__return_empty_string');
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_styles', 'print_emoji_styles');    
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');  
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
function wph_remove_emojis_tinymce($plugins) {
if (is_array($plugins)) {
return array_diff($plugins, array('wpemoji'));
} else {
return array();
}
}
add_filter('tiny_mce_plugins', 'wph_remove_emojis_tinymce');
//полное отключение Emoji end

Wordpress Remove Query (?ver=4.7) – Удаляем строку запроса со статических ресурсов

Эта настройка может дать положительный эффект, так как окончания файлов типа 

?ver=4.7 могут привести к проблемам с кэшированием статики, особенно при использовании прокси и CDN. Удалить Query Strings в WordPress можно несколькими способами.


Внести следующие изменения в файл functions.php – вставить функцию, которая удалит query strings.

function _remove_script_version( $src ){
$parts = explode( '?ver', $src );
return $parts[0];
}
add_filter( 'script_loader_src', '_remove_script_version',15,1);
add_filter( 'style_loader_src', '_remove_script_version',15,1);

THE JAVASCRIPT LIBRARY “LOZAD.JS”

functions.php

wp_register_script('lozad', 'https://cdn.jsdelivr.net/npm/lozad', array(), '', false);
wp_enqueue_script('lozad');

в шаблоне

<script type="text/javascript">
const observer = lozad(); // lazy loads elements with default selector as ".lozad"
        observer.observe();
</script>


09 июня 2020

Как сменить php 7.3 на MacOS?

Откройте терминал и выполните команду:

curl -s https://php-osx.liip.ch/install.sh | bash -s 7.3
Система безопасности macOS может потребовать ввод пароля для получения доступа к системным файлам — вводите его. Скрипты компании Liip для установки PHP не содержат в себе вредоносного кода.

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

В результате скрипта будет развёрнут архив с файлами PHP 7.3 в директории пользователя, в моём случае, это было здесь:

/usr/local/php5-7.3.8-20190811-205217/
Окончание установки выглядело таким образом (обратите внимание на путь к распаковываемым файлам):

Настройка работы PHP 7.3 из терминала
Чтобы проверить текущую версию, запускаемую в терминале, выполните команду

php -v

Для работы composer в терминал у меня была поставлена версия PHP 7.2.16. Чтобы настроить запуск из терминала новой версии PHP нужно в файле ~/.bash_profile, если вы используете окружение терминала bash, добавить в конец файла следующие строки:

export PATH="/usr/local/php5-7.3.8-20190811-205217/bin:$PATH"
export PATH="/usr/local/php5-7.3.8-20190811-205217/sbin:$PATH"
Путь к установленной версии PHP может отличаться от указанного мною. Актуальный для вас путь содержится в терминале, где происходила установка новой версии и запуск команды curl. После сохранения изменений в файле .bash_profile, внутри новых сессий терминала будет использоваться указанная вами версия. Для обновления версии внутри текущей сессии терминала, следует прочесть файл заново с помощью вызова:

source ~/.bash_profile
Теперь при вызове php -v в терминале вы должны увидеть последнюю версию PHP:

Если нет файла ~/.bash_profile
В случае, если файл ~/.bash_profile не создан, то это можно сделать прямо из терминала с помощью команды:

touch ~/.bash_profile
А затем взять в редактирование с помощью выполнения вызова:

sublime ~/.bash_profile
Если у вас не настроен запуск редактора sublime text из консоли, то это вы можете сделать с помощью этой статьи.

Настройка PHP 7.3 во встроенном в macOS сервере Apache
В операционную систему macOS изначально установлен веб сервер Apache, который позволяет разрабатывать сайты и полностью себя конфигурировать без установки LAMP, Apache через brew и т.п. Чтобы встроенный сервер Apache загружал нужную версию модуля PHP следует ему указать это в конфигурационном файле. Файл конфигурации находится по адресу:

/private/etc/apache2/httpd.conf
В этом файле следует найти строку, содержащую слово php. По умолчанию, она выглядит следующим образом:

#LoadModule php7_module libexec/apache2/libphp7.so
Следует убрать у неё в начале #, чтобы эта строка не была закомментирована, а также прописать вместо libexec/apache2/libphp7.so полный путь до файла libphp7.so в директории с новой версией PHP 7.3. В моём случае, строка выглядит следующим образом:

LoadModule php7_module /usr/local/php5-7.3.8-20190811-205217/libphp7.so
Сохраняем файл, вводим пароль, подтверждающий наши права на сохранение файла в системном месте. А затем нужно перезапустить сервер Apache c помощью команды:

sudo apachectl restart

Как отключить систему защиты целостности системы (SIP) AKA «без рута» в macOs

  1. Перезагрузите Mac в режиме восстановления, перезагрузив компьютер и удерживая кнопку Command+, Rпока на экране не появится логотип Apple.
  2. Нажмите Утилиты> Терминал.
  3. В окне терминала введите csrutil disable и нажмите Enter.
  4. Перезагрузите ваш Mac.

21 апреля 2020

WordPress: Canonical Permalink для пагинации

/**
 * WordPress allows URIs with any numeric suffix, e.g.:
 * /canonical-page-or-postname/12345/
 * This functions performs a simple check and redirects
 * to the canonical URI if neccessary.
 *
 * @return void
 */
function canonical_request()
{
    global $page, $post;

    // post, page, attachment, preview
    if ( ! is_singular() or is_preview() )
    {
        return;
    }

    $permalink = get_permalink();

    // We don't have access to the number of sub pages here.
    // So we have to hack.
    $max_pages = substr_count(
        $post->post_content, '<!--nextpage-->') + 1;

    if ( 1 < $page and $page <= $max_pages )
    {
        /*
         * Handle different permalink settings, eg:
         * /%year%/%postname%.html or
         * /%year%/%postname%/
         */
        $rev_perma_struct = strrev(get_option('permalink_structure'));

        if ( '/' != $rev_perma_struct[0] )
        {
            $permalink .= "/$page";
        }
        else
        {
            $permalink .= "$page/";
        }
    }

    $host_uri       = 'http'
                    . ( empty ( $_SERVER['HTTPS'] ) ? '' : 's' )
                    . '://' . $_SERVER['HTTP_HOST'];
    $canonical_path = str_replace($host_uri, '', $permalink);

    if ( ! empty ( $_GET ) )
    {
        global $wp;
        // Array
        $allowed = $wp->public_query_vars;

        $out_arr = array();

        foreach ( $_GET as $k => $v )
        {
            if ( in_array($k, $allowed ) )
            {
                $out_arr[] = $k . ( empty ( $v ) ? '' : "=$v" );
            }
        }

        if ( ! empty ( $out_arr ) )
        {
            $canonical_path .= '?' . implode('&', $out_arr);
        }
    }

    if ( $canonical_path == $_SERVER['REQUEST_URI'] )
    {
        return;
    }
    // Debug current result:
    #print '<pre>' . var_export($canonical_path, TRUE) . '</pre>';

    // Change it or return 'false' to stop the redirect.
    $canonical_path = apply_filters(
        'toscho_canonical_path',
        $canonical_path
    );

    if ( FALSE != $canonical_path )
    {
        header('Location: ' . $permalink, true, 301);
        die("<a href='$permalink'>$permalink</a>");
    }

    return;
}
add_action('wp', 'canonical_request');

19 апреля 2020

Изменяю og:locale:alternate в wp_head с помощью yoast seo

add_action('get_header', 'blog_template_add_ob_start');
add_action('wp_head', 'blog_template_add_ob_end_flush', 100);
function blog_template_add_ob_start() {
  ob_start('blog_template_add_filter_wp_head_output');
}
function blog_template_add_ob_end_flush() {
  ob_end_flush();
}
function blog_template_add_filter_wp_head_output($output) {
  $output = str_ireplace('<meta property="og:locale:alternate" content="ru_RU" />', '<meta property="og:locale:alternate" content="ru_UA" />', $output);
  return $output;

13 апреля 2020

«Хлебные крошки» для WordPress без использования плагина, с помощью functions.php

functions.php


/*
 * "Хлебные крошки" для WordPress
 * автор: Dimox
 * версия: 2019.03.03
 * лицензия: MIT
*/
function dimox_breadcrumbs() {

 /* === ОПЦИИ === */
 $text['home']     = 'Главная'; // текст ссылки "Главная"
 $text['category'] = '%s'; // текст для страницы рубрики
 $text['search']   = 'Результаты поиска по запросу "%s"'; // текст для страницы с результатами поиска
 $text['tag']      = 'Записи с тегом "%s"'; // текст для страницы тега
 $text['author']   = 'Статьи автора %s'; // текст для страницы автора
 $text['404']      = 'Ошибка 404'; // текст для страницы 404
 $text['page']     = 'Страница %s'; // текст 'Страница N'
 $text['cpage']    = 'Страница комментариев %s'; // текст 'Страница комментариев N'

 $wrap_before    = '<div class="breadcrumbs" itemscope itemtype="http://schema.org/BreadcrumbList">'; // открывающий тег обертки
 $wrap_after     = '</div><!-- .breadcrumbs -->'; // закрывающий тег обертки
 $sep            = '<span class="breadcrumbs__separator"> › </span>'; // разделитель между "крошками"
 $before         = '<span class="breadcrumbs__current">'; // тег перед текущей "крошкой"
 $after          = '</span>'; // тег после текущей "крошки"

 $show_on_home   = 0; // 1 - показывать "хлебные крошки" на главной странице, 0 - не показывать
 $show_home_link = 1; // 1 - показывать ссылку "Главная", 0 - не показывать
 $show_current   = 1; // 1 - показывать название текущей страницы, 0 - не показывать
 $show_last_sep  = 1; // 1 - показывать последний разделитель, когда название текущей страницы не отображается, 0 - не показывать
 /* === КОНЕЦ ОПЦИЙ === */

 global $post;
 $home_url       = home_url('/');
 $link           = '<span itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">';
 $link          .= '<a class="breadcrumbs__link" href="%1$s" itemprop="item"><span itemprop="name">%2$s</span></a>';
 $link          .= '<meta itemprop="position" content="%3$s" />';
 $link          .= '</span>';
 $parent_id      = ( $post ) ? $post->post_parent : '';
 $home_link      = sprintf( $link, $home_url, $text['home'], 1 );

 if ( is_home() || is_front_page() ) {

  if ( $show_on_home ) echo $wrap_before . $home_link . $wrap_after;

 } else {

  $position = 0;

  echo $wrap_before;

  if ( $show_home_link ) {
   $position += 1;
   echo $home_link;
  }

  if ( is_category() ) {
   $parents = get_ancestors( get_query_var('cat'), 'category' );
   foreach ( array_reverse( $parents ) as $cat ) {
    $position += 1;
    if ( $position > 1 ) echo $sep;
    echo sprintf( $link, get_category_link( $cat ), get_cat_name( $cat ), $position );
   }
   if ( get_query_var( 'paged' ) ) {
    $position += 1;
    $cat = get_query_var('cat');
    echo $sep . sprintf( $link, get_category_link( $cat ), get_cat_name( $cat ), $position );
    echo $sep . $before . sprintf( $text['page'], get_query_var( 'paged' ) ) . $after;
   } else {
    if ( $show_current ) {
     if ( $position >= 1 ) echo $sep;
     echo $before . sprintf( $text['category'], single_cat_title( '', false ) ) . $after;
    } elseif ( $show_last_sep ) echo $sep;
   }

  } elseif ( is_search() ) {
   if ( get_query_var( 'paged' ) ) {
    $position += 1;
    if ( $show_home_link ) echo $sep;
    echo sprintf( $link, $home_url . '?s=' . get_search_query(), sprintf( $text['search'], get_search_query() ), $position );
    echo $sep . $before . sprintf( $text['page'], get_query_var( 'paged' ) ) . $after;
   } else {
    if ( $show_current ) {
     if ( $position >= 1 ) echo $sep;
     echo $before . sprintf( $text['search'], get_search_query() ) . $after;
    } elseif ( $show_last_sep ) echo $sep;
   }

  } elseif ( is_year() ) {
   if ( $show_home_link && $show_current ) echo $sep;
   if ( $show_current ) echo $before . get_the_time('Y') . $after;
   elseif ( $show_home_link && $show_last_sep ) echo $sep;

  } elseif ( is_month() ) {
   if ( $show_home_link ) echo $sep;
   $position += 1;
   echo sprintf( $link, get_year_link( get_the_time('Y') ), get_the_time('Y'), $position );
   if ( $show_current ) echo $sep . $before . get_the_time('F') . $after;
   elseif ( $show_last_sep ) echo $sep;

  } elseif ( is_day() ) {
   if ( $show_home_link ) echo $sep;
   $position += 1;
   echo sprintf( $link, get_year_link( get_the_time('Y') ), get_the_time('Y'), $position ) . $sep;
   $position += 1;
   echo sprintf( $link, get_month_link( get_the_time('Y'), get_the_time('m') ), get_the_time('F'), $position );
   if ( $show_current ) echo $sep . $before . get_the_time('d') . $after;
   elseif ( $show_last_sep ) echo $sep;

  } elseif ( is_single() && ! is_attachment() ) {
   if ( get_post_type() != 'post' ) {
    $position += 1;
    $post_type = get_post_type_object( get_post_type() );
    if ( $position > 1 ) echo $sep;
    echo sprintf( $link, get_post_type_archive_link( $post_type->name ), $post_type->labels->name, $position );
    if ( $show_current ) echo $sep . $before . get_the_title() . $after;
    elseif ( $show_last_sep ) echo $sep;
   } else {
    $cat = get_the_category(); $catID = $cat[0]->cat_ID;
    $parents = get_ancestors( $catID, 'category' );
    $parents = array_reverse( $parents );
    $parents[] = $catID;
    foreach ( $parents as $cat ) {
     $position += 1;
     if ( $position > 1 ) echo $sep;
     echo sprintf( $link, get_category_link( $cat ), get_cat_name( $cat ), $position );
    }
    if ( get_query_var( 'cpage' ) ) {
     $position += 1;
     echo $sep . sprintf( $link, get_permalink(), get_the_title(), $position );
     echo $sep . $before . sprintf( $text['cpage'], get_query_var( 'cpage' ) ) . $after;
    } else {
     if ( $show_current ) echo $sep . $before . get_the_title() . $after;
     elseif ( $show_last_sep ) echo $sep;
    }
   }

  } elseif ( is_post_type_archive() ) {
   $post_type = get_post_type_object( get_post_type() );
   if ( get_query_var( 'paged' ) ) {
    $position += 1;
    if ( $position > 1 ) echo $sep;
    echo sprintf( $link, get_post_type_archive_link( $post_type->name ), $post_type->label, $position );
    echo $sep . $before . sprintf( $text['page'], get_query_var( 'paged' ) ) . $after;
   } else {
    if ( $show_home_link && $show_current ) echo $sep;
    if ( $show_current ) echo $before . $post_type->label . $after;
    elseif ( $show_home_link && $show_last_sep ) echo $sep;
   }

  } elseif ( is_attachment() ) {
   $parent = get_post( $parent_id );
   $cat = get_the_category( $parent->ID ); $catID = $cat[0]->cat_ID;
   $parents = get_ancestors( $catID, 'category' );
   $parents = array_reverse( $parents );
   $parents[] = $catID;
   foreach ( $parents as $cat ) {
    $position += 1;
    if ( $position > 1 ) echo $sep;
    echo sprintf( $link, get_category_link( $cat ), get_cat_name( $cat ), $position );
   }
   $position += 1;
   echo $sep . sprintf( $link, get_permalink( $parent ), $parent->post_title, $position );
   if ( $show_current ) echo $sep . $before . get_the_title() . $after;
   elseif ( $show_last_sep ) echo $sep;

  } elseif ( is_page() && ! $parent_id ) {
   if ( $show_home_link && $show_current ) echo $sep;
   if ( $show_current ) echo $before . get_the_title() . $after;
   elseif ( $show_home_link && $show_last_sep ) echo $sep;

  } elseif ( is_page() && $parent_id ) {
   $parents = get_post_ancestors( get_the_ID() );
   foreach ( array_reverse( $parents ) as $pageID ) {
    $position += 1;
    if ( $position > 1 ) echo $sep;
    echo sprintf( $link, get_page_link( $pageID ), get_the_title( $pageID ), $position );
   }
   if ( $show_current ) echo $sep . $before . get_the_title() . $after;
   elseif ( $show_last_sep ) echo $sep;

  } elseif ( is_tag() ) {
   if ( get_query_var( 'paged' ) ) {
    $position += 1;
    $tagID = get_query_var( 'tag_id' );
    echo $sep . sprintf( $link, get_tag_link( $tagID ), single_tag_title( '', false ), $position );
    echo $sep . $before . sprintf( $text['page'], get_query_var( 'paged' ) ) . $after;
   } else {
    if ( $show_home_link && $show_current ) echo $sep;
    if ( $show_current ) echo $before . sprintf( $text['tag'], single_tag_title( '', false ) ) . $after;
    elseif ( $show_home_link && $show_last_sep ) echo $sep;
   }

  } elseif ( is_author() ) {
   $author = get_userdata( get_query_var( 'author' ) );
   if ( get_query_var( 'paged' ) ) {
    $position += 1;
    echo $sep . sprintf( $link, get_author_posts_url( $author->ID ), sprintf( $text['author'], $author->display_name ), $position );
    echo $sep . $before . sprintf( $text['page'], get_query_var( 'paged' ) ) . $after;
   } else {
    if ( $show_home_link && $show_current ) echo $sep;
    if ( $show_current ) echo $before . sprintf( $text['author'], $author->display_name ) . $after;
    elseif ( $show_home_link && $show_last_sep ) echo $sep;
   }

  } elseif ( is_404() ) {
   if ( $show_home_link && $show_current ) echo $sep;
   if ( $show_current ) echo $before . $text['404'] . $after;
   elseif ( $show_last_sep ) echo $sep;

  } elseif ( has_post_format() && ! is_singular() ) {
   if ( $show_home_link && $show_current ) echo $sep;
   echo get_post_format_string( get_post_format() );
  }

  echo $wrap_after;

 }
} // end of dimox_breadcrumbs()

Выводим в шаблоне


<?php if ( function_exists( 'dimox_breadcrumbs' ) ) dimox_breadcrumbs(); ?>