Плагин для упрощения URL категорий WordPress

от автора

в
Время чтения: 5 мин.

В WordPress URL-адреса категорий по умолчанию включают иерархию, что может быть не всегда удобно, особенно если вы хотите, чтобы дочерние категории отображались как категории первого уровня. В этой статье мы разберем, как создать плагин My Category Flat URLs, который убирает иерархию из URL-адресов категорий и упрощает их структуру. Мы также добавим кеширование данных для повышения производительности.


Опишем функциональные требования:

1. Удаление префикса /category/ из URL-адресов категорий:

  • URL-адреса категорий должны выглядеть как example.com/category-slug/ вместо example.com/category/parent-category/category-slug/.
  • Плагин должен работать только для таксономии «категории» (taxonomy category).

2. Кеширование данных о категориях:

  • Создать PHP-кеш для хранения данных о категориях (ID, название, slug, родительская категория, количество записей).
  • Кеш должен храниться в файле category-cache.php в папке плагина.
  • Кеш должен обновляться при создании, редактировании или удалении категорий.

3. Перезапись правил URL:

  • Добавить новые правила перезаписи для поддержки плоских URL-адресов категорий.
  • Правила должны учитывать все категории, включая дочерние.

4. Редирект старых URL:

  • Обеспечить редирект старых URL-адресов с префиксом /category/ на новые URL-адреса без префикса.
  • Редирект должен быть постоянным (HTTP-код 301).

5. Обработка активации и деактивации плагина:

  • При активации плагина:
    • Создать кеш категорий.
    • Обновить правила перезаписи URL.
  • При деактивации плагина:
    • Сбросить правила перезаписи URL.

Опишем нефункциональные требования:

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

  • Использовать кеширование данных о категориях для минимизации нагрузки на базу данных.
  • Обеспечить быструю обработку URL-адресов и редиректов.

2. Совместимость:

  • Плагин должен быть совместим с последними версиями WordPress.
  • Учитывать работу с другими плагинами и темами.

3. Безопасность:

  • Обеспечить безопасное хранение данных в кеше (например, экранирование строк).
  • Проверять права доступа при выполнении операций с файлами.

4. Масштабируемость:

  • Плагин должен корректно работать на сайтах с большим количеством категорий.

Шаг 1: Создание базовой структуры плагина

Для начала создадим файл плагина. Назовем его my-category-flat-urls.php и добавим стандартный заголовок плагина:

<?php
/*
Plugin Name: My Category Flat URLs
Description: Убирает иерархию из URL категорий, чтобы дочерние категории отображались как категории первого уровня. Использует PHP-кеш для хранения данных о категориях.
Version: 1.0
Author: foostack
*/

Этот код сообщает WordPress, что это плагин, и предоставляет основную информацию о нем.


Шаг 2: Создание кеша категорий

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

Определение пути к файлу кеша

define('MCFU_CACHE_FILE', __DIR__ . '/category-cache.php');

Функция для обновления кеша

Эта функция получает все категории с помощью get_categories и сохраняет их в файл в виде PHP-массива.

function mcfu_update_category_cache() {
    $categories = get_categories(array('hide_empty' => false));

    if (!empty($categories)) {
        $cache_content = "<?php\n";
        $cache_content .= "// Auto-generated category cache file\n";
        $cache_content .= "return array(\n";

        foreach ($categories as $category) {
            $cache_content .= "    array(\n";
            $cache_content .= "        'term_id' => " . $category->term_id . ",\n";
            $cache_content .= "        'name' => '" . addslashes($category->name) . "',\n";
            $cache_content .= "        'slug' => '" . addslashes($category->slug) . "',\n";
            $cache_content .= "        'parent' => " . $category->parent . ",\n";
            $cache_content .= "        'count' => " . $category->count . ",\n";
            $cache_content .= "    ),\n";
        }

        $cache_content .= ");\n";

        file_put_contents(MCFU_CACHE_FILE, $cache_content);
    }
}

Шаг 3: Получение данных из кеша

Чтобы использовать кешированные данные, добавим функцию для их получения:

function mcfu_get_categories() {
    if (file_exists(MCFU_CACHE_FILE)) {
        return include MCFU_CACHE_FILE;
    }
    return array();
}

Шаг 4: Очистка и обновление кеша

Кеш должен обновляться при каждом изменении категорий. Для этого добавим хуки WordPress:

function mcfu_clear_cache() {
    mcfu_update_category_cache();
    flush_rewrite_rules();
}
add_action('created_category', 'mcfu_clear_cache'); // При создании категории
add_action('edited_category', 'mcfu_clear_cache'); // При редактировании категории
add_action('delete_category', 'mcfu_clear_cache'); // При удалении категории

Шаг 5: Удаление префикса /category/ из URL

Чтобы убрать префикс /category/ из URL-адресов категорий, используем фильтр term_link:

function mcfu_remove_category_prefix($permalink, $term, $taxonomy) {
    if ($taxonomy != 'category') {
        return $permalink;
    }

    $permalink = home_url('/' . $term->slug . '/');
    return $permalink;
}
add_filter('term_link', 'mcfu_remove_category_prefix', 10, 3);

Шаг 6: Перезапись правил URL

Для корректной работы новых URL-адресов добавим функцию для перезаписи правил:

