Настройка виджетов в 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, я не знаю.

Author: amy, 2012-05-15

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 для добавления идентификатора после загрузки страницы.

 3
Author: mrwweb, 2012-05-15 06:17:05

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);
 1
Author: Luuk Skeur, 2021-01-20 15:28:43