微件标题未保存在后端

时间:2019-09-05 作者:Subrata Sarkar

我开发了一个小部件来显示最新消息。小部件功能正常工作,但问题是小部件标题未保存在后端。正确的方法是什么?

class infotravel_news_list_widget extends WP_Widget {
    public function __construct() {
        parent::__construct( false, $name = __( \'Latest News\', \'infotravel\' ) );
    }

    public function form( $instance ) {

        $defaults = array(
                \'title\' => \'\',
        );

        extract( wp_parse_args( array( $instance, $defaults ) ) );

        // Widget title ?>
        <p>
            <label for="<?php echo esc_attr( $this->get_field_id( \'title\' ) ); ?>"><?php _e( \'Title\', \'infotravel\' ); ?></label>
            <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( \'title\' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( \'title\' ) ); ?>" type="text" value="<?php echo esc_attr( $defaults[\'title\'] ); ?>" />
        </p>

        <?php
    }

    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance[\'title\'] = isset( $new_instance[\'title\'] ) ? wp_strip_all_tags( $new_instance[\'title\'] ) : \'\';

        return $instance;
    }

    public function widget( $args, $instance ) {
        $news_args = array(
            \'post_type\'      => \'infotravel_news\',
            \'posts_per_page\' => 5,
            \'post_status\'    => \'publish\',
            \'orderby\'        => \'post_date\',
            \'order\'          => \'desc\'
        );
        $query = new WP_Query( $news_args );

        if( $query -> have_posts() ) :
            while( $query -> have_posts() ) : $query -> the_post(); ?>
                <h3><?php the_title(); ?></h3>
            <?php
            endwhile;
        endif;
    ?>

    <?php }
}

add_action( \'widgets_init\', function(){
    register_widget( \'infotravel_news_list_widget\' );
} );

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

这是因为无论保存的值是什么,您总是将默认值输出到输入中:

<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( \'title\' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( \'title\' ) ); ?>" type="text" value="<?php echo esc_attr( $defaults[\'title\'] ); ?>" />
具体而言:

value="<?php echo esc_attr( $defaults[\'title\'] ); ?>"
$defaults[\'title\'] 始终是空字符串。保存的标题位于内部$instance[\'title\'], 由于这条线:

extract( wp_parse_args( array( $instance, $defaults ) ) );
它也位于一个名为$title. 这不是很明显,这就是为什么使用extract() 像这样的做法很糟糕。

我建议明确设置变量:

$title = isset( $instance[\'title\'] ) ? $instance[\'title\'] : $defaults[\'title\']; 
在这种情况下,应按如下方式输出值:

value="<?php echo esc_attr( $title ); ?>"
或者把结果wp_parse_args() 返回到$instance:

public function form( $instance ) {
    $defaults = array(
        \'title\' => \'\',
    );

    $instance = wp_parse_args( array( $instance, $defaults ) );

    // ...etc.
}
在这种情况下,应按如下方式输出值:

value="<?php echo esc_attr( $instance[\'title\'] ); ?>"

相关推荐

My widgets do not save

每次我保存我的小部件并离开页面时,我的小部件都会消失。侧边栏已完全清空,不会保存任何更改。控制台或PHP日志中没有任何错误。如果我将小部件直接复制并保存在数据库中widgets_text, 它们将被显示,但我仍然无法在侧边栏中添加或删除任何内容。这只发生在我的右侧边栏上,左侧边栏工作正常,但它们都以相同的方式注册。这是我注册侧边栏的方式:function my_widgets_init() { register_sidebar( array ( \'name\'