← все проекты
Тимлид2023

init.red

Внутренний портал студии — не клиентский сайт

Скриншот: init.red

Что это за проект

Обложка со ссылкой на клиентский сайт плюс закрытая часть для сотрудников: авторизация, дашборд с задачами и проектами, учёт платежей. Самое интересное — не витрина, а свой роутер на add_rewrite_endpoint с проверкой прав и таблица wp_payments со своими миграциями через класс Upgrade_Database.

Моя роль

Свой роутер поверх WordPress, собственная авторизация, таблица платежей с версионированием схемы. Клиентский сайт студии живёт отдельно на init.kz и в этот кейс не входит.

21 коммит под своим именем, роль — тимлид

Стек

  • PHP
  • WordPress
  • MySQL
  • dbDelta
  • SCSS
  • vanilla JS

Что внутри стоит посмотреть

  • Свой роутер: /login, /register, /restore, /dashboard, /dashboard/payments вне обычной логики WordPress
  • Таблица wp_payments: сумма, метод, тип, cron рекуррентных списаний, статус оплаты
  • Версионирование схемы БД через dbDelta и собственный класс Upgrade_Database
  • Отдельная подтема дашборда со своим набором блоков и шрифтами
  • Портфолио из восьми работ со ссылками на живые демо — блок на первом экране и архив собраны из базы
  • Страница платежей: таблица на восемь колонок с сортировкой, фильтрами и цветными статусами — свёрстана с нуля по готовой разметке

Технические решения

Выдержки из настоящих файлов проекта — путь к каждому указан над кодом.

Свой роутер поверх WordPress с проверкой прав

Кабинет сотрудника не должен быть записью или страницей WordPress. Маршруты объявляются через add_rewrite_endpoint, а на template_include подменяется файл шаблона. Тут же живёт вся защита: неавторизованного уводит на вход, обычного пользователя — на общий дашборд, несуществующий вложенный адрес отдаёт честный 404, а не пустую страницу.

functions/routes.phpphp
foreach ($_ROUTE_URL as $url) {

    if (isset($wp_query->query[$url])) {

        // вложенный адрес вида dashboard/payments
        if (!empty($wp_query->query[$url])) {

            $is_page = $url . '/' . $wp_query->query[$url];

            if (in_array($is_page, $_ROUTE_URL)) {

                if (!is_user_logged_in()) {
                    wp_redirect('/login/');
                }

                if (!current_user_can('administrator')) {
                    wp_redirect('/dashboard/');
                }

                $url = 'templates/dashboard/' . $wp_query->query[$url];

            } else {
                $wp_query->set_404();
                status_header(404);
                get_template_part(404);
            }
        }
    }
}

Своя таблица платежей со своими миграциями

Учёт платежей не ложится на типы записей: нужны статусы, методы, даты перевода и cron рекуррентных списаний. Таблица создаётся через dbDelta, а версия схемы регистрируется в собственном классе Upgrade_Database — то есть у проекта есть свой механизм миграций, а не «накатили руками через phpMyAdmin».

functions/plugins/databases/payments.phpphp
$upgrade_db = new Upgrade_Database();
$upgrade_db->add_table('payments', '0.1');

function payments_table()
{
    global $wpdb;
    $table_name = $wpdb->get_blog_prefix() . 'payments';

    $sql = "CREATE TABLE {$table_name} (
        id                bigint(20) unsigned NOT NULL auto_increment,
        user_id           bigint(20) unsigned NOT NULL,
        method            varchar(255)        NOT NULL,
        sum               bigint              NOT NULL,
        type              varchar(255)        NOT NULL,
        cron              bigint              NOT NULL,
        pay_status        varchar(255)        NOT NULL,
        transfer_date     timestamp           NOT NULL default CURRENT_TIMESTAMP,
        transfer_comment  text                NOT NULL,
        status            varchar(255)        NOT NULL,
        PRIMARY KEY (id)
    ) {$charset_collate};";

    dbDelta($sql);
}

Что не доделано

Пишу сам, до того как заметит собеседующий.

  • Задачи и проекты на дашборде — разметка без бэкенда
  • Заявки, документы и рассылка отдают 404: ссылки в сайдбаре есть, маршрутов и шаблонов нет
  • Портфолио и платежи наполнены демо-данными: работы ведут на наши же развёрнутые демо, названия компаний в платежах вымышленные