Настройка виджетов в wordpress с уникальным идентификатором для аргумента после заголовка
Я пытаюсь получить плагин складываемой области виджетов, чтобы каждый виджет, который он создает внутри складываемой области, имел уникальный идентификатор <div>
после его названия.
function get_args() {
$this->args = apply_filters( 'collapsible-widget-area-args', array(
'name' => __( 'Collapsible Widget Area', 'collapsible-widget-area' ),
'id' => 'collapsible-widget-area',
'description' => __( 'Drag widgets into this area in order to use them inside of the Collapsible Widget.', 'collapsible-widget-area' ),
'before_widget' => '<div id="%1$s" class="widget %2$s collapsible-item">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widgettitle">',
'after_title' => '</h2><div id="i_want_to_be_a_unique_id_for_every_widget_but_i_am_not"></div>',
) );
$this->sidebar_id = $this->args['id'];
if ( ! class_exists( 'collapsible_widget' ) ) {
require_once( 'class.collapsible-widget.php' );
}
add_action( 'widgets_init', array( $this, 'register_widget' ) );
}
Это функция, которая задает аргументы, но, насколько я понимаю, она вызывается только один раз, и аргументы применяются к каждому виджету. Может ли кто-нибудь сказать мне сейчас, чтобы я использовал что-то вроде %1$s
для before_widget
или даже лучше точно такое же значение в after_title
?
Можно просмотреть весь плагин целиком в в плагине WordPress svn функция, которую я описываю выше, находится в class.collapsible-widget-area.php и единственное, что я добавил до сих пор, это <div id="i_want_to_be_a_unique_id_for_every_widget_but_i_am_not"></div>
.
Это не вопрос "напишите мне программу", это просто пример, который я привожу. Возможно, для этого должно быть совершенно другое решение, или его очень легко сделать с помощью этого плагина, который уже расширяет класс виджетов wordpress, я не знаю.
2 answers
Глядя на widget.php в trac sprintf()
только выполняется на before_widget
(строка 884):
$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);
Следовательно, это не будет работать ни для одного из других аргументов.
Я задавался вопросом, можете ли вы использовать фильтр dynamic_sidebar_params
, но аргументы $id и $classname_ не передаются фильтру. Помимо взлома ядра, я не уверен, что вы можете сделать что-то еще, кроме как изучить возможность изменения начальной загрузки Twitter или использования jQuery для добавления идентификатора после загрузки страницы.
9 лет и пандемия спустя я нашел способ использовать фильтр @mrwweb и создать хорошо работающий загрузчик (4) свернуть с виджетами Wordpress:
Поскольку dynamic_sidebar_params
содержат уникальные параметры (например, идентификатор), вы можете использовать это для добавления пользовательского идентификатора свертывания к каждому созданному виджету.
См.: https://developer.wordpress.org/reference/hooks/dynamic_sidebar_params/
Рабочий пример:
add_filter('dynamic_sidebar_params', function($params) {
$params[0]['after_title'] = sprintf( $params[0]['after_title'], $params[0]['widget_id'] );
$params[0]['before_title'] = sprintf( $params[0]['before_title'], $params[0]['widget_id'] );
return $params;
}, 10, 1);
На данный момент я добавил $params[0]['widget_id']
как %1$s
, но вы можете легко создавайте больше. Прочитайте документы о том, как работает sprintf
: https://www.php.net/manual/en/function.sprintf.php
Таким образом, создание боковой панели с этими настройками сделает каждый виджет внутри нее разборным.
$config = [
'before_widget' => '<section class="widget mb-4 %1$s %2$s">',
'after_widget' => '</div></section>',
'before_title' => '<a data-toggle="collapse" href="#%1$s" role="button" aria-expanded="false" aria-controls="%1$s"><h5>',
'after_title' => '</h5></a><div id="%1$s" class="collapse">'
];
register_sidebar([
'name' => __('Footer col 1', 'textdomain'),
'id' => 'footer-col-1'
] + $config);
Обратите внимание, что я заключаю заголовок в <a>
И <h5>
ПЛЮС, я создаю div вокруг содержимого виджета, открывая div внутри after_title
и закрывая его в after_widget
. Таким образом, заголовок будет функционировать как переключатель сворачивания.
Если вы хотите использовать фильтр вместо создавая свою собственную боковую панель, вы можете отфильтровать аргументы виджета следующим образом (для этого вопроса SO):
add_filter('collapsible-widget-area-args', function($args) {
$args['after_title'] = '</h5></a><div id="%1$s" class="collapse">';
// here the other args for before_title, after_widget eq.
return $args;
}, 10, 1);