WordPress是如何管理嵌套下拉菜单的?

时间:2015-10-07 作者:Mayeenul Islam

我做了一个层次化的CPT,所以它涉及不同的深度。我需要做一个下拉列表,我发现wp_dropdown_pages(). 但由于某些原因,最后我做了自己的下拉查询get_pages() 和使用foreach

但我看到了,使用wp_dropdown_pages() 我可以有一个很好的嵌套下拉列表。我查看了下拉列表,发现每个深度都有类,如level-0, level-1 等等,但我一直在检查这些类,却找不到任何CSS。WordPress中也没有这样的CSS声明<这对我来说是个谜!!:o

nested dropdown in WordPress

WordPress实际上是如何管理嵌套下拉列表的?

1 个回复
最合适的回答,由SO网友:Mayeenul Islam 整理而成

事实上<option> 字段不适用于任何CSS。所以WordPress开发人员/设计师为<option> 字段。

Level pads

实际上,在你的检查中,你遗漏了一些东西:

<select name="page_id" id="page_id">
    <option value="1" class="level-0">Level 0</option>
    <option value="2" class="level-1">&nbsp;&nbsp;&nbsp;Level 1</option>
    <option value="3" class="level-1">&nbsp;&nbsp;&nbsp;Level 1</option>
    <option value="4" class="level-2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Level 2</option>
    <option value="5" class="level-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Level 3</option>
    <option value="6" class="level-2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Level 2</option>
    <option value="7" class="level-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Level 3</option>
</select>
你注意到&nbsp; (空格的HTML特殊字符)有吗?

这就是创建嵌套外观的原因。

让我们用WordPress把手弄脏wp-includes/ 文件夹,打开文件post-template.php.wp_dropdown_pages(, 这样,您就可以找到显示下拉列表的函数(WP 4.3.1中的第1016行)在该函数中,您将看到另一个函数正在运行:walk_page_dropdown_tree(, 搜索那个(WP 4.3.1中的第1309行)
  • 在该函数中,您将看到Walker类正在那里运行,Walker_PageDropdown, 立即查找该类(WP 4.3.1中的第1471行)
  • 在该类中,您将看到一个名为start_el, 实际上,在这个函数中,技巧正在运行$pad 有变量吗?

    $pad = str_repeat(\'&nbsp;\', $depth * 3);
    
    通过$depth 本页的str_repeat() 实际上是填充空间(&nbsp;) 那里str_repeat() 是一个PHP函数,在指定的时间内重复字符串。它只是简单的乘法&nbsp; 3次到$depth. 这就是诀窍。

    现在,让我们在您的案例中实现类似的操作:

    $_pages = get_pages( array( \'post_type\'=> \'your_hierachical_cpt\' ) );
    <select name="my_field" id="my-field">
        <?php foreach ($_pages as $_page) {
            $depth = count( get_post_ancestors( $_page->ID ) ); //page_depth
            $pad = str_repeat(\'&nbsp;\', $depth * 3);
            echo \'<option value="\'. $_page->ID .\'" class="level-\'. $depth .\'">\'. $pad . $_page->post_title .\'</option>\';
        } ?>
    </select>
    
    我们把所有的页面都放进去了$_pages, 让他们每个人都深入$depth, 然后遵循这个简单的技巧$pad. 当显示时<option>s、 我们正在展示$depth 类,并添加$pad 选项文本前的变量。

    :D

  • 相关推荐

    Should our pages be posts?

    我们正在为我们的社区发布大量内容(大约每天3页)。所有正在发布的内容都是在页面中创建的。我的问题是:“页面”和“帖子”在数量上有什么区别吗?为了速度或效率,Dos WP更喜欢帖子而不是页面?谢谢