Отсутствует параметр боковой панели "fix" – before_content

как вы знаете, параметры боковой панели из register_sidebar (), которые управляют компоновкой виджетов,

- before_widget - after_widget - before_title - after_title 

проблема заключается в том, что вы не можете реализовать определенные типы конструкций, потому что отсутствует параметр « before_content ».

например:

 <div class="container"> <div class="title"> title </div> <div class="content"> content </div> </div> 

структура HTML, подобная этой, возможна только в том случае, если вы добавляете <div class="content"> в параметр after_title . Проблема в том, что если вы сделаете это, виджеты без заголовков нарушат макет страницы 🙁

так как есть решение как-то добавить, что <div class="content"> после div.title , или после div.container если заголовок отсутствует?

Solutions Collecting From Web of "Отсутствует параметр боковой панели "fix" – before_content"

Этот код определяет, был ли задан заголовок, а если нет, он изменяет аргумент before_widget .

 add_filter( 'widget_display_callback', 'wpse4213_widget_display_callback', 10, 3 ); function wpse4213_widget_display_callback( $instance, $widget, $args ) { if ( empty( $instance['title'] ) ) { $args['before_widget'] = '<div class="container"><div class="content">'; $widget->widget( $args, $instance ); return false; } return $instance; } 

Этот код работает, потому что widget_display_callback позволяет вернуть false если вы не хотите отображать виджет. В этом случае мы сами видим виджет, поэтому мы не хотим, чтобы WordPress делал это снова. Взлом, но он работает.

Эта функция не удастся, если виджет поставляет заголовок по умолчанию (например, большинство виджетов, включенных в основной дистрибутив). Чтобы обнаружить это, я также создал функцию, которая сначала пытается отобразить виджет в выходном буфере. Если мы обнаружим элемент заголовка в этом выходном буфере, виджет имел заголовок по умолчанию, поэтому мы игнорируем буфер и отображаем его как обычный виджет. Но это также может нарушиться, когда виджет использует сверхактивное кэширование, поэтому мы должны попытаться его также сбросить. Я упоминал, что это взломать?

 add_filter( 'widget_display_callback', 'wpse4213_widget_display_callback', 10, 3 ); function wpse4213_widget_display_callback( $instance, $widget, $args ) { if ( empty( $instance['title'] ) ) { $args['before_widget'] = '<div class="container"><div class="content">'; ob_start(); $widget->widget( $args, $instance ); $widget_content = ob_get_contents(); ob_end_clean(); if ( false !== strpos( $widget_content, 'widget-title' ) ) { // It did return a title! if ( method_exists( $widget, 'flush_widget_cache' ) ) { $widget->flush_widget_cache(); } return $instance; } echo $widget_content; return false; } return $instance; }