问题描述

我不想用只有 CSS 的默认窗口小工具。我想用我自己的 HTML 结构显示默认的’Categories’ 小工具内容。

有没有可用的过滤器或钩子这样做?

最佳解决方案

要扩展 Mark 的答案,在默认的 WordPress 小工具 (除了可能是 widget_text) 之外,没有太多 (通常) 可用的过滤器。

但是添加自己的自定义窗口小工具很容易 – 将其放在 functions.php 中:

require_once("my_widget.php");
add_action("widgets_init", "my_custom_widgets_init");

function my_custom_widgets_init(){
  register_widget("My_Custom_Widget_Class");
}

然后,您只需将现有的类别窗口小工具从 wp-includes/widgets/class-wp-widget-categories.php 复制到主题中的 my_widget.php,并将类名称更改为与上述 register_widget()调用中使用的名称相同的名称。

然后做任何你喜欢的变化!我建议更改标题,以便您可以将其与默认类别小工具区分开来。

次佳解决方案

您可以通过扩展来覆盖默认的 WordPress 小工具。默认类别小工具的代码可以在以下链接找到:https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/

以下是一个示例代码,您可以如何覆盖窗口小工具的输出。

Class My_Categories_Widget extends WP_Widget_Categories {
    function widget( $args, $instance ) {
        // your code here for overriding the output of the widget
    }
}

function my_categories_widget_register() {
    unregister_widget( 'WP_Widget_Categories' );
    register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );

第三种解决方案

您不需要创建一个完整的新窗口小工具来执行所需的操作。当我看到你的问题,你只是想改变类别在前端显示的兴趣。有两个功能在前端显示类别

  • wp_list_categories()显示列表中的类别

  • wp_dropdown_categories()在下拉列表中显示类别

这一切都取决于后台选择的选项

现在,这两个函数中的每一个都有一个小窗口特定过滤器 (widget_categories_argswidget_categories_dropdown_args),您可以使用它来更改应该传递给这些函数的参数。您可以使用它来更改列表/下拉列表的行为。但是,这可能不足以做你想要的。

或者,每个功能都有自己的过滤器来完全改变这些功能如何显示其输出的方式。

他们分别是

  • wp_list_categories

  • wp_dropdown_cats

我们可以使用 widget_title 过滤器专门针对小工具而不是其他这些功能的实例。

简而言之,您可以尝试以下操作:(TOTALLY UNTESTED)

add_filter( 'widget_title', function( $title, $instance, $id_base )
{
    // Target the categories base
    if( 'categories' === $id_base ) // Just make sure the base is correct, I'm not sure here
        add_filter( 'wp_list_categories', 'wpse_229772_categories', 11, 2 );
        //add_filter( 'wp_dropdown_cats', 'wpse_229772_categories', 11, 2 );
    return $title;
}, 10, 3 );

function wpse_229772_categories( $output, $args )
{
    // Only run the filter once
    remove_filter( current_filter(), __FUNCTION__ );

    // Get all the categories
    $categories = get_categories( $args );

    $output = '';
    // Just an example of custom html
    $output .= '<div class="some class">';
    foreach ( $categories as $category ) {
        // Just an example of custom html
        $output .= '<div class="' . echo $category->term_id . '">';
        // You can add any other info here, like a link to the category
        $output .= $category->name;
        // etc ect, you get the drift
        $output .= '</div>';
    }
    $output .= '</div>';

    return $output;
}, 11, 2 );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。