В WordPress стандартная иерархия для страниц и таксономий обычно строится по родительско-дочерним связям. Однако часто возникает задача построить более сложную иерархию, где отношения между элементами зависят не только от родительских ID, но и от дополнительных условий и атрибутов. В такой ситуации мета-поля постов и таксономий становятся мощным инструментом для реализации особых иерархий.
Почему стандартная иерархия WordPress иногда не подходит
Стандартная иерархия страниц в WordPress строится на поле post_parent. Она подходит для большинства случаев, когда иерархия четкая и линейная. Однако бывают задачи, когда:
- Нужно учитывать дополнительные параметры (например, статус, категорию, пользовательские метки).
- Иерархия зависит от внешних факторов, например, от значения мета-поля.
- Необходимо создавать динамическую иерархию, изменяемую без смены родителя.
В таких случаях стандартный механизм иерархии не даст гибкости, и стоит использовать мета-поля.
Использование мета-полей для создания условной иерархии
Мета-поля — это дополнительные данные, которые можно прикреплять к постам, страницам и таксономиям. Они хранятся в таблице wp_postmeta и позволяют задавать любые параметры.
Пример: у вас есть тип записей project, и вы хотите построить иерархию проектов, где связь определяется не только родителем, но и статусом проекта, например, «активный» или «архивный».
Для этого создадим мета-поле wphierarchy_status, которое будет хранить статус проекта.
Создание и сохранение мета-поля
Для добавления мета-поля при сохранении записи используем следующий код:
function wphierarchy_save_project_status_meta($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wphierarchy_status'])) {
update_post_meta($post_id, 'wphierarchy_status', sanitize_text_field($_POST['wphierarchy_status']));
}
}
add_action('save_post_project', 'wphierarchy_save_project_status_meta');Этот код сохраняет значение мета-поля wphierarchy_status при сохранении проекта. В админке можно добавить поле через мета-бокс.
Вывод иерархии с учетом мета-поля
Теперь создадим функцию, которая будет строить иерархию проектов с фильтром по статусу:
function wphierarchy_get_projects_by_status_hierarchy($status = 'active') {
$args = [
'post_type' => 'project',
'posts_per_page' => -1,
'meta_key' => 'wphierarchy_status',
'meta_value' => $status,
'orderby' => 'post_parent',
'order' => 'ASC',
];
$projects = get_posts($args);
$tree = [];
foreach ($projects as $project) {
$parent_id = $project->post_parent;
if ($parent_id && isset($tree[$parent_id])) {
$tree[$parent_id]['children'][] = $project;
} else {
$tree[$project->ID] = ['project' => $project, 'children' => []];
}
}
return $tree;
}Эта функция возвращает массив с проектами, сгруппированными по родителям, но только с нужным статусом.
Пример отображения иерархии с мета-полями в шаблоне
Для удобного вывода иерархии создадим рекурсивную функцию:
function wphierarchy_render_projects_tree($tree) {
echo '<ul>';
foreach ($tree as $item) {
$project = $item['project'];
echo '<li>' . esc_html(get_the_title($project)) . '</li>';
if (!empty($item['children'])) {
wphierarchy_render_projects_tree($item['children']);
}
}
echo '</ul>';
}В шаблоне можно вызвать:
$projects_tree = wphierarchy_get_projects_by_status_hierarchy('active');
wphierarchy_render_projects_tree($projects_tree);Таким образом, вы получите иерархичный список проектов только с нужным статусом.
Расширение: сложная иерархия с несколькими мета-полями и AJAX
Если нужно учитывать несколько параметров, например, статус, регион, тип проекта, то можно добавить несколько мета-запросов в WP_Query с помощью meta_query:
$args = [
'post_type' => 'project',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'wphierarchy_status',
'value' => 'active',
'compare' => '=',
],
[
'key' => 'wphierarchy_region',
'value' => 'europe',
'compare' => '=',
],
],
];Для улучшения UX можно сделать фильтрацию иерархии через AJAX. Это позволит динамически менять критерии и вывод без перезагрузки страницы.
Для этого:
- Регистрируем AJAX обработчик на PHP с хуками
wp_ajax_иwp_ajax_nopriv_. - На фронтенде отправляем AJAX запросы с выбранными параметрами.
- Обрабатываем запрос, формируем и возвращаем иерархию.
Пример регистрации AJAX:
add_action('wp_ajax_wphierarchy_filter_projects', 'wphierarchy_ajax_filter_projects');
add_action('wp_ajax_nopriv_wphierarchy_filter_projects', 'wphierarchy_ajax_filter_projects');
function wphierarchy_ajax_filter_projects() {
$status = isset($_POST['status']) ? sanitize_text_field($_POST['status']) : 'active';
$tree = wphierarchy_get_projects_by_status_hierarchy($status);
ob_start();
wphierarchy_render_projects_tree($tree);
$html = ob_get_clean();
wp_send_json_success(['html' => $html]);
}Это позволит создавать кастомные и динамические иерархии с глубокими фильтрами и гибкими правилами.
Плагины для работы с мета-полями и кастомными иерархиями
Для удобства работы с мета-полями и кастомными иерархиями можно использовать плагины:
- Clearfy Pro — позволяет оптимизировать работу с мета-полями и упростить управление кастомными типами записей.
- WPRemark — плагин для расширенного управления мета-полями и пользовательскими данными.
Использование готовых решений помогает быстро внедрять сложную логику без глубокой доработки кода.
Итог
Создание иерархии с учетом мета-полей в WordPress — эффективный подход для решения нестандартных задач. Он позволяет учитывать дополнительные условия, строить динамичные и гибкие структуры, расширять возможности стандартного родительско-дочернего подхода. Используйте кастомные мета-поля, функции выборки с WP_Query и AJAX для динамичного обновления, а также подключайте проверенные плагины для упрощения работы.