Как создать и отобразить иерархическое древовидное выпадающее меню рубрик на WordPress?

Здравствуйте! 

Помогите, пожалуйста, решить проблему: мне нужно создать выпадающий иерархический список рубрик в сайдбаре (виджетах) на сайте на WordPress. У меня много рубрик, поэтому ручной способ не подходит. Количество записей в каждой рубрике не имеет значения. Я перепробовал множество плагинов, но ни один не подошел. Буду признателен за решение на PHP, так как планирую вставить этот код в виджет PHP-код.
  • 11 октября 2024 г. 14:06
Ответы на вопрос 2
Здравствуйте!

Чтобы создать иерархическое древовидное выпадающее меню рубрик на WordPress в виджете, вы можете использовать следующий код на PHP. Этот код можно вставить в ваш PHP-виджет или в файл вашей темы (например, в `functions.php` или в файл шаблона).

Вот код для отображения иерархического списка рубрик:

```php
<?php
function custom_category_menu() {
    $args = array(
        'taxonomy'   => 'category', // Замените 'category', если используете другую таксономию
        'orderby'    => 'name',
        'order'      => 'ASC',
        'hide_empty' => true,
    );

    $categories = get_categories($args);

    if (!empty($categories)) {
        echo '<ul class="custom-category-menu">';
        foreach ($categories as $category) {
            if ($category->parent == 0) {
                // Выводим родительскую категорию
                echo '<li>' . '<a href="' . get_category_link($category->term_id) . '">' . $category->name . '</a>';

                // Проверяем, есть ли дочерние категории
                $children = get_categories(array('child_of' => $category->term_id, 'hide_empty' => true));
                if ($children) {
                    echo '<ul>';
                    foreach ($children as $child) {
                        echo '<li><a href="' . get_category_link($child->term_id) . '">' . $child->name . '</a></li>';
                    }
                    echo '</ul>';
                }
                echo '</li>';
            }
        }
        echo '</ul>';
    } else {
        echo 'Нет рубрик для отображения.';
    }
}

// Используйте эту функцию в вашем виджете PHP-кода:
custom_category_menu();
?>
```

### Пошаговые действия

1. **Добавьте код**: Вставьте приведенный выше код в ваш виджет PHP-кода, или добавьте его в файл `functions.php` вашей темы.
   
2. **Используйте функцию**: Внутри виджета или в любом месте шаблона, где требуется отобразить меню, вызовите функцию `custom_category_menu()`.

3. **Стилизация**: Вы можете стилизовать ваше меню, добавив CSS к классам `.custom-category-menu` и `li` в вашем файле стилей.

### Примечания

- Вы можете заменить `'category'` на вашу собственную таксономию, если это необходимо.
- Убедитесь, что в вашей установке WordPress включены рубрики, и у вас есть рубрики, которые можно отображать.

Этот код создаст иерархическое меню рубрик, где будут отображаться родительские рубрики, и все дочерние будут вложены в соответствующие родительские.
Обновил 
<select name="category" id="category-select">
    <option value="">Выберите из списка</option>
    <?php
    $categories = get_terms(array(
        'taxonomy'   => 'category',
        'hide_empty' => false,
        'orderby'    => 'term_order', 
        'order'      => 'ASC',
    ));

   
    function display_category_options($categories, $parent = 0, $depth = 0) {
        foreach ($categories as $category) {
            if ($category->parent == $parent) {
                $indent = str_repeat('&nbsp;', $depth * 4); 
                echo '<option value="' . esc_url(get_category_link($category->term_id)) . '">' . $indent . esc_html($category->name) . '</option>';
                display_category_options($categories, $category->term_id, $depth + 1); 
            }
        }
    }

    display_category_options($categories);
    ?>
</select>

<script>
document.getElementById('category-select').addEventListener('change', function() {
    const selectedValue = this.value;
    if (selectedValue) {
        window.location.href = selectedValue; 
    }
});
</script>
Похожие вопросы