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


17

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

それを行うためのフィルターやフックはありますか?


2
必要なことを行う独自のウィジェットを作成します。カテゴリウィジェットのコードをコピーして、変更を行います。
マークカプルン

おかげで、私は通常、このトリックに従ってウィジェットの変更を行います。それは私に思えるより簡単な方法です。
ええジュエル

回答:


13

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.phpmy_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
ボリスKuzmanov

7

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

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

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

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

それぞれ

widget_titleこれらの関数の他のインスタンスではなく、ウィジェットのみを具体的にターゲットにするためにフィルターを使用できます。

要するに、次のことを試すことができます:(完全に未テスト

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 );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.