function mcfu_rewrite_category_url($rules) {
    $new_rules = array();
    $categories = mcfu_get_categories();

    foreach ($categories as $category) {
        $new_rules['(' . $category['slug'] . ')/?$'] = 'index.php?category_name=' . $category['slug'];
    }

    return $new_rules + $rules;
}
add_filter('category_rewrite_rules', 'mcfu_rewrite_category_url');

Шаг 7: Редирект старых URL

Чтобы избежать ошибок 404, добавим редирект для старых URL-адресов:

function mcfu_redirect_old_category_links() {
    $request_uri = $_SERVER['REQUEST_URI'];

    if (strpos($request_uri, '/category/') !== false) {
        $new_url = str_replace('/category/', '/', $request_uri);
        wp_safe_redirect(home_url($new_url), 301);
        exit;
    }
}
add_action('template_redirect', 'mcfu_redirect_old_category_links');

Шаг 8: Активация и деактивация плагина

При активации плагина создаем кеш и обновляем правила перезаписи:

function mcfu_activate_plugin() {
    mcfu_update_category_cache();
    flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'mcfu_activate_plugin');

При деактивации плагина сбрасываем правила перезаписи:

function mcfu_deactivate_plugin() {
    flush_rewrite_rules();
}
register_deactivation_hook(__FILE__, 'mcfu_deactivate_plugin');

Заключение

Плагин My Category Flat URLs готов! Он упрощает структуру URL-адресов категорий, убирая иерархию и префикс /category/. Благодаря кешированию данных о категориях, плагин работает быстро и эффективно. Вы можете использовать этот плагин на своем сайте WordPress, чтобы сделать URL-адреса категорий более короткими и удобными для пользователей.

Если вы хотите расширить функциональность плагина, можно добавить настройки в админ-панель WordPress или поддержку других таксономий. Удачи в разработке! 🚀


Полный код плагина:

<?php
/*
Plugin Name: My Category Flat URLs
Description: Убирает иерархию из URL категорий, чтобы дочерние категории отображались как категории первого уровня. Использует PHP-кеш для хранения данных о категориях.
Version: 1.0
Author: foostack
*/

// Путь к файлу кеша (в папке плагина)
define('MCFU_CACHE_FILE', __DIR__ . '/category-cache.php');

// Создаем или обновляем кеш категорий
function mcfu_update_category_cache() {
    $categories = get_categories(array('hide_empty' => false));

    if (!empty($categories)) {
        $cache_content = "<?php\n";
        $cache_content .= "// Auto-generated category cache file\n";
        $cache_content .= "return array(\n";

        foreach ($categories as $category) {
            $cache_content .= "    array(\n";
            $cache_content .= "        'term_id' => " . $category->term_id . ",\n";
            $cache_content .= "        'name' => '" . addslashes($category->name) . "',\n";
            $cache_content .= "        'slug' => '" . addslashes($category->slug) . "',\n";
            $cache_content .= "        'parent' => " . $category->parent . ",\n";
            $cache_content .= "        'count' => " . $category->count . ",\n";
            $cache_content .= "    ),\n";
        }

        $cache_content .= ");\n";

        file_put_contents(MCFU_CACHE_FILE, $cache_content);
    }
}

// Получаем категории из кеша
function mcfu_get_categories() {
    if (file_exists(MCFU_CACHE_FILE)) {
        return include MCFU_CACHE_FILE;
    }
    return array();
}

// Очищаем и пересоздаем кеш при изменении категорий
function mcfu_clear_cache() {
    mcfu_update_category_cache();
    flush_rewrite_rules();
}
add_action('created_category', 'mcfu_clear_cache'); // При создании категории
add_action('edited_category', 'mcfu_clear_cache'); // При редактировании категории
add_action('delete_category', 'mcfu_clear_cache'); // При удалении категории

// Убираем префикс /category/ из URL категорий
function mcfu_remove_category_prefix($permalink, $term, $taxonomy) {
    // Работаем только с категориями
    if ($taxonomy != 'category') {
        return $permalink;
    }

    // Формируем URL без префикса /category/
    $permalink = home_url('/' . $term->slug . '/');
    return $permalink;
}
add_filter('term_link', 'mcfu_remove_category_prefix', 10, 3);

// Переписываем правила для URL категорий
function mcfu_rewrite_category_url($rules) {
    $new_rules = array();
    $categories = mcfu_get_categories();

    foreach ($categories as $category) {
        // Добавляем правило для каждой категории (включая категории первого уровня)
        $new_rules['(' . $category['slug'] . ')/?$'] = 'index.php?category_name=' . $category['slug'];
    }

    return $new_rules + $rules;
}
add_filter('category_rewrite_rules', 'mcfu_rewrite_category_url');

// Редирект старых URL с базой категорий
function mcfu_redirect_old_category_links() {
    $request_uri = $_SERVER['REQUEST_URI'];

    if (strpos($request_uri, '/category/') !== false) {
        $new_url = str_replace('/category/', '/', $request_uri);
        wp_safe_redirect(home_url($new_url), 301);
        exit;
    }
}
add_action('template_redirect', 'mcfu_redirect_old_category_links');

// Обновляем правила перезаписи при активации плагина
function mcfu_activate_plugin() {
    mcfu_update_category_cache(); // Создаем кеш при активации
    flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'mcfu_activate_plugin');

// Сбрасываем правила перезаписи при деактивации плагина
function mcfu_deactivate_plugin() {
    flush_rewrite_rules();
}
register_deactivation_hook(__FILE__, 'mcfu_deactivate_plugin');


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 1 + 10?