web-dev-qa-db-ja.com

WordPressのデフォルトウィジェットの出力を変更するにはどうすればいいですか?

デフォルトウィジェットをCSSだけでスタイルしたくはありません。デフォルトの「カテゴリ」ウィジェットのコンテンツを自分のHTML構造で表示したいです。

それを行うための利用可能なフィルタやフックはありますか?

14
Eh Jewel

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()の呼び出しで使われたのと同じ名前に変更します。

それからあなたが好きな変更を加えてください!デフォルトのカテゴリウィジェットと区別できるように、タイトルも変更することをお勧めします。

13
Tim Malone

あなたはそれらを拡張することによってデフォルトの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' );
9
Boris Kuzmanov

あなたがする必要があることをするためにあなたは完全に新しいウィジェットを作成する必要はありません。私があなたの質問を読んだとき、あなたはただカテゴリーがフロントエンドに表示される方法を変えることに興味があります。フロントエンドにカテゴリを表示する2つの機能があります

これはすべてバックエンドでどのオプションが選択されたかによって異なります

現在、これら2つの関数はそれぞれウィジェット固有のフィルター(それぞれwidget_categories_argswidget_categories_dropdown_args)を持っています。これを使用して、これらの関数に渡す引数を変更できます。これを使用してリスト/ドロップダウンの動作を変更することができます。しかし、これはあなたが望むことをするのに十分ではないかもしれません。

あるいは、各関数は、これらの関数がそれらの出力を表示する方法を完全に変更するための独自のフィルタを持ちます。

それらはそれぞれ

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 );
7
Pieter Goosen