ฉันจะแก้ไขเอาต์พุตวิดเจ็ตดีฟอลต์ของ 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.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
และเหตุผลที่ฉันไม่ได้เสนอให้เป็นตัวเลือกคือคุณอาจต้องการพฤติกรรมดั้งเดิมในบางจุดและด้วยวิธีการแก้ปัญหาของคุณคุณก็สูญเสียความสามารถในการรับ
Mark Kaplun

ใช่หากคุณต้องการมีวิดเจ็ตเริ่มต้นตามที่ควรจะเป็นการลงทะเบียนวิดเจ็ตใหม่โดยสิ้นเชิง codex.wordpress.org/Function_Reference/register_widget
Boris Kuzmanov

8

คุณไม่จำเป็นต้องสร้างวิดเจ็ตใหม่ที่สมบูรณ์เพื่อทำสิ่งที่คุณต้องทำ เมื่อฉันอ่านคำถามของคุณคุณแค่สนใจเปลี่ยนวิธีแสดงหมวดหมู่ที่ส่วนหน้า มีสองฟังก์ชันที่แสดงหมวดหมู่ที่ส่วนหน้า

  • wp_list_categories() ซึ่งแสดงหมวดหมู่ในรายการ

  • wp_dropdown_categories() ซึ่งแสดงหมวดหมู่ในรายการแบบเลื่อนลง

ทั้งหมดนี้ขึ้นอยู่กับตัวเลือกที่เลือกในแบ็กเอนด์

ตอนนี้แต่ละฟังก์ชันทั้งสองมีตัวกรองเฉพาะวิดเจ็ต ( 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.