การเพิ่ม div เพื่อตัดเนื้อหาวิดเจ็ตหลังชื่อวิดเจ็ต


10

ฉันพยายามเพิ่ม div ในเนื้อหาวิดเจ็ตในแถบด้านข้างแบบไดนามิกของฉัน

นี่คือรหัสลงทะเบียน

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box">',
        'after_widget' => '</div>',
        'before_title' => '<div class="title">',
        'after_title' => '</div>',
    ));

แต่รหัสนี้ทำให้เกิดเช่นนี้

<div class="sidebar-box">
    <div class="title">{WIDGET TITLE}</div>
     {WIDGET CONTENT}
</div>

นี่คือสิ่งที่ฉันพยายามทำ;

<div class="sidebar-box">
    <div class="title">{WIDGET TITLE}</div>
    <div class="content">
           {WIDGET CONTENT}
    </div> 
</div>

สามารถทำได้อย่างไร?

คำตอบ:


18

นอกจากคำตอบของ Toscho นี่คือสิ่งที่คุณต้องการสำหรับโซลูชันที่มีประสิทธิภาพ:

// if no title then add widget content wrapper to before widget
add_filter( 'dynamic_sidebar_params', 'check_sidebar_params' );
function check_sidebar_params( $params ) {
    global $wp_registered_widgets;

    $settings_getter = $wp_registered_widgets[ $params[0]['widget_id'] ]['callback'][0];
    $settings = $settings_getter->get_settings();
    $settings = $settings[ $params[1]['number'] ];

    if ( $params[0][ 'after_widget' ] == '</div></div>' && isset( $settings[ 'title' ] ) && empty( $settings[ 'title' ] ) )
        $params[0][ 'before_widget' ] .= '<div class="content">';

    return $params;
}

จากคำตอบของ Toscho:

register_sidebar(array(
    'name' => "Sidebar1",
    'id' => 'home-sidebar-1',
    'before_widget' => '<div class="sidebar-box">',
    'after_widget' => '</div></div>',
    'before_title' => '<div class="title">',
    'after_title' => '</div><div class="content">',
));

สิ่งนี้คือ:

  • ตรวจสอบการตั้งค่าสำหรับแถบด้านข้างที่ลงทะเบียนเพื่อรับวิดเจ็ตที่ลงท้ายด้วย 2 ปิด <div> s
  • ตรวจสอบว่าไม่มีชื่อ
  • มิฉะนั้นจะแก้ไขbefore_widgetเอาต์พุตเพื่อแสดง div เนื้อหาวิดเจ็ตการเปิด

คุณสามารถใช้วิธีนี้เพื่อเปลี่ยนอาร์กิวเมนต์ของแถบด้านข้างด้วยวิธีอื่น ๆ โดยยึดตามการตั้งค่าของอินสแตนซ์ของวิดเจ็ต


ฉันมีปัญหา: บางวิดเจ็ต (เช่นค่าเริ่มต้น WP) ตั้งค่าชื่อเริ่มต้นหากคุณเว้นว่างไว้ ดังนั้นฟังก์ชั่นของคุณจะเพิ่ม div เพราะไม่มีชื่ออยู่ใน params ที่จุดนั้น แต่วิดเจ็ตจะเพิ่มเข้าไปหลังจากนั้นและโค้ดก็ยุ่งเหยิง คุณรู้วิธีการตรวจสอบชื่อจาก "ภายใน" เครื่องมือ? ขอบคุณ
Cmorales

ไม่ได้โดยไม่ต้องเพิ่มวิดเจ็ตโดยการตรวจสอบวิดเจ็ตหรือโค้ดที่ซับซ้อนอย่างน่ากลัวเพื่อแสดงวิดเจ็ตอย่างเงียบ ๆ จากนั้นแยกวิเคราะห์สำหรับชื่อ ... จะมีความคิด
sanchothefat

อาจเชื่อมโยงกับcodex.wordpress.org/Function_Reference/the_widgetนี้จะช่วยได้อย่างไร พวกเขาใช้มัน (ด้วยเหตุผลอื่น ๆ ) ในบทความนี้wp.smashingmagazine.com/2012/12/11/…
Cmorales

