問題描述

我不想用只有 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。