Архив за месяц: Июнь 2017

Создание простого плагина с ajax на wordpress

В данном посте будет пошагово описано как создать простейший плагин для wordpress с аяксом.
Собственно вся соль в ajax — так как есть пара тонких мест. Разобьем руководство на две части, в первой опишем просто создание минимального плагина, а во второй части как добавить асинхронный вызов ajax

Часть 1 — создание базового плагина

шаг 1. создать папку с названием плагина в директории wp-content/plugins , например simple-ajax
шаг 2. создать php файл в созданной директории simple-ajax.php и написать туда следующее:

/*
Plugin Name: Simple Ajax WordPress Plugin
Plugin URI: http://zabaykin.ru
Description: Visualization of assistant invoice API
Version: 1.0.0
Author: zabaykin
Author URI: http://zabaykin.ru/
*/

После этого шага уже можно идти в панели администраторов в раздел плагины и активировать плагин.
шаг 3. Создаем функцию base_plugin

function base_plugin() {
    ob_start();
    echo "< button id='ajax_button' >press for ajax< /button >";
    return ob_get_clean();
}

шаг 4. Регистрируем созданную функцию в wordpress с помощью специальной функции

add_shortcode( 'base_plugin_shortcut', 'base_plugin' );

Разумеется, название может быть абсолютно другое, суть именно в регистрации shortcode вордпреса
шаг 5. Создаем новую страницу в панели администратора и в месте где понадобится плагин — пишем прямо в тексте [base_plugin_shortcut] . После сохранения можно открыть созданную страницу и убедиться, что конопка появилась. Таким образом первая часть создания плагина завершена, далее добавляем ajax.

Часть 2 — Асинхронный вызов ajax в wordpress

шаг 1. Для аякса понадобится javascript, поэтому рядом с файлом simple-ajax.php создадим файл simple-ajax.js со следующим содержимым:

jQuery(document).ready(function ($) {
    $('#ajax_button').click(function(){
        $.ajax({
            method: "POST",
            url: simple_ajax_url_obj.ajax_url,
            dataType: "json",
            data: {
                action: 'get_ajax_response'
            }
        })
            .done(function (data) {
                console.log('YES!!')
                console.log(data);
            })
            .fail(function (data) {
                console.log('ERROR')
                console.log(data);
            });
    })
});

шаг 2. Созданный javascript файл надо подключить, поэтому обновим нашу базовую функцию, дополнив её следующими строками:

function base_plugin() {
    ob_start();
    echo "< button id='ajax_button' >press for ajax< /button >";
    
    # ajax
    wp_enqueue_script( 'simple-ajax', plugins_url( '/simple-ajax.js', __FILE__ ), array('jquery'), '1.2', true );
    wp_localize_script( 'simple-ajax', 'simple_ajax_url_obj', array( 'ajax_url' => admin_url('admin-ajax.php')) );
    return ob_get_clean();
}

Небольшое пояснение, с помощью функции wp_enqueue_script регистрируем скрипт, указываем путь до него и указываем зависимости. В нашем случае будет использоваться jquery, поэтому укажем минимальную версия 1.2 . После регистрации скрипта, необходимо создать объект javascript , в котором будет прописан URL для ajax. Это как раз делается с помощью wp_localize_script — создается объект simple_ajax_url_obj и указывается url до php скрипта. Про action расскажем чуть ниже.
шаг 3. Также обязательно понадобятся php функция — обработчик ajax

function get_ajax_response(){
    echo "ajax base plugin for wordpress works fine!"
    wp_die();
}

Обязательно заканчивайте аяксовую функцию с помощью wp_die
шаг 4. Регистрация экшена в php. Помните в javascript был указан action: ‘get_ajax_response’ ? Пришло время его объявить и связать с php функцией. Это делается с помощью следующих двух функций

add_action( 'wp_ajax_get_ajax_response', 'get_ajax_response' );
add_action( 'wp_ajax_nopriv_get_ajax_response', 'get_ajax_response' );

Если не указать wp_ajax_nopriv — то запросы смогут делать только авторизованные пользователи. Поэтому если хотим чтобы все могли делать аяксовый запрос — необходимо добавить часть с nopriv.
Стоит отметить, что практически все запросы ajax (и с фронтенда и с бекенда) идут через административную часть admin-ajax.php, поэтому если действия подразумевают администрирование — то надо чтобы wp_ajax_nopriv_(action) хук был всегду обрамлен is_admin() === true для безопасности.

Таким образом, по нажатию кнопки в консоли браузера (консоль вызываетмся кнопкой F12) будет отображено «ajax base plugin for wordpress works fine!» И данное сообщение уведомит о том, что ваш плагин с аяксом для вордпреса работает.

Джентельменский набор команд linux

Серверы на платформе linux практически никогда не имеют графичеческой оболочки и  разработчику для развертывания проекта / сайта нужно в обязательном порядке уметь на ты обращаться с командной строкой различных линукс ОС. Ниже приведу некоторые команды, которые с большой вероятностью рано или поздно вам понядобятся.

