Làm cách nào tôi có thể sửa đổi đầu ra widget mặc định của WordPress?


17

Tôi không muốn tạo kiểu cho widget mặc định chỉ bằng CSS. Tôi muốn hiển thị nội dung tiện ích 'Danh mục' mặc định với cấu trúc HTML của riêng tôi.

Có sẵn bộ lọc hoặc hook để làm điều đó không?


2
Viết widget của riêng bạn mà làm những gì bạn muốn. Bắt đầu bằng cách sao chép mã của tiện ích danh mục và thực hiện sửa đổi.
Đánh dấu Kaplun

Cảm ơn, tôi thường làm theo thủ thuật này để thực hiện sửa đổi widget của mình. Đó là phương pháp dễ dàng hơn đối với tôi.
Eh Jewel

Câu trả lời:


13

Để mở rộng câu trả lời của Mark, không có nhiều (nói chung) có sẵn theo cách các bộ lọc trong các tiện ích mặc định của WordPress (ngoại trừ có lẽ widget_text).

Nhưng việc thêm tiện ích tùy chỉnh của riêng bạn rất dễ dàng - hãy đặt tiện ích này vào 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");
}

Sau đó, bạn chỉ đơn giản là muốn sao chép các loại hiện có phụ tùng từ wp-includes/widgets/class-wp-widget-categories.phpđể my_widget.phptrong chủ đề của bạn, và thay đổi tên lớp với tên giống như được sử dụng trong các cuộc gọi đến register_widget()ở trên.

Sau đó thực hiện bất kỳ thay đổi nào bạn muốn! Tôi cũng đề nghị thay đổi tiêu đề để bạn có thể phân biệt với tiện ích Danh mục mặc định.


10

Bạn có thể ghi đè các widget WordPress mặc định bằng cách mở rộng chúng. Mã cho tiện ích Danh mục mặc định có thể được tìm thấy trên liên kết sau: https://developer.wordpress.org/reference/groupes/wp_widget_clists/widget/

và bên dưới là mã ví dụ về cách bạn có thể ghi đè đầu ra của 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' );

1
Và lý do tôi không đưa ra một lựa chọn là bạn có thể muốn hành vi ban đầu vào một lúc nào đó, và với giải pháp của bạn, bạn chỉ mất khả năng có được nó.
Đánh dấu Kaplun

Có, nếu bạn muốn có tiện ích mặc định như hiện tại, tốt hơn hết là đăng ký một tiện ích hoàn toàn mới. codex.wordpress.org/Function_Reference/register_widget
Boris Kuzmanov

7

Bạn không cần phải tạo một widget hoàn chỉnh mới để làm những gì bạn cần làm. Khi tôi đọc câu hỏi của bạn, bạn chỉ quan tâm đến việc thay đổi cách các danh mục được hiển thị ở mặt trước. Có hai chức năng hiển thị các danh mục ở mặt trước

Tất cả phụ thuộc vào tùy chọn nào được chọn trong phần phụ trợ

Bây giờ, mỗi trong hai hàm này có một bộ lọc cụ thể cho widget ( widget_categories_argswidget_categories_dropdown_argstương ứng ) mà bạn có thể sử dụng để thay đổi các đối số sẽ được truyền cho các hàm này. Bạn có thể sử dụng điều này để thay đổi hành vi của danh sách / thả xuống. Tuy nhiên, điều này có thể không đủ để làm những gì bạn muốn.

Ngoài ra, mỗi chức năng có bộ lọc riêng để thay đổi hoàn toàn cách thức các chức năng này hiển thị đầu ra của chúng.

Họ tương ứng là

Chúng tôi có thể sử dụng widget_titlebộ lọc để chỉ nhắm mục tiêu cụ thể vào tiện ích và không phải các phiên bản khác của các chức năng này.

Nói tóm lại, bạn có thể thử các cách sau: ( HOÀN TOÀN KHÔNG GIỚI HẠN )

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 );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.