В 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');
Добавить комментарий