WordPress窗口小部件新实例创建内容副本

时间:2018-01-26 作者:Limpuls

我有一个我编写的定制小部件,我想在同一小部件区域中显示同一小部件的两个实例。当我将新的小部件实例拖放到管理面板内的小部件区域,并将一些新数据放入自定义字段中并保存时,当我返回主页时,我会看到具有相同内容的新的和旧的小部件。我想可能是的update 函数问题,但我是按照wordpress文档编写的,所以它看起来是一样的。代码如下:

功能。php

/**
 * Register new custom wiget
*/

class Sole_Source_Main_Widget extends WP_Widget {
    public function __construct() {
        $widget_options = array(
            \'classname\' => \'sole_source_main_widget\',
            \'description\' => \'Main content widget\'
        );
        parent::__construct(\'sole_source_main_widget\', \'Sole Source Widget\', $widget_options);
    }

    //back-end display

    public function update( $new_instance, $old_instance ) {
     $instance = $old_instance;
     $instance[\'title\'] = ( ! empty( $new_instance[\'title\'] ) ) ? strip_tags( $new_instance[\'title\'] ) : \'\';
     $instance[\'description\'] = ( ! empty( $new_instance[\'description\'] ) ) ? strip_tags( $new_instance[\'description\'] ) : \'\';
     $instance[\'image\'] = ( ! empty( $new_instance[\'image\'] ) ) ? strip_tags( $new_instance[\'image\'] ) : \'\';

     return $instance;
}

public function form( $instance ) {
$title = ! empty( $instance[\'title\'] ) ? $instance[\'title\'] : \'\'; ?>
<?php $description = ! empty( $instance[\'description\'] ) ? $instance[\'description\'] : \'\'; ?>
<?php $image = ! empty( $instance[\'image\'] ) ? $instance[\'image\'] : \'\'; ?>
<p>
    <label for="<?php echo $this->get_field_id( \'title\' ); ?>">Title:</label>
    <input type="text" id="<?php echo $this->get_field_id( \'title\' ); ?>" name="<?php echo $this->get_field_name( \'title\' ); ?>" value="<?php echo esc_attr( $title ); ?>" />

    <label for="<?php echo $this->get_field_id( \'description\' ); ?>">Description:</label>
    <input type="text" id="<?php echo $this->get_field_id( \'description\' ); ?>" name="<?php echo $this->get_field_name( \'description\' ); ?>" value="<?php echo esc_attr( $description ); ?>" />

    <label for="<?php echo $this->get_field_id( \'image\' ); ?>">Image URL:</label>
    <input type="text" id="<?php echo $this->get_field_id( \'image\' ); ?>" name="<?php echo $this->get_field_name( \'image\' ); ?>" value="<?php echo esc_attr( $image ); ?>" />
</p><?php
}

    //front-end display
    public function widget( $args, $instance ) {

  $title = apply_filters( \'widget_title\', $instance[ \'title\' ] );
    $description = apply_filters(\'widget_title\', $instance[\'description\']);
    $image = apply_filters(\'widget_title\', $instance[\'image\']);
    ?>

    <?php echo $args[\'before_widget\'] . $args[\'before_title\']; ?> <img src="<?php echo $image; ?>"></img> <?php $args[\'after_title\']; ?>
  <?php echo $args[\'before_widget\'] . $args[\'before_title\'] . $title . $args[\'after_title\']; ?>
    <?php echo $args[\'before_widget\'] . $args[\'before_title\'] . $description . $args[\'after_title\']; ?>

  <?php echo $args[\'after_widget\'];
    }
}

add_action(\'widgets_init\', function() {
    register_widget(\'Sole_Source_Main_Widget\');
});
侧栏。php

<aside id="secondary" class="widget-area col-sm-12 col-md-12 col-lg-12" role="complementary">
    <div class="col-lg-6 col-md-12">
    <?php dynamic_sidebar( \'main-widget\' ); ?>
</div>
    <div class="col-lg-6 col-md-12">
    <?php dynamic_sidebar( \'main-widget\' ); ?>
    </div>
</aside><!-- #secondary -->

enter image description here

1 个回复
最合适的回答,由SO网友:Vlad Olaru 整理而成

我认为widget类没有任何问题。您遇到的问题是,您在sidebar.php:

<aside id="secondary" class="widget-area col-sm-12 col-md-12 col-lg-12" role="complementary">
    <div class="col-lg-6 col-md-12">
    <?php dynamic_sidebar( \'main-widget\' ); // this will display all the widgets in your main-widget sidebar ?>
</div>
    <div class="col-lg-6 col-md-12">
    <?php dynamic_sidebar( \'main-widget\' ); // this will display again all the widgets in your main-widget sidebar ?>
    </div>
</aside><!-- #secondary -->
每个侧边栏显示中的第二个小部件可能由于一些CSS而被隐藏,但我打赌它在那里,两次,一次在左边,一次在右边。

所以,不要打电话dynamic_sidebar( \'main-widget\' ); 两次

据我所知,您希望将小部件包装在某些div中,以便将它们放在两列中。为此,您需要过滤before-widgetafter-widget 通过dynamic_sidebar_params 滤器或者,更好的是,您可以使用一些CSS来实现这个技巧。

下面是一段起始PHP代码,它将为目标小部件区域中的每个小部件添加包装器:

/**
 * @param array $params
 */
function sole_add_widget_columns_wrapper( $params ) {
    // Add the opening wrapper tag
    $params[0][\'before_widget\'] = PHP_EOL . \'<div class="col-lg-6 col-md-12">\' . PHP_EOL . $params[0][\'before_widget\'];

    // Add the closing wrapper tag
    $params[0][\'after_widget\'] = $params[0][\'after_widget\'] . PHP_EOL . \'</div><!-- close wrapper -->\' . PHP_EOL;
}

/**
 * @param string $index
 */
function sole_handle_main_widget_area_columns( $index ) {
    // We only want to deal with the main widget area
    if ( \'main-widget\' !== $index ) {
        return;
    }

    // Filter each widget params and add the wrappers
    add_filter( \'dynamic_sidebar_params\', \'sole_add_widget_columns_wrapper\', 10, 1 );

    // Hook an action to remove the filter above after we are done with this widget area.
    // This way we don\'t affect other widget area that may come, on the same page, after this one.
    add_action( \'dynamic_sidebar_after\', \'sole_remove_main_widget_area_columns_filter\', 10 );
}
add_action( \'dynamic_sidebar_before\', \'sole_handle_main_widget_area_columns\', 10 );

function sole_remove_main_widget_area_columns_filter() {
    remove_filter( \'dynamic_sidebar_params\', \'sole_add_widget_columns_wrapper\', 10 );
}
此代码将包装每个小部件,它不会将偶数和奇数小部件放入两列包装器中。

结束

相关推荐

如何以编程方式更改MySQL变量(FOREIGN_KEYS_CHECK)?

我正在从插件创建自定义表。需要外键。为了安全起见,我想关掉foreign_keys_check 发布前maybe_create_table(). 这是我必须检查变量初始状态、进行更改和显示结果的代码: echo $wpdb->query( \"SHOW VARIABLES LIKE \'%foreign%\'\" ); $wpdb->query( \'SET foreign_key_checks=0\' ); echo $wpdb->query( \"SHOW