如果当前类别是该值,则选择该选项

时间:2018-03-07 作者:John

我想制作此网站的类别列表:https://premium.wpmudev.org/blog/

所以我制定了以下代码:

<select class="select">
    <?php
    $args = array(
        \'orderby\' => \'name\',
        \'order\'   => \'ASC\'
    );
    $categories = get_categories($args);
    foreach ($categories as $cat) {
         echo \'<option value="\'.esc_url( get_category_link( $cat->term_id ) ).\'" \'.selected( esc_url( get_category_link( $cat->term_id ) ) ).\'>\'.$cat->name.\'</option>\';
    }
    ?>
</select>
代码正在工作,并将我重定向到我选择的类别链接,但问题是,在我重定向到类别后,类别选择列表中的类别选项未更改为当前类别。

问题在于:selected( esc_url( get_category_link( $cat->term_id ) )

但我解决不了。

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

问题是你如何使用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

结束