首页 > 文章列表 > 解读Walker类

解读Walker类

关键词: Walker 类(class) 解读(interpretation)
195 2023-09-01

菜单项、页面和(分层)分类法都是具有树状结构的数据示例:术语可以有父项、子项和兄弟项。通常我们希望在 HTML 标记中反映这种结构。例如,为了显示菜单,我们希望 HTML 是“顶级”链接的列表,其中包含其子项的嵌套列表,这些链接本身又包含其子项的嵌套列表,依此类推。本教程将指导您完成 WordPress 提供的一个类,这使得生成此标记变得非常简单。


什么是 Walker 类?

walker 类是一个抽象类,旨在帮助遍历和显示具有分层(或树状)结构的元素。它实际上并没有“做”任何事情(在生成 HTML 的意义上)。任何事情。它只是跟踪树的每个分支:它必须由其他类扩展,这些类告诉它如何处理遇到的每个元素。 WordPress提供了自己的扩展类,例如:

  • Walker_Nav_Menu – 用于显示导航菜单的 HTML
  • Walker_Page – 用于显示页面列表
  • Walker_Category – 用于显示分类术语列表。

这些类中的每一个都通过简单地指示该类在树的每个元素和级别上输出的内容来扩展 Walker 类。为了揭开这个类的神秘面纱,我们将看看它的主要方法和几个如何使用它的示例。类本身可以在这里找到。


走树

walk( $elements, $max_depth)

walker 类通过 walk 方法启动,并且正是该方法在生成 HTML 后返回该 HTML。它接受两个参数:

  1. 我们希望显示的元素数组,它们具有某种父子关系
  2. $max_depth – 设置我们探索的代数
  3. Ok 3...如果您初步了解了此方法,您会发现实际上可以传递额外的参数,这些参数会收集到一个数组中:$args。然后将其传递给类中的其他方法

walk 方法挑选出“顶级”元素(没有父元素的元素)并将它们放入一个数组中。其余的子项被放置在第二个数组中,其中键是其父项的 ID(它是一个二维数组,因为一个父项可以有多个子项):

$children_elements = array(
	'1' => array() //Array of elements corresponding to children of 1,
	'4' => array() //Array of elements corresponding to children of 4
);

然后依次循环每个父元素并应用方法 display_element

Display_Element

display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output )

顾名思义,display_element 负责显示树中的元素。事实上,它调用了几个函数来执行此操作。这些函数在 Walker 类中故意留空,而正是这些函数在扩展类中进行了更改,因为它们决定了返回的实际 HTML。其中包括:

  • start_lvl – 返回新关卡开始的 HTML 的函数。对于列表,这将是新“子列表”的开始,因此将负责返回
      标记
    • end_lvl – 当我们完成一个关卡时调用。在导航菜单示例中,该函数负责使用结束列表标记
    结束子列表
  • start_el – 负责显示我们当前所在元素的函数。对于菜单,这意味着
  • 标签和项目的链接。
  • end_el – 在显示元素及其所有子元素之后调用的函数。对于我们的菜单示例,这意味着返回结束
  • 标记。

那么 display_element 实际上是做什么的?实际上,这就是沃克级所有魔法发生的地方。首先让我们看看它给出了哪些参数:

  • $element – 这是我们当前在树上的元素
  • $children_elements所有子元素的数组(不仅仅是上面提到的元素的子元素)。这是 walk 方法中形成的第二个数组,键是父级的 ID。
  • $max_depth – 我们可以探索多深
  • $depth – 我们目前的距离有多远
  • $args – 可选参数(前面提到过)
  • $output – 到目前为止的 HTML。当我们探索树的更多内容时,就会添加此内容。

display_element 方法首先调用 start_el 负责显示元素。具体如何执行取决于上下文。对于下拉菜单,它可能是