Як я можу змінити вихідний віджет WordPress за замовчуванням?


17

Я не хочу стилізувати віджет за замовчуванням лише з CSS. Я хочу відобразити вміст віджетів "Категорії" за замовчуванням зі своєю власною структурою HTML.

Чи є якийсь фільтр або гачок для цього?


2
Напишіть свій власний віджет, який робить все, що ви хочете. Почніть з копіювання коду віджету категорій та робіть модифікації.
Марк Каплун

Дякую, я зазвичай дотримуюсь цього трюку, щоб змінити свої віджети. Мені здається, простіший метод.
Eh Jewel

Відповіді:


13

Щоб розширити відповідь Марка, у фільтрах у віджетах 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()вище.

Тоді робіть будь-які зміни, які вам подобаються! Я пропоную також змінити заголовок, щоб ви могли його відрізнити від віджету категорії за замовчуванням.


10

Ви можете замінити віджети 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' );

1
І тому я не запропонував це як варіант - це те, що ви можете захотіти оригінальної поведінки в якийсь момент, і з рішенням ви просто втрачаєте можливість отримати його.
Марк Каплун

Так, якщо ви хочете мати віджет за замовчуванням таким, яким він є, краще зареєструвати абсолютно новий віджет. codex.wordpress.org/Function_Reference/register_widget
Борис Кузманов

8

Вам не потрібно створювати повний новий віджет, щоб робити те, що вам потрібно зробити. Коли я читаю ваше запитання, ви просто зацікавлені в зміні того, як категорії відображаються на передній частині. Є дві функції, які відображають категорії на передній частині

Все це залежить від того, який варіант був обраний у бекенді

Тепер у кожної з цих двох функцій є фільтр для віджетів ( widget_categories_argsі widget_categories_dropdown_argsвідповідно ), який ви можете використовувати для зміни аргументів, які слід передавати цим функціям. Ви можете використовувати це для зміни поведінки списку / випадаючого списку. Однак цього може бути недостатньо для того, щоб робити те, що ти хочеш.

Крім того, кожна функція має власний фільтр, щоб повністю змінити спосіб, як ці функції повинні відображати свій вихід.

Вони відповідно є

Ми можемо використовувати widget_titleфільтр, щоб спеціально орієнтуватися лише на віджет, а не на інші екземпляри цих функцій.

Коротше кажучи, ви можете спробувати наступне: ( ПОВНІСТЮ 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 );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.