1
the_widget()ไม่ได้ใช้ในdynamic_sidebar()ฟังก์ชั่น แต่เป็นวิธีการเรียกใช้วิดเจ็ตใด ๆ พร้อมตัวเลือกที่คุณระบุ เป็นอีกสถานที่หนึ่งในการกรองแม้ว่าโซลูชันของฉันจะไม่ครอบคลุมเหตุการณ์ที่เกิดขึ้นนั้น ไชโย
sanchothefat

2

เพิ่มdivพารามิเตอร์ตัวที่สองในชื่อ:

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box">',
        'after_widget' => '</div></div>',
        'before_title' => '<div class="title">',
        'after_title' => '</div><div class="content">',
    ));

มันล้มเหลวหากไม่มีชื่อวิดเจ็ต - สามารถทำได้
sanchothefat

ใช่มันล้มเหลวเมื่อไม่มีชื่อ ..
MBraiN

ฉันได้เพิ่มคำตอบพร้อมรหัสเพื่อแก้ไขปัญหาชื่อเรื่อง อาจจะถูกรวมเข้ากับ Toscho จริงๆ แต่เขามีตัวแทนมหากาพย์แล้ว :)
sanchothefat

2

ฉันชอบความคิดของคำตอบ @tosco และ @sanchothefat - แต่ฉันได้ต่อสู้กับชุดค่าผสมนั้นเพราะในขณะที่empty( $settings[ 'title' ]อาจกลับมาจริงเครื่องมือตัวเองอาจส่งออกชื่อเริ่มต้นหากไม่มีการตั้งค่า ชื่อนี้จะถูกรวมในbefore_titleและafter_titleมาร์กอัปและแบ่งหน้าอีกครั้ง นี่เป็นกรณีที่มีวิดเจ็ตเริ่มต้นบางส่วนอยู่แล้ว

ง่ายกว่าเพียงแค่ยึดพารามิเตอร์การลงทะเบียนวิดเจ็ตมาตรฐาน

register_sidebar(array(
    'id' => 'sidebar1',
    'name' => __( 'Sidebar 1', 'bonestheme' ),
    'description' => __( 'The first (primary) sidebar.', 'bonestheme' ),
    'before_widget' => '<div class="block">',
    'after_widget' => '</div>',
    'before_title' => '<div class="block-title">',
    'after_title' => '</div>',
));

จากนั้นเพิ่มการดำเนินการตัวกรองตามคำตอบของ Marventus ที่นี่;

http://wordpress.org/support/topic/add-html-wrapper-around-widget-content

function widget_content_wrap($content) {
    $content = '<div class="block-content">'.$content.'</div>';
    return $content;
}
add_filter('widget_text', 'widget_content_wrap');

3
และใช้งานได้เฉพาะ "Text Widgets"
Silver Moon

1

นี่คือสิ่งที่คุณทำเพื่อให้บรรลุสิ่งนี้:

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box"><div class="content">',
        'after_widget' => '</div></div>',
        'before_title' => '</div><div class="title">',
        'after_title' => '</div><div class="content">',
    ))

เมื่อไม่มีชื่อคุณจะได้รับ:

<div class="sidebar-box"><div class="content">
{CONTENT}
</div></div>

เมื่อมีชื่อเรื่องคุณจะได้รับ:

<div class="sidebar-box"><div class="content">
</div><div class="title">
{TITLE}
<div class="content">
{CONTENT}
</div></div>

เพื่อให้แน่ใจว่า div-content ที่ว่างเปล่าครั้งแรกไม่แสดงในกรณีหลังคุณเพิ่มสิ่งนี้ลงใน css ของคุณ:

.sidebar-box .content:empty {display:none !important;}

0

หลังจากดูคำตอบก่อนหน้านี้ฉันคิดว่าฉันแก้ไขปัญหา Cmorales ที่ระบุด้วยคำตอบของ sanchothefat กำหนดวิดเจ็ตของคุณดังนี้:

