jwp
  • 0
Новичок

Одна функция register_sidebar работает, а другая нет?

  • 0

Вот как я настроил свой код в файле функций:

register_sidebar(array(
    'name' => 'Latest Updates',
    'before_widget' => '<span>',
    'after_widget' => '</span>',
    'before_title' => '',
    'after_title' => ''
));
register_sidebar(array(
    'name' => 'BBRB Loves (Video Width - 200px)',
    'before_widget' => '',
    'after_widget' => '',
    'before_title' => '',
    'after_title' => ''
));

Первая register_sidebar функция вызывается в header.php, а вторая — в index.php. Когда я добавляю открывающие и закрывающие <span> теги во вторую функцию (т.е. before_widget и after_widget ), выводятся правильные теги. Но когда я добавляю те же открывающие и закрывающие <span> теги в первую функцию, ничего не выводится, кроме значения по умолчанию <div class="textwidget">foobar</div> . Единственная разница между ними заключается в том, что один вызывается в заголовке, а другой — в индексе. Тем не менее, ОБА виджета отображаются на панели инструментов, и когда я заполняю их текстом, они оба выводятся, но не теги до/после. Что я делаю неправильно?

Share
  1. Если бы мне пришлось рискнуть предположить, проблема в том, что ваш первый register_sidebar() вызывается в functions.php и подключается к widgets_init, а второй вызывается в голове и, следовательно, НЕ подключается к widgets_init. Я не знаю, как повлияет регистрация боковой панели, кроме как на widgets_init.

    Есть ли какая-то конкретная причина, по которой оба вызова нельзя вызвать в functions.php и подключить к widgets_init?

    • 0
    • Спасибо за ваш вклад, @Chip. Я полагаю, что могу вставить оба в index.php, чтобы они подключились к widgets_init. Но тогда мне нужно было бы избавиться от тегов, которыми WordPress окружает текстовые виджеты (т.е. div class="textwidget"></div> потому что сейчас, даже если я добавлю теги до и после виджета, div class="textwidget"></div> он будет выводиться внутри этих тегов span. Я полагаю, вы этого не сделаете). т знаете способ избавиться от div class="textwidget"></div> вообще, не так ли?Если мне нужно открыть новый вопрос для этого, пожалуйста, дайте мне знать.Еще раз спасибо за вашу помощь!

      • 0
  2. Вы должны зарегистрировать все свои боковые панели как функцию и подключить их к widgets_init.

    Если вы хотите избавиться от <div class="text_widget"> </div> него, вам придется написать собственный текстовый виджет, потому что для него нет фильтра.

    в wp-includes/default-widgets.php вот как создается текстовый виджет:

    /**
     * Text widget class
     *
     * @since 2.8.0
     */
    class WP_Widget_Text extends WP_Widget {
    
        function WP_Widget_Text() {
            $widget_ops = array('classname' => 'widget_text', 'description' => __('Arbitrary text or HTML'));
            $control_ops = array('width' => 400, 'height' => 350);
            $this->WP_Widget('text', __('Text'), $widget_ops, $control_ops);
        }
    
        function widget( $args, $instance ) {
            extract($args);
            $title = apply_filters( 'widget_title', empty($instance['title']) ? '' : $instance['title'], $instance, $this->id_base);
            $text = apply_filters( 'widget_text', $instance['text'], $instance );
            echo $before_widget;
            if ( !empty( $title ) ) { echo $before_title . $title . $after_title; } ?>
                <div class="textwidget"><?php echo $instance['filter'] ? wpautop($text) : $text; ?></div>
            <?php
            echo $after_widget;
        }
    
        function update( $new_instance, $old_instance ) {
            $instance = $old_instance;
            $instance['title'] = strip_tags($new_instance['title']);
            if ( current_user_can('unfiltered_html') )
                $instance['text'] =  $new_instance['text'];
            else
                $instance['text'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text']) ) ); // wp_filter_post_kses() expects slashed
            $instance['filter'] = isset($new_instance['filter']);
            return $instance;
        }
    
        function form( $instance ) {
            $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '' ) );
            $title = strip_tags($instance['title']);
            $text = esc_textarea($instance['text']);
    ?>
            <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
            <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
    
            <textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>"><?php echo $text; ?></textarea>
    
            <p><input id="<?php echo $this->get_field_id('filter'); ?>" name="<?php echo $this->get_field_name('filter'); ?>" type="checkbox" <?php checked(isset($instance['filter']) ? $instance['filter'] : 0); ?> />&nbsp;<label for="<?php echo $this->get_field_id('filter'); ?>"><?php _e('Automatically add paragraphs'); ?></label></p>
    <?php
        }
    }
    

    Вы можете повторно использовать часть кода для создания собственной версии текстового виджета, просто убедитесь, что вы не используете одни и те же имена классов или функций.

    • 0

Оставить ответ

You must login to add an answer.