WordPress 기본 위젯 출력을 수정하려면 어떻게해야합니까?


17

CSS만으로 기본 위젯의 스타일을 지정하고 싶지 않습니다. 고유 한 HTML 구조로 기본 '카테고리'위젯 컨텐츠를 표시하고 싶습니다.

이를 수행 할 수있는 필터 나 후크가 있습니까?


2
원하는 것을하는 자신 만의 위젯을 작성하십시오. 카테고리 위젯의 코드를 복사하여 시작하고 수정하십시오.
Mark Kaplun

감사합니다. 일반적으로 위젯 수정을 위해이 트릭을 따릅니다. 더 쉬운 방법입니다.
Eh Jewel

답변:


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
그리고 옵션으로 제공하지 않은 이유는 어떤 시점에서 원래의 행동을 원할 수도 있기 때문에 솔루션을 사용하면 얻을 수있는 능력을 잃을 수 있습니다.
Mark Kaplun

예, 기본 위젯을 그대로 유지하려면 완전히 새로운 위젯을 등록하는 것이 좋습니다. codex.wordpress.org/Function_Reference/register_widget
Boris Kuzmanov

8

필요한 작업을 수행하기 위해 완전히 새로운 위젯을 만들 필요는 없습니다. 귀하의 질문을 읽으면서 프런트 엔드에 카테고리가 표시되는 방식을 변경하는 데 관심이 있습니다. 프론트 엔드에 카테고리를 표시하는 두 가지 기능이 있습니다

이 모든 것은 백엔드에서 선택된 옵션에 따라 다릅니다.

이제이 두 함수 각각에는 위젯 특정 필터 ( 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 );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.