विजेट शीर्षक के बाद विजेट सामग्री को लपेटने के लिए एक 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;
}

टोशो के जवाब से:

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>एस में समाप्त होने वाले विगेट्स के लिए पंजीकृत साइडबार के लिए सेटिंग्स की जाँच करता है
  • कोई शीर्षक नहीं है अगर जाँच करता है
  • यदि नहीं, तो यह before_widgetआउटपुट को विजेट विजेट को खोलने के लिए संशोधित करता है

आप विजेट दृष्टिकोण की सेटिंग के आधार पर साइडबार के तर्कों को अन्य तरीकों से बदलने के लिए इस दृष्टिकोण का उपयोग कर सकते हैं।


मुझे इसमें एक समस्या है: कुछ विजेट (जैसे WP डिफ़ॉल्ट वाले, उदाहरण के लिए) यदि आप उस रिक्त को छोड़ते हैं तो एक डिफ़ॉल्ट शीर्षक सेट करें। इसलिए आपका फ़ंक्शन div जोड़ता है क्योंकि उस बिंदु पर परम में कोई शीर्षक नहीं है, लेकिन विजेट बाद में इसे जोड़ता है और कोड गड़बड़ हो जाता है। क्या आप जानते हैं कि "विजेट" के शीर्षक से शीर्षक की जाँच कैसे करें? धन्यवाद
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
और वह केवल "टेक्स्ट विजेट" के लिए काम करता है
सिल्वर मून

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>

यह सुनिश्चित करने के लिए कि आपके द्वारा अपने सीएसएस में बाद वाले मामले में पहला खाली कंटेंट-डिव नहीं दिखाया गया है:

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

0

पिछले उत्तरों को देखने के बाद, मुझे लगता है कि मैंने समस्या को ठीक कर लिया है, जो कि सेंचोफेत के उत्तर से पहचानी गई थी। अपने विजेट को निम्नानुसार परिभाषित करें:

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हमारे कंटेंट रैप के लिए क्लोजिंग डिव का इस्तेमाल करें:

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

यह सुंदर नहीं है, लेकिन यह काम करता है।


शुरू में इस दृष्टिकोण से बहुत उत्साहित थे, लेकिन मैं विगेट्स के साथ एक समस्या में भाग गया, जो esc_html ($ शीर्षक) (यानी बडीप्रेस) का उपयोग करता है। जब ऐसा होता है, तो जोड़ा गया HTML बच जाता है और सामने के छोर पर प्रदान नहीं किया जाता है।
रयान

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

मुझे ठीक कर दो अगर मुझे यहाँ कुछ याद आ रहा है, लेकिन मुझे लगता है कि यह काफी ठोस है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.