it-swarm.com.de

Hinzufügen eines Divs, um den Widget-Inhalt nach dem Widget-Titel umzubrechen

Ich versuche, dem Inhalt eines Widgets in meiner dynamischen Seitenleiste ein Div hinzuzufügen.

Hier ist der Registrierungscode;

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

Aber dieser Code verursacht so etwas;

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

Folgendes versuche ich zu tun:

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

Wie geht das?

10
MBraiN

Zusätzlich zu Toschos Antwort benötigen Sie für eine robuste Lösung Folgendes:

// 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;
}

Aus Toschos Antwort:

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">',
));

Was dies bewirkt ist:

  • überprüft die Einstellungen für die registrierte Seitenleiste auf Widgets, die auf 2 <div>s enden
  • prüft, ob kein Titel vorhanden ist
  • ist dies nicht der Fall, wird die Ausgabe von before_widget so geändert, dass der Inhalt des sich öffnenden Widgets div angezeigt wird

Mit diesem Ansatz können Sie die Argumente der Seitenleiste auf andere Weise so ändern, dass sie auf den Einstellungen der Widget-Instanz basieren.

17
sanchothefat

Ich mochte die Idee, sowohl @tosco als auch @sanchothefat zu beantworten - ich habe jedoch mit dieser Kombination zu kämpfen, da empty( $settings[ 'title' ] zwar true zurückgeben kann, das Widget selbst jedoch möglicherweise einen Standardtitel ausgibt, wenn keiner festgelegt ist. Dieser Titel wird dann in die Markups before_title und after_title eingeschlossen, und die Seite wird erneut umbrochen. Das ist bei einigen Standard-Widgets sowieso der Fall.

Einfacher, sich nur an die Standard-Widget-Registrierungsparameter zu halten.

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

und dann eine Filteraktion gemäß der Antwort von Marventus hier hinzufügen;

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');
2
rabmcnab

Fügen Sie dem title-Parameter die zweite div hinzu:

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
fuxia

Folgendes tun Sie, um dies zu erreichen:

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">',
    ))

Wenn es keinen Titel gibt, erhalten Sie:

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

Wenn es einen Titel gibt, bekommst du:

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

Um sicherzustellen, dass das erste leere Inhalts-Div in letzterem Fall nicht angezeigt wird, fügen Sie Folgendes zu Ihrer CSS hinzu:

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

Ich ändere den Code nur geringfügig, damit ich register_sidebar nicht berühren muss. Registrieren Sie eine Seitenleiste auf normale Weise:

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

Und unten ist modifizierter Code von Sanchothefats Lösung:

/**
 * 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
Razon K.

Nachdem ich mir die vorherigen Antworten angesehen habe, glaube ich, das Problem behoben zu haben, das Cmorales mit der Antwort von sanchothefat identifiziert hat. Definieren Sie Ihr Widget wie folgt:

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

Es ist wichtig, dass die Standardeinstellungen für before_title und after_title entfernt werden. Nach einigem Ausprobieren stellte ich fest, dass der erste Filter, der einen Standardtitel zeigte, widget_title war. Dann benutze den widget_title Filter wie folgt:

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

Grundsätzlich ist <div class="panel-heading"><h3 class="panel-title"> mein before_title und </h3></div> ist mein after_title. Verwenden Sie zum Schluss dynamic_sidebar_params, um unserem Inhaltsumbruch ein schließendes Div voranzustellen:

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

Es ist nicht schön, aber es funktioniert.

0
Spencer