Você não precisa criar um novo widget completo para fazer o que precisa fazer. Enquanto leio sua pergunta, você está apenas interessado em mudar a forma como as categorias são exibidas no front end. Existem duas funções que exibem as categorias no front end
Tudo depende de qual opção foi selecionada no backend
Agora, cada uma dessas duas funções tem um filtro específico de widget ( widget_categories_args
e widget_categories_dropdown_args
respectivamente ) que você pode usar para alterar os argumentos que devem ser passados para essas funções. Você pode usar isso para alterar o comportamento da lista / lista suspensa. No entanto, isso pode não ser suficiente para fazer o que você deseja.
Como alternativa, cada função possui seu próprio filtro para alterar completamente a maneira como essas funções devem exibir sua saída.
Eles são respectivamente
Podemos usar o filtro widget_title
para segmentar especificamente apenas o widget e não outras instâncias dessas funções.
Em resumo, você pode tentar o seguinte: ( TOTALMENTE NÃO ATUALIZADO )
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 );