Cum pot modifica output-ul implicit al widget-urilor în WordPress?

15 iun. 2016, 09:23:27
Vizualizări: 18K
Voturi: 19

Nu doresc să stilizez widget-ul implicit doar cu CSS. Vreau să afișez conținutul widget-ului implicit 'Categorii' cu propria mea structură HTML.

Există vreun filtru sau hook disponibil pentru a face asta?

2
Comentarii

Scrieți propriul widget care face ceea ce doriți. Începeți prin a copia codul widget-ului de categorii și faceți modificări.

Mark Kaplun Mark Kaplun
15 iun. 2016 09:40:38

Mulțumesc, de obicei urmez acest truc pentru a face modificările la widget-uri. Mi se pare cea mai ușoară metodă.

Eh Jewel Eh Jewel
26 feb. 2018 14:56:55
Toate răspunsurile la întrebare 3
0
16

Pentru a dezvolta răspunsul lui Mark, nu prea există multe filtre disponibile (în general) în widget-urile implicite din WordPress (cu excepția poate a widget_text).

Dar adăugarea propriului widget personalizat este ușoară - puneți asta în 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");
}

Apoi pur și simplu trebuie să copiați widget-ul existent pentru categorii din wp-includes/widgets/class-wp-widget-categories.php în my_widget.php din tema dumneavoastră și să schimbați numele clasei la același nume folosit în apelul către register_widget() de mai sus.

Apoi faceți orice modificări doriți! Vă sugerez să schimbați și titlul pentru a-l distinge de widget-ul implicit pentru Categorii.

15 iun. 2016 11:23:38
2
12

Puteți suprascrie widget-urile implicite din WordPress prin extinderea acestora. Codul pentru widget-ul implicit de Categorii poate fi găsit la următorul link: https://developer.wordpress.org/reference/classes/wp_widget_categories/widget/

și mai jos este un exemplu de cod care arată cum puteți suprascrie afișarea widget-ului.

Class My_Categories_Widget extends WP_Widget_Categories {
    function widget( $args, $instance ) {
        // codul tău aici pentru suprascrierea afișării widget-ului
    }
}

function my_categories_widget_register() {
    unregister_widget( 'WP_Widget_Categories' );
    register_widget( 'My_Categories_Widget' );
}
add_action( 'widgets_init', 'my_categories_widget_register' );
15 iun. 2016 11:35:50
Comentarii

Și motivul pentru care nu am oferit asta ca opțiune este că poate doriți comportamentul original la un moment dat, iar cu soluția dumneavoastră pur și simplu pierdeți capacitatea de a-l obține.

Mark Kaplun Mark Kaplun
15 iun. 2016 12:26:05

Da, dacă doriți să păstrați widget-ul implicit așa cum este, este mai bine să înregistrați un widget complet nou. https://codex.wordpress.org/Function_Reference/register_widget

Boris Kuzmanov Boris Kuzmanov
15 iun. 2016 12:37:17
0

Nu este nevoie să creezi un widget complet nou pentru a face ceea ce dorești. După cum am înțeles din întrebarea ta, ești interesat doar să schimbi modul în care categoriile sunt afișate în partea frontală. Există două funcții care afișează categoriile în partea frontală:

Aceasta depinde de opțiunea selectată în backend.

Fiecare dintre aceste două funcții are un filtru specific pentru widget-uri (widget_categories_args și respectiv widget_categories_dropdown_args), pe care le poți folosi pentru a modifica argumentele care trebuie transmise acestor funcții. Poți folosi acest lucru pentru a altera comportamentul listei/listei derulante. Cu toate acestea, acest lucru poate să nu fie suficient pentru a face ceea ce dorești.

Alternativ, fiecare funcție are propriul filtru pentru a schimba complet modul în care aceste funcții ar trebui să afișeze rezultatul.

Acestea sunt:

Putem folosi filtrul widget_title pentru a ținti specific widget-ul și nu alte instanțe ale acestor funcții.

Pe scurt, poți încerca următoarele: (NICIOERI TESTAT)

add_filter( 'widget_title', function( $title, $instance, $id_base )
{
    // Țintim baza categoriilor
    if( 'categories' === $id_base ) // Asigură-te că baza este corectă, nu sunt sigur aici
        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 )
{
    // Rulează filtrul doar o dată
    remove_filter( current_filter(), __FUNCTION__ );

    // Obține toate categoriile
    $categories = get_categories( $args );

    $output = '';
    // Doar un exemplu de HTML personalizat
    $output .= '<div class="some class">';
    foreach ( $categories as $category ) {
        // Doar un exemplu de HTML personalizat
        $output .= '<div class="' . $category->term_id . '">';
        // Poți adăuga orice altă informație aici, cum ar fi un link către categorie
        $output .= $category->name;
        // etc etc, înțelegi ideea
        $output .= '</div>';
    }
    $output .= '</div>';

    return $output;
};
    
15 iun. 2016 14:36:18