安装WPCode,插入代码:

/**
 * 在文章列表页添加树状可折叠分类筛选器(含"所有分类"选项)
 */
add_action('admin_footer-edit.php', function() {
    $screen = get_current_screen();
    if ($screen->post_type !== 'post') return;

    // 递归生成分类树 HTML
    function build_category_tree($parent = 0, $level = 0) {
        $categories = get_categories(['hide_empty' => false, 'parent' => $parent]);
        if (!$categories) return '';
        $html = '';
        foreach ($categories as $cat) {
            $children = get_categories(['hide_empty' => false, 'parent' => $cat->term_id]);
            $has_children = !empty($children);
            $indent = str_repeat('—', $level);
            $html .= '<div class="tree-node" data-id="' . $cat->term_id . '">';
            $html .= '<div class="tree-row">';
            $html .= '<span class="tree-toggle">' . ($has_children ? '📁' : '📄') . '</span>';
            $html .= '<span class="tree-label">' . $indent . ' ' . esc_html($cat->name) . '</span>';
            $html .= '</div>';
            if ($has_children) {
                $html .= '<div class="tree-children" style="display:none;">';
                $html .= build_category_tree($cat->term_id, $level + 1);
                $html .= '</div>';
            }
            $html .= '</div>';
        }
        return $html;
    }

    // 获取当前 URL 中的分类 ID
    $current_cat_id = isset($_GET['cat']) ? intval($_GET['cat']) : 0;

    ?>
    <style>
        .tree-cat-wrapper {
            display: inline-block;
            margin-left: 10px;
            position: relative;
            vertical-align: top;
        }
        .tree-cat-btn {
            background: #f0f0f1;
            border: 1px solid #8c8f94;
            border-radius: 3px;
            padding: 6px 12px;
            cursor: pointer;
            font-size: 13px;
        }
        .tree-cat-panel {
            display: none;
            position: absolute;
            top: 100%;
            left: 0;
            background: #fff;
            border: 1px solid #ccd0d4;
            border-radius: 4px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.15);
            width: 280px;
            z-index: 9999;
            margin-top: 5px;
        }
        .tree-cat-search {
            padding: 10px;
            border-bottom: 1px solid #eee;
        }
        .tree-cat-search input {
            width: 100%;
            padding: 6px;
            border: 1px solid #ccc;
            border-radius: 3px;
        }
        .tree-cat-list {
            max-height: 320px;
            overflow-y: auto;
            padding: 8px;
        }
        .tree-node {
            margin: 2px 0;
        }
        .tree-row {
            display: flex;
            align-items: center;
            padding: 4px;
            border-radius: 3px;
            cursor: pointer;
        }
        .tree-row:hover {
            background: #f0f0f0;
        }
        .tree-row.selected {
            background: #e5f0fd;
            font-weight: bold;
            color: #0073aa;
        }
        .tree-toggle {
            width: 28px;
            text-align: center;
            flex-shrink: 0;
        }
        .tree-label {
            flex: 1;
        }
        .tree-children {
            margin-left: 24px;
        }
        .tree-cat-footer {
            padding: 8px 10px;
            border-top: 1px solid #eee;
            text-align: right;
            background: #fafafa;
        }
        .tree-cat-footer .button {
            margin-left: 8px;
        }
        .tree-root-item {
            border-bottom: 1px solid #eee;
            margin-bottom: 5px;
            padding-bottom: 5px;
        }
    </style>
    <script>
    jQuery(document).ready(function($) {
        var $actions = $('.tablenav.top .alignleft.actions').first();
        if (!$actions.length) return;

        // 构建界面
        var $wrapper = $('<div class="tree-cat-wrapper">');
        var $btn = $('<div class="tree-cat-btn">📁 树状分类</div>');
        var $panel = $('<div class="tree-cat-panel">');
        var $searchDiv = $('<div class="tree-cat-search"><input type="text" id="tree-cat-search" placeholder="搜索分类..."></div>');
        var $listDiv = $('<div class="tree-cat-list">');
        var $footer = $('<div class="tree-cat-footer"><button type="button" id="tree-cat-apply" class="button button-small">应用筛选</button> <button type="button" id="tree-cat-clear" class="button button-small">清除</button></div>');

        $panel.append($searchDiv);
        $panel.append($listDiv);
        $panel.append($footer);
        $wrapper.append($btn);
        $wrapper.append($panel);
        $actions.append($wrapper);

        // 构建分类树 HTML(包含"所有分类"根节点)
        var allCategoriesHtml = '<?php echo addslashes(build_category_tree()); ?>';
        var fullTreeHtml = '<div class="tree-node tree-root-item" data-id="0">' +
            '<div class="tree-row" data-id="0">' +
            '<span class="tree-toggle">📁</span>' +
            '<span class="tree-label">所有分类</span>' +
            '</div>' +
            '<div class="tree-children" style="display:block;">' +
            allCategoriesHtml +
            '</div>' +
            '</div>';
        $listDiv.html(fullTreeHtml);

        // 从 URL 获取当前分类 ID
        var urlParams = new URLSearchParams(window.location.search);
        var currentCatId = urlParams.get('cat');
        var currentSelectedId = currentCatId ? parseInt(currentCatId) : null;

        // 高亮当前选中的分类,并展开其父级
        function highlightCurrentCategory() {
            if (currentSelectedId) {
                var $targetNode = $listDiv.find('.tree-node[data-id="' + currentSelectedId + '"]');
                if ($targetNode.length) {
                    $targetNode.find('.tree-row').addClass('selected');
                    $targetNode.parents('.tree-children').show();
                    $targetNode.parents('.tree-children').prev('.tree-node').find('.tree-toggle').text('📂');
                }
            } else {
                // 没有选中任何分类时,高亮"所有分类"
                $listDiv.find('.tree-node[data-id="0"] > .tree-row').addClass('selected');
            }
        }

        // 点击整个 .tree-row
        $listDiv.on('click', '.tree-row', function(e) {
            e.stopPropagation();
            var $row = $(this);
            var $node = $row.closest('.tree-node');
            var $children = $node.children('.tree-children');
            var $toggle = $row.find('.tree-toggle');
            var hasChildren = $children.length > 0;
            var catId = $node.data('id');

            // 清除所有选中样式
            $listDiv.find('.tree-row').removeClass('selected');

            // 选中当前行
            $row.addClass('selected');
            currentSelectedId = catId === 0 ? null : catId;

            // 如果有子分类,同时执行折叠/展开
            if (hasChildren) {
                $children.toggle();
                var isOpen = $children.is(':visible');
                $toggle.text(isOpen ? '📂' : '📁');
            }
        });

        // 应用筛选
        $('#tree-cat-apply').on('click', function() {
            if (currentSelectedId) {
                window.location.href = '<?php echo admin_url('edit.php'); ?>?post_type=post&cat=' + currentSelectedId;
            } else {
                // 选中"所有分类"时,清除筛选
                window.location.href = '<?php echo admin_url('edit.php'); ?>?post_type=post';
            }
        });

        // 清除筛选
        $('#tree-cat-clear').on('click', function() {
            window.location.href = '<?php echo admin_url('edit.php'); ?>?post_type=post';
        });

        // 搜索功能
        $('#tree-cat-search').on('keyup', function() {
            var kw = $(this).val().toLowerCase();
            $listDiv.find('.tree-node').each(function() {
                var $node = $(this);
                var label = $node.find('.tree-label').text().toLowerCase();
                if (label.indexOf(kw) !== -1 || $node.data('id') === 0) {
                    $node.show();
                    if ($node.data('id') !== 0) {
                        $node.parents('.tree-children').show();
                        $node.parents('.tree-children').prev('.tree-node').find('.tree-toggle').text('📂');
                    }
                } else {
                    $node.hide();
                }
            });
        });

        // 按钮切换面板
        $btn.on('click', function(e) {
            e.stopPropagation();
            $panel.toggle();
            // 每次打开面板时,重新高亮当前选中的分类
            highlightCurrentCategory();
        });

        // 点击面板内部不关闭
        $panel.on('click', function(e) {
            e.stopPropagation();
        });

        // 点击其他地方关闭面板
        $(document).on('click', function() {
            $panel.hide();
        });

        // 初始化高亮
        highlightCurrentCategory();
    });
    </script>
    <?php
});

0 条评论

发表回复

您的电子邮箱地址不会被公开。