Загрузка разных счётчиков с помощью jQuery.getScript() без плагинов WordPress

Всем привет! Иногда бывает, что счётчики Google Analytics, Яндекс.Метрика и счётчик mail.ru тормозят загрузку основной страницы. Написал js скрипт для того, чтобы это избежать.

jQuery(document).ready(function($) {
    $.ajaxSetup({cache : true});

    // Данные для Google Analytics
    window.dataLayer = [];
    window.gtag = function() {
        window.dataLayer.push(arguments);
    }

    $.getScript(
        // !! ОБЯЗАТЕЛЬНО ЗАМЕНИТЕ ИДЕНТИФИКАТОР GOOGLE ANALYTICS "G-41BWRDZLG5" НА СВОЙ !!
        'https://www.googletagmanager.com/gtag/js?id=G-41BWRDZLG5',
        function() {
            gtag('js', new Date());
            gtag('config', 'G-41BWRDZLG5');
        }
    );

    // Данные для Яндекс.Метрики
    window.ym = function() { (window.ym.a||[]).push(arguments); }
    window.ym.l = 1*new Date();

    $.getScript(
        'https://mc.yandex.ru/metrika/tag.js',
        function() {
            // !! ОБЯЗАТЕЛЬНО ЗАМЕНИТЕ ИДЕНТИФИКАТОР ЯНДЕКС МЕТРИКИ "91531653" НА СВОЙ !!
            ym(91531653, "init", {
                    webvisor:true,
                    trackLinks:true,
                    clickmap:true,
                    accurateTrackBounce:false
                }
            );
        }
    );

    // Данные для top.mail.ru
    var _tmr = window._tmr || (window._tmr = []);
    _tmr.push({
        // !! ОБЯЗАТЕЛЬНО  ЗАМЕНИТЕ ИДЕНТИФИКАТОР MAIL.RU "2601331" НА СВОЙ !!
        id: "2601331",
        type: "pageView",
        start: (new Date()).getTime()
    });

    $.getScript('//top-fwz1.mail.ru/js/code.js');
});

Известная бага счётчика Яндекс.Метрика — замедление сайта, поэтому скачал его локально в папку [wordpress_folder]/metrika и добавил в задачу в crontab для обновления этого файла каждый час, Затем заменил https://mc.yandex.ru/metrika/tag.js в скрипте выше на /metrika_tag.js.

@hourly curl -s https://mc.yandex.ru/metrika/tag.js -o [wordpress_folder]/metrika_tag.js

Источник вдохновения статья Yandex Metrika: Сторонний код заблокировал основной поток. Не забудьте поменять идентификаторы счётчиков и проверить, что tag.js доступен по адресу [ваш сайт]/metrika/tag.js, если вы решили воспользоваться ускорением загрузки счётчика.

Чтобы добавить загрузку счётчиков в WordPress, необходимо положить его содержимое в файлик wordpress/wp-content/themes/[ваша_тема]/js/counters.js и добавить следующий код в wordpress/wp-content/themes/[ваша_тема]/functions.php:

functions.php (для всех пользователей)

function enqueue_counter() {
  // Регистрируем скрипт
  wp_register_script('counters', get_template_directory_uri() . '/js/counters.js', array('jquery'), false, true);
    
  // Загружаем скрипт
  wp_enqueue_script('counters');
}
add_action('wp_enqueue_scripts', 'enqueue_counters');

Я использую проверку, что пользователь не авторизован, зачем мне отслеживать самого себя:

functions.php (только для неавторизованных пользователей)

function enqueue_counter() {
  // Регистрируем скрипт
  wp_register_script('counters', get_template_directory_uri() . '/js/counters.js', array('jquery'), false, true);
    
  // Загружаем скрипт, если пользователь неавторизован
  if (!is_user_logged_in()) {
    wp_enqueue_script('counters');
  }
}
add_action('wp_enqueue_scripts', 'enqueue_counters');

Обновление скрипта резервного копирования

Обновил скрипт для резервного копирования. Убрал вызов bc, вынес всё в отдельные функции, причесал код, чтобы ShellCheck был счастлив:

#!/usr/local/bin/bash

BACKUP_ROOT=/var/backups/manual/
BACKUP_DIR="$BACKUP_ROOT"$(date +"%Y-%m-%d/%H-%M")
PREFIX=$(date +"%Y%m%d_%H%M")
LIMIT=$((4*1024*1024))

exit_on_error() {
    exit_code=$?
    if [ $exit_code -ne 0 ]; then
        >&2 echo -e "FAIL"
        exit $exit_code
    fi
}

