В администрировании сайта на WordPress часто возникает задача организовать удобный и функциональный каталог файлов, который можно динамически расширять и настраивать. В этой статье мы подробно рассмотрим, как создать динамический файловый каталог на базе WordPress с помощью кастомных типов записей, таксономий и кастомных полей, а также приведём примеры кода и полезные плагины.
Почему стоит создавать собственный файловый каталог в WordPress
Стандартные возможности WordPress позволяют загружать и хранить файлы в медиабиблиотеке, но организация удобного каталога с фильтрацией, сортировкой и дополнительными метаданными часто требует кастомизации. Создание собственного каталога поможет:
- Структурировать файлы по категориям и тегам, используя таксономии.
- Добавлять расширенные метаданные к каждому файлу, например, описание, дату, автора или статус.
- Реализовать удобный интерфейс для пользователей и администраторов.
- Интегрировать каталог с другими компонентами сайта, например, с плагинами для скачивания или просмотра.
Для примера рассмотрим создание каталога PDF-документов с возможностью фильтрации по категориям и тегам.
Создание кастомного типа записи для файлов
Первым шагом создадим кастомный тип записи wp_pro_file. Для этого добавим следующий код в файл functions.php вашей темы или в отдельный плагин:
function wp_pro_register_file_cpt() {
$labels = array(
'name' => 'Файлы',
'singular_name' => 'Файл',
'add_new' => 'Добавить файл',
'add_new_item' => 'Добавить новый файл',
'edit_item' => 'Редактировать файл',
'new_item' => 'Новый файл',
'view_item' => 'Просмотреть файл',
'search_items' => 'Поиск файлов',
'not_found' => 'Файлы не найдены',
'not_found_in_trash' => 'В корзине файлы не найдены',
'menu_name' => 'Файлы'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
'menu_icon' => 'dashicons-media-document',
'rewrite' => array('slug' => 'files')
);
register_post_type('wp_pro_file', $args);
}
add_action('init', 'wp_pro_register_file_cpt');Этот код регистрирует новый тип записи «Файлы» с поддержкой заголовка, описания и миниатюры. В дальнейшем мы будем использовать эти поля для хранения информации о файлах.
Добавление пользовательских таксономий для удобной классификации файлов
Для удобства структурирования создадим две таксономии: «Категории файлов» и «Теги файлов».
function wp_pro_register_file_taxonomies() {
register_taxonomy('wp_pro_file_category', 'wp_pro_file', array(
'labels' => array(
'name' => 'Категории файлов',
'singular_name' => 'Категория файла',
'search_items' => 'Поиск категорий',
'all_items' => 'Все категории',
'edit_item' => 'Редактировать категорию',
'add_new_item' => 'Добавить категорию'
),
'hierarchical' => true,
'show_in_rest' => true,
'rewrite' => array('slug' => 'file-category')
));
register_taxonomy('wp_pro_file_tag', 'wp_pro_file', array(
'labels' => array(
'name' => 'Теги файлов',
'singular_name' => 'Тег файла',
'search_items' => 'Поиск тегов',
'all_items' => 'Все теги',
'edit_item' => 'Редактировать тег',
'add_new_item' => 'Добавить тег'
),
'hierarchical' => false,
'show_in_rest' => true,
'rewrite' => array('slug' => 'file-tag')
));
}
add_action('init', 'wp_pro_register_file_taxonomies');Теперь при добавлении файлов можно будет указывать категории и теги для лучшей организации.
Добавление кастомных полей для хранения информации о файлах
Для хранения ссылки на файл, размера и других данных используем кастомные поля. Рассмотрим пример добавления поля с помощью плагина АCF (Advanced Custom Fields), который отлично подходит для таких задач и легко интегрируется с REST API.
Создайте группу полей «Параметры файла» с полями:
- URL файла (тип: файл или URL)
- Размер файла (тип: число)
- Дата добавления (тип: дата)
Если вы хотите реализовать добавление и вывод этих полей через код, можно использовать следующий пример для сохранения и вывода данных:
function wp_pro_save_file_meta($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!isset($_POST['wp_pro_file_nonce']) || !wp_verify_nonce($_POST['wp_pro_file_nonce'], 'wp_pro_save_file')) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wp_pro_file_url'])) {
update_post_meta($post_id, '_wp_pro_file_url', esc_url_raw($_POST['wp_pro_file_url']));
}
if (isset($_POST['wp_pro_file_size'])) {
update_post_meta($post_id, '_wp_pro_file_size', intval($_POST['wp_pro_file_size']));
}
if (isset($_POST['wp_pro_file_date'])) {
update_post_meta($post_id, '_wp_pro_file_date', sanitize_text_field($_POST['wp_pro_file_date']));
}
}
add_action('save_post_wp_pro_file', 'wp_pro_save_file_meta');Для вывода данных в шаблоне файла используйте:
$file_url = get_post_meta(get_the_ID(), '_wp_pro_file_url', true);
$file_size = get_post_meta(get_the_ID(), '_wp_pro_file_size', true);
$file_date = get_post_meta(get_the_ID(), '_wp_pro_file_date', true);
Вывод динамического каталога с фильтрацией и пагинацией
Для отображения каталога создадим кастомный шаблон страницы или шорткод с WP_Query. Вот пример реализации шорткода для вывода файлов с фильтрацией по категории:
function wp_pro_files_catalog_shortcode($atts) {
$atts = shortcode_atts(array(
'category' => '',
'posts_per_page' => 10,
'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1
), $atts, 'wp_pro_files_catalog');
$tax_query = array();
if (!empty($atts['category'])) {
$tax_query[] = array(
'taxonomy' => 'wp_pro_file_category',
'field' => 'slug',
'terms' => sanitize_text_field($atts['category'])
);
}
$args = array(
'post_type' => 'wp_pro_file',
'posts_per_page' => intval($atts['posts_per_page']),
'paged' => intval($atts['paged']),
'tax_query' => $tax_query
);
$query = new WP_Query($args);
ob_start();
if ($query->have_posts()) {
echo '<ul class="wp-pro-file-list">';
while ($query->have_posts()) {
$query->the_post();
$file_url = get_post_meta(get_the_ID(), '_wp_pro_file_url', true);
echo '<li><a href="' . esc_url($file_url) . '" target="_blank">' . get_the_title() . '</a></li>';
}
echo '</ul>';
// пагинация
$big = 999999999;
echo paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $query->max_num_pages
));
} else {
echo '<p>Файлы не найдены.</p>';
}
wp_reset_postdata();
return ob_get_clean();
}
add_shortcode('wp_pro_files_catalog', 'wp_pro_files_catalog_shortcode');Используйте шорткод в любом месте сайта: [wp_pro_files_catalog category="pdf"].
Полезные плагины для расширения функционала файлового каталога
Помимо кастомного кода, можно использовать проверенные плагины, которые дополнят функциональность:
- Clearfy Pro — оптимизация и безопасность, поможет контролировать загрузки и права доступа.
- WPRemark — добавление отзывов и комментариев к файлам.
- My Popup — создание всплывающих окон для предложений скачать или подписаться.
Использование этих плагинов позволит значительно расширить возможности файлового каталога без глубокого программирования.
Советы по безопасности и производительности
При работе с файловым каталогом важно обеспечить безопасность загрузок и доступ к файлам. Рекомендуется ограничивать типы файлов, проверять права пользователей и использовать защиту от прямого доступа к файлам.
Для повышения производительности используйте кэширование результатов запросов и оптимизируйте запросы WP_Query с помощью правильных индексов и лимитов.
Также стоит регулярно очищать неиспользуемые файлы и метаданные, чтобы база данных не разрасталась без необходимости.