Начнем с того, без чего просто нельзя:

pwd

Команда pwd покажет ваше текущее расположение

Отобразить подробно весь список файлов и директорий, включая скрытые, в текущей папке

ls -la

Любителям FAR и total commander очень советую поставить аналог — midnight commander (mc). Установка будет выглядеть примерно так:

sudo apt-get install package
sudo yum install package

Команда установки пакета в зависимости от ОС линукс может меняться. Кстати после установки mc появится удобный редактор mcedit для редактирования файлов.

Найти все файлы с определенным разрешением

find -type f -name '*.php'

Команда для нахождения больших файлов в linux — размером более 100 мб.

find / -xdev -type f -size +100M

Часто бывает так, что логи (к примеру access.log и error.log) сильно разрастаются со временем и необходимо их очистить без удаления файла. Для этого поможет команда truncate

sudo truncate -s 0 test.txt

обнуляем файл, если прав хватает и без sudo то просто

> test.txt

При переходе

#делаем файл исполняемым
chmod a+x file.py

#где находится тот или иной пакет / программа
which php

uptime — позволяет посмотреть нагрузку на сервер. Подробнее http://habrahabr.ru/post/216827/

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

ps aux | grep manage.py[[:space:]]pdf_process | wc -l

Для работы с кроном, кстати есть прикольный сайт- crontab generator, где можно без лишних хлопот сгенерировать команды crontab . Для вызова редактора работы с кроном используйте команду crontab -e

crontab -e
# пример перезапуска apache2
sudo service apache2 restart

Проверить порт:
telnet some_host port, например telnet zabaykin.ru 80

Заархивировать по маске расширения файлов
tar -cvzf some_archive.tar.gz ./folder/*.jpg

Разархивировать tar.gz файл
tar -xvzf some_file.tar.gz

Команды идентификации:
Чтобы узнать под каким вы сейчас пользователем работаете — whoami
Чтобы узнать сетевое имя linux сервера, за которым сидите, команда — hostname

https и chrome — меняем ssl сертификат на сайте

Ранее я уже писал как поставить сертификат на сайте с апачем, для поддержки https. Однако с 57 версии google chrome сильно ужесточил свою политику для защищенных соединений, и мой сертификат теперь надо обновить. (не смотря на то, что в других браузерах всё отлично продолжает работать). В данной статье я расскажу подробно как поставить «хороший для хрома» сертификат с помощью сервиса letsencrypt.

Заходим на сайт letsencrypt.org , читаем getting started и видим — нам предлагают установить certbot
как самый оптимальный вариант при наличии ssh.

Перейдя на страницу certbot выбираем сервер (в моем случае apache) и ОС.
Чтобы узнать название линукс системы, используем команду uname -a
В моем случае это Ubuntu, чтобы уточнить версию убунты — используем команду lsb_release -a

После чего-то видим список команд, у меня ubuntu не сработала сразу на первой команде: sudo add-apt-repository ppa:certbot/certbot
sudo: add-apt-repository: command not found

Чтобы исправить эту ситуацию — помогло sudo apt-get install software-properties-common python-software-properties
Теперь первую часть удалось выполнить без проблем и certbot установился:

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache 

Далее перейдем ко второй части — непосредственно генерация сертификата, для этого выполняем команду:

certbot --apache certonly

Отмечу что есть два варианта — в первом, это без опции certonly тогда изменения для апача будут внесены автоматически, но я не стал рисковать и воспользовался опцией certonly чтобы в дальнейшем внести изменения вручную, (так как работал сразу на боевом сервере, то было бы жалко сломать чувствительные настройки апача ). Но возможно автоматический вариант многим понравится больше. И так, после данной команды надо будте пройти через несколько вопросов, например вам предложат подписаться EFF (Electronic Frontier Foundation) и сделать пожертвование :) . В конечном итоге в папку /etc/letsencrypt/ будут положены все новые сгенерированные ключи. Остается только прописать путь (:/etc/letsencrypt/live/your-site.ru) до новых ключей в sites-available и перезапустить apache2 .

Из плюсов данного способа стоит отметить бесплатность и поддержку всеми браузерами, даже хромом. Как никак у проекта letsencrypt очень весомые спонсоры (cisco, mozilla, chrome, facebook итд итп). Из минусов — сертификат действует только в течении трёх месяцев (90 дней), и его необходимо продлить до истечения.

Теперь о продление:
Очень рекомендуется в кроне создать задачу на обновление сертификата,
Чтобы протестировать на сколько гладко все пойдет через крон поможет команда:

certbot renew --dry-run

Согласно документации — рекомендуемая частота запуска — дважды в день, а не раз в 89 дней, как возможно многие подумали. Сделано это для того, чтобы в случае когда let’s encrypt инициирует отзыв сертификата по какой-то причине сайт не был в дауне сильно долго. Не стоит беспокоиться за частый запуск — так как обновление сертификата произойдет только в случае если срок подошел к концу. А вот примерно так будет выглядеть команда в кроне :

01 0,12 * * * root /usr/bin/certbot renew >/dev/null 2>&1