问题是你如何使用selected()
. 该功能输出selected="selected"
如果第一个参数与第二个参数匹配。
因此,您要做的是在以下情况下将选项标记为选中:
(string) \'https://premium.wpmudev.org/blog/category/news-community/\' === (string) true
这是因为值被转换为字符串并与
===
- 将永远不会为真,即使URL与您正在查看的类别相同。看见
the function 这是在引擎盖下使用的。
因此,您需要做的是将值传递给该函数,该函数可以检查当前选项是否与当前查看的类别相同。您实际上不需要使用value
用于进行比较的选项的属性。由于每个选项都表示一个类别,因此您可以将该选项的ID与当前查看类别的ID进行比较。
因此,我们可以使用$cat->term_id
当前选项的ID,以及get_queried_object_id()
获取当前正在查看的类别的ID。然而,一个重要的警告是get_queried_object_id()
如果您正在查看帖子,还将返回帖子ID,因为帖子和术语是分开存储的,即使您没有查看类别,也可以获得匹配项。因此,在使用之前,您应该检查是否正在查看类别get_queried_object_id()
.
应用所有这些,您的代码应该如下所示:
$categories = get_categories( array(
\'orderby\' => \'name\',
\'order\' => \'ASC\'
) );
$current_category = is_category() ? get_queried_object_id() : false;
foreach ( $categories as $category ) {
printf(
\'<option value="%s" %s>%s</option>\',
esc_url( get_category_link( $category ) ),
selected( $category->term_id, $current_category, false ),
esc_html( $category->name )
);
}
只要我们查看一个类别,这一行就会获取当前类别的ID:
$current_category = is_category() ? get_queried_object_id() : false;
那么这条线是如何
selected()
功能正在运行:
selected( $category->term_id, $current_category, false ),
请注意,我正在比较
foreach
循环到我们正在查看的类别,如上所述。还要注意,最后一个参数是
false
. 我们只想返回属性的文本,因为我们已经在回显了。
我还做了一些风格上的改变,您不需要使用,但我觉得我应该解释一下:
我用过$category
而不是$cat
. 我不喜欢代码中的缩写。你可以做你想做的事我用过printf()
而不是将字符串连接在一起。连接<option>
带有所有这些值的标记可能会产生非常长的代码行。使用printf()
(在我看来)使它更简洁易读这是你应该做的:我用esc_html()
. 这样,类别的名称就不会破坏我们正在创建的选项标记的HTML