register_sidebar( array(
    'name' => 'Sidebar',
    'id' => 'sidebar',
    'before_widget' => '<div class="panel panel-default %2$s" id="%1$s">',
    'after_widget' => '</div>',
    'before_title' => '',
    'after_title' => ''
) );

เป็นสิ่งสำคัญที่จะลบbefore_titleและafter_titleค่าเริ่มต้น widget_titleหลังจากการทดลองและข้อผิดพลาดที่ผมตั้งข้อสังเกตว่าตัวกรองแรกที่แสดงให้เห็นชื่อเริ่มต้นคือ จากนั้นใช้widget_titleตัวกรองดังนี้:

function widget_title( $title ) {
    if ( $title )
        $title = '<div class="panel-heading"><h3 class="panel-title">' . $title . '</h3></div>';
    $title .= '<div class="panel-body">';
    return $title;
}

โดยทั่วไป<div class="panel-heading"><h3 class="panel-title">ของฉันbefore_titleและฉัน</h3></div> after_titleสุดท้ายใช้dynamic_sidebar_paramsเพื่อเพิ่ม div การปิดสำหรับการตัดเนื้อหาของเรา:

function dynamic_sidebar_params( $params ) {
    $params[0]['after_widget'] = '</div>' . $params[0]['after_widget'];
    return $params;
}

มันไม่สวย แต่ใช้งานได้


ตอนแรกรู้สึกตื่นเต้นมากกับวิธีนี้ แต่ฉันพบปัญหากับวิดเจ็ตที่ใช้ esc_html ($ title) (เช่น BuddyPress) เมื่อเป็นกรณีนี้ HTML ที่ถูกเพิ่มจะแสดงเป็น Escape และไม่แสดงผลที่ส่วนหน้า
Ryan

0

ฉันเพียงแค่เล็กน้อยเปลี่ยนรหัสเพื่อให้ไม่จำเป็นต้องสัมผัสregister_sidebar ลงทะเบียนแถบด้านข้างด้วยวิธีปกติ:

register_sidebar(array(
    'name' => "Sidebar1",
    'id' => 'home-sidebar-1',
    'before_widget' => '<div class="sidebar-box">',
    'after_widget' => '</div>',
    'before_title' => '<div class="title">',
    'after_title' => '</div>',
));

และด้านล่างเป็นรหัสแก้ไขจากโซลูชันของ Sanchothefat:

/**
 * If no title given then add widget-content wrapper to before_widget
 * If title given then add content wrapper to before_widget
*/
add_filter('dynamic_sidebar_params', 'check_widget_template');
function check_widget_template($params){
    global $wp_registered_widgets;

    $settings_obj = $wp_registered_widgets[$params[0]['widget_id']]['callback'][0];
    $the_settings = $settings_obj->get_settings();
    $the_settings = $the_settings[$params[1]['number']];

    if (isset($params[0]['id']) && $params[0]['id'] == 'home-sidebar-1') {
        if (!isset($the_settings['title']) && empty($the_settings['title'])) {
            $params[0]['before_widget'] .= '<div class="widget-inner">';
            $params[0]['after_widget']  .= '</div>';
        } else {
            $params[0]['after_widget']  .= '</div>';
            $params[0]['after_title']   .= '<div class="widget-inner">';
        }
    }

    return $params;
}

0

วิดเจ็ตหลักบางตัวเพิ่มชื่อของพวกเขาเองซึ่งจะถูกรวมเป็นสองครั้งด้วย div เนื้อหา หากต้องการลบออกคุณสามารถส่งคืนสตริงว่างได้ ข้อเสียเพียงอย่างเดียวคือคุณต้องป้อนชื่อทั้งหมดด้วยตนเอง

function remove_default_widget_title( $title, $instance = [], $id = '' ) {
    if ( isset($instance['title']) && trim($instance['title']) == '' ) {
        return '';
    }
    return $title;
};
add_filter( 'widget_title', 'remove_default_widget_title', 10, 3 );

แก้ไขให้ถูกต้องหากฉันพลาดบางสิ่งที่นี่ แต่ฉันคิดว่ามันค่อนข้างแข็ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.