print_used_space() {
    printf "Used space: "
    SIZE=$(du -sB 1 $BACKUP_ROOT | cut -f 1)
    printf "%sMb(%s%%)\n" "$((SIZE / 1024))" "$((SIZE * 100 / LIMIT))"
}

backup_etc() {
    FILENAME="$PREFIX"_etc.tar.bz2
    printf "Creating %s .. " "$FILENAME"
    if /usr/bin/tar -Pjcf "$BACKUP_DIR"/"$FILENAME" /etc /usr/local/etc /home /var/db/ports /var/named/etc/namedb /root/scripts > /dev/null 2>&1; then
        printf "OK\n"
    else
        exit_on_error
    fi
}

backup_site() {
    FILENAME="$PREFIX"_www.tar.bz2
    printf "Creating %s .. " "$FILENAME"
    if /usr/bin/tar -Pjcf "$BACKUP_DIR"/"$FILENAME" /usr/local/www > /dev/null; then
        printf "OK\n"
    else
        exit_on_error
    fi
}

backup_db() {
    FILENAME="$PREFIX"_db.sql.bz2
    printf "Creating %s .. " "$FILENAME"
    if /usr/local/bin/mysqldump --login-path=backup --opt --all-databases --triggers --routines --events | bzip2 -c > "$BACKUP_DIR"/"$FILENAME"; then
        printf "OK\n"
    else
        exit_on_error
    fi
}

remove_old_files() {
    removed=0
    for days in $(seq 100 -1 0)
    do
        SIZE=$(du -sB 1 $BACKUP_ROOT | cut -f 1)
        if [[ $SIZE -le $LIMIT ]]; then
            break
        fi
        if [[ -z "$(find $BACKUP_ROOT -type f -mtime +"$days")" ]]; then
            continue
        fi
        printf "Removing files older than %d days:\n" "$days"
        find $BACKUP_ROOT -type f -mtime +"$days"d -delete -print
        find $BACKUP_ROOT -empty -type d -delete -print
        removed=1
    done

    if [ $removed -ne 0 ]; then
        true
        return
    fi

    false
}

if [ ! -d "$BACKUP_DIR" ]; then
        mkdir -p "$BACKUP_DIR"
fi

backup_etc
backup_site
backup_db
print_used_space
remove_old_files && print_used_space
true

Краткая инструкция по обновлению порта для сопровождающих

Примерно с 2008 года совершенно случайно являюсь сопровождающим порта sysutils/archivemount в ОС FreeBSD и недавно стал получать сообщения от их багтрекера. Их Bugzilla с упорством достойным поощрения настойчиво раз в неделю присылала мне письма об ошибках. Так что ничего не оставалось делать, как обновить соответствующий порт и в результате родилась эта инструкция.

# Делаем копию оригинала
cp -r /usr/ports/sysutils/archivemount/ /usr/ports/sysutils/archivemount.bak
# Обновляем Makefile (PORTVERSION=new_version, PORTREVISION=0)
vim /usr/ports/sysutils/archivemount/Makefile
# Обновляем файл distinfo командой make makesum
cd /usr/ports/sysutils/archivemount && make makesum
# Генерируем diff (рекомендуется использовать git diff)
diff -ruN /usr/ports/sysutils/archivemount.bak /usr/ports/sysutils/archivemount > archivemount.diff

Заливаем этот diff через форму багтрекера с припиской в начале [maintainer update]. В качестве примера можно посмотреть обновление archivemount. Также приложите CHANGELOG со списком изменений и, разумеется, проверьте работу порта и новой версии приложения перед отправкой.
Что ещё почитать:
* FreeBSD Porters Handbook
* Руководство FreeBSD по созданию портов

Скрипт для резервного копирования

Всем привет, обновил скрипт для резервного копирования с учётом того, что я вообще-то программист, а не просто айтишник! Он стал более интеллектуально определять и удалять старые файлы, учитывать ограничение в 4.5Gb (на FTP для бекапа доступно 5Gb) и успешность операций, добавлены сообщения об ошибках. И бонусом сообщения раскрашены в разные цвета, нейтральные выделены жирным, хорошие зелёным, а плохие красным цветом — красота! Скрипт проверен на сайте ShellCheck, который я настоятельно рекомендую к использованию. Если найдёте ошибку или вам есть что добавить, смело пишите комментарий.

#!/usr/local/bin/bash

