Как установить иерархический уровень таксономии на 2?

Вопрос или проблема

Я создал пользовательскую таксономию и зарегистрировал ее. Я хочу, чтобы максимальный уровень таксономии был 2. Т.е. Родитель => ребенок => подребенок. Как установить уровень??

Вы не можете установить уровень, когда создаете таксономию.

Единственный способ обеспечить уровень — это отслеживание создания термина: Фильтр create_term; это самый ранний фильтр, который позволяет нам изменить идентификатор родительского термина. По непонятным причинам фильтр pre_insert_term не содержит этой информации … вероятно, это было бы слишком просто.

Затем измените идентификатор родительского термина, если текущий уже является идентификатором второго уровня.

Пример кода, не протестирован:

add_action( 'create_term', function( $term_id, $tt_id, $taxonomy ) {

    $term = get_term( $term_id );

    // Ничего не делать.
    if ( empty( $term->parent ) )
        return;

    $parent = get_term( $term->parent, $taxonomy );

    // Это термин второго уровня, это нормально.
    if ( empty( $parent->parent ) )
        return;

    wp_update_term( $term_id, $taxonomy, [ 'parent' => $parent->term_id ] );
}, 10, 3 );

Ответ или решение

Как установить уровни иерархии таксономии на 2

Создание и управление таксономиями в WordPress — важный аспект организации контента. Ваша задача состоит в том, чтобы ограничить максимальный уровень иерархии вашей пользовательской таксономии до двух: родитель ⇒ ребенок ⇒ подребенок. Поскольку напрямую установить уровень иерархии при создании таксономии нельзя, необходимо использовать механизм фильтров WordPress для контроля за созданием терминов.

Подход к решению проблемы

Наиболее эффективным способом ограничения уровня таксономии является использование фильтра create_term. Этот фильтр активируется в момент создания термина и позволяет изменять идентификатор родительского термина, что позволяет вам контролировать иерархию терминов.

Пример кода

Следующий код, написанный на PHP, будет отслеживать создание новых терминов и изменять идентификатор родительского термина, если создаваемый термин уже находится на втором уровне:

add_action( 'create_term', function( $term_id, $tt_id, $taxonomy ) {

    $term = get_term( $term_id );

    // Если нет родителя, ничего не делаем
    if ( empty( $term->parent ) ) {
        return;
    }

    $parent = get_term( $term->parent, $taxonomy );

    // Если родительская категория не имеет родителя, ничего не изменяем
    if ( empty( $parent->parent ) ) {
        return;
    }

    // Обновляем термин, чтобы установить его родителем первого уровня
    wp_update_term( $term_id, $taxonomy, [ 'parent' => $parent->term_id ] );
}, 10, 3 );

Пояснения к коду

  1. Хук create_term: Используется для отслеживания событий создания терминов. При вызове хука доступны три параметра: $term_id, $tt_id и $taxonomy.

  2. Получение термина: С помощью функции get_term() мы получаем информацию о созданном термине.

  3. Проверка наличия родителя: Если у текущего термина нет родителя, мы просто выходим из функции.

  4. Получение родителя: При помощи get_term() мы получаем информацию о родительском терме.

  5. Проверка уровня иерархии: Если родитель не имеет собственного родителя, значит, текущий термин находится на втором уровне, и мы ничего не изменяем.

  6. Обновление термина: В случае, если текущий термин находится на уровне подкатегории, мы обновляем его родителя, чтобы он стал непосредственным потомком первой категории.

Заключение

Таким образом, с помощью простого кода можно эффективно управлять иерархией пользовательских таксономий в WordPress. Это позволит вам ограничить структуру до необходимого уровня, что в свою очередь улучшит организацию вашего контента и упростит навигацию для пользователей. Используйте предложенный метод с учетом своих особенностей реализации и настраивайте его по необходимости.

Это решение не только поспособствует упрощению работы с терминами, но и значительно повысит качество структуры вашего контента, что всегда полезно для SEO и пользовательского опыта.

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

Капча загружается...