# Основная папка для архивов
BACKUP_ROOT=/var/backups/manual/
# Папка, куда непоредственно пишем файлы, выглядит как BACKUP_ROOT/ГОД/МЕСЯЦ/ДЕНЬ
BACKUP_DIR="$BACKUP_ROOT"$(date +"%Y/%m/%d")
# Время запуска скрипта. Все файлы имеют вид имя_файла_%ЧАС%%МИНУТА%.tag.bz2
TIME=$(date +"%H%M")
# Ограничение хранилища в килобайтах для проверки
LIMIT=$(echo "4096*2^10"|bc)
# Ограничение хранилища в мегабайтах для вывода в сообщениях
HLIMIT=$(echo "$LIMIT/1024"|bc)"Mb"

# Функция выход в случае ошибки
exit_on_error() {
    # Получаем код ошибки
    exit_code=$?
    # Входное сообщение
    message=$1
    if [ $exit_code -ne 0 ]; then
        # Выводим сообщение в stderr
        >&2 echo -e "\e[31m${message}\e[0m"
        # Выходим к кодом exit_code
        exit $exit_code
    fi
}

# Если папки нет
if [ ! -d "$BACKUP_DIR" ]; then
    # Создаём папку со всеми промежуточными подпапками
    mkdir -p "$BACKUP_DIR"
fi

printf "\e[1mSearching space for backup\e[0m .. "
# Цикл от 100 дней до нуля
for days in $(seq 100 -1 0)
do
    SIZE=$(du -sB 1 $BACKUP_ROOT | cut -f 1)
    HSZ=$(echo "$SIZE/1024"|bc)"Mb"
    # Если размер хранилища не превышает лимита
    if [[ $SIZE -le $LIMIT ]]; then
        # Выводим сообщение и прерываем цикл
        printf "[%s/%s] .. " "$HSZ" "$HLIMIT"
        break
    fi
    # Если нет ни одного файла старше $days дней
    if [[ -z "$(find $BACKUP_ROOT -type f -mtime +"$days")" ]]; then
        # Продолжаем цикл
        continue
    fi
    printf "\e[31m%s/%s]\e[0m .. " "$HSZ" "$HLIMIT"
    # Удаление файлов старше $days прошло успешно
    if find $BACKUP_ROOT -type f -mtime +"$days"d -delete > /dev/null; then
        # Выводим сообщение 
        printf "CLEAN (older than %s days) .. " "$days"
    else
        # Выходим с сообщением FAIL
        exit_on_error "FAIL"
    fi
    # Удаляем пустые папки, чтоб не мусорить
    find $BACKUP_ROOT -empty -type d -delete
done
echo -e "\e[32mOK\e[0m"

printf "\e[1mBackuping etc files\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/etc_"$TIME".tar.bz2 /etc /usr/local/etc /home /var/db/ports /var/named/etc/namedb /root/scripts > /dev/null 2>&1 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"

printf "\e[1mBackuping www folder\e[0m .. "
/usr/bin/tar -Pjcf "$BACKUP_DIR"/www_"$TIME".tar.bz2 /usr/local/www > /dev/null && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"

printf "\e[1mBackuping SQL databases\e[0m .. "
/usr/local/bin/mysqldump --login-path=backup --opt --all-databases --triggers --routines --events | bzip2 -c > "$BACKUP_DIR"/sql_"$TIME".sql.bz2 && echo -e "\e[32mOK\e[0m" || exit_on_error "FAIL"

Откровенно говоря, не до конца понимаю, в каких единицах считает занятое место команда du. Предполагаю, что в килобайтах.

P.S. Для того, чтобы получить вывод без цвета, использую утилиту textproc/ansifilter:

script.sh | ansifilter --text

Добавил меню

Всем привет! Вам конечно всё равно, но я добавил меню. Теперь у меня есть навигация не только по меткам, но и по рубрикам. Можно посмотреть все Путешествия или рубрику Программирование включая подрубрики C++, Python, Java и так далее. Всё добавлено вручную, никакой автоматизации.

Поддержка меню в WordPress встроена изначально, все пункты и подменю добавляются в админке, но поскольку тема у меня самописная, пришлось попотеть с CSS и немного с JavaScript. Что-то натырено со сторонних сайтов, что-то взято из видео ниже.

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

Дайте знать, если плашка с рубрикой нужна к каждой статье. Хотя кого я спрашиваю, ходит на сайт два с половиной человека. Один из них гуглбот, а второй — это я.

UPD: В мобильной версии сайта добавил меню с помощью плагина WP Mobile Menu.

Личный блог Евгения Жирнова