自定义小部件中的新复选框不保存数据

时间:2014-05-03 作者:Per

我正在尝试开发自己的小部件。主要是因为我想了解Wordpress的功能(是的,我是全新的。第一次尝试扩展Wordpress)

我想在最近的帖子小部件中添加一个显示帖子缩略图选项的功能。

我复制了原来的小部件,并为新的复选框添加了功能(目前),我的问题是复选框状态(已选中或未选中)不起作用。当我点击save时,复选框被取消选中。如果我强制选中该值,则显示缩略图的代码可以工作。

这是我的当前代码我的更改与$show_thumbnail = isset( $instance[\'show_thumbnail\'] ) ? $instance[\'show_thumbnail\'] : false;

<?PHP

/*-----------------------------------------------------------------------------------
    Plugin Name: Recent Posts Widget
    Plugin URI: http://www.webadelic.co.uk
    Description: Displays recent blog posts from a standard post type.
    Version: 1.0
    Author: David Martin
    Author URI: http://www.webadelic.co.uk
-----------------------------------------------------------------------------------*/

// Add webadelic_recent_blog_widgets function to widgets_init, this will load the widget.
add_action( \'widgets_init\', \'svib_widget_recent_entries\' );

// Register the widget.
function svib_widget_recent_entries() {
    register_widget( \'svib_widget_recent_entries\' );
}

class svib_widget_recent_entries extends WP_Widget {

    function __construct() {
        $widget_ops = array(\'classname\' => \'svib_widget_recent_entries\', \'description\' => __( "Your site&#8217;s most recent Posts.") );
        parent::__construct(\'recent-posts\', __(\'Recent Posts\'), $widget_ops);
        $this->alt_option_name = \'svib_widget_recent_entries\';

        add_action( \'save_post\', array($this, \'flush_widget_cache\') );
        add_action( \'deleted_post\', array($this, \'flush_widget_cache\') );
        add_action( \'switch_theme\', array($this, \'flush_widget_cache\') );
    }

    function widget($args, $instance) {
        $cache = array();
        if ( ! $this->is_preview() ) {
            $cache = wp_cache_get( \'svib_widget_recent_posts\', \'widget\' );
        }

        if ( ! is_array( $cache ) ) {
            $cache = array();
        }

        if ( ! isset( $args[\'widget_id\'] ) ) {
            $args[\'widget_id\'] = $this->id;
        }

        if ( isset( $cache[ $args[\'widget_id\'] ] ) ) {
            echo $cache[ $args[\'widget_id\'] ];
            return;
        }

        ob_start();
        extract($args);

        $title = ( ! empty( $instance[\'title\'] ) ) ? $instance[\'title\'] : __( \'Recent Posts\' );

        /** This filter is documented in wp-includes/default-widgets.php */
        $title = apply_filters( \'widget_title\', $title, $instance, $this->id_base );

        $number = ( ! empty( $instance[\'number\'] ) ) ? absint( $instance[\'number\'] ) : 5;
        if ( ! $number )
            $number = 5;
        $show_date = isset( $instance[\'show_date\'] ) ? $instance[\'show_date\'] : false;

        $show_thumbnail = isset( $instance[\'show_thumbnail\'] ) ? $instance[\'show_thumbnail\'] : false;

        /**
         * Filter the arguments for the Recent Posts widget.
         *
         * @since 3.4.0
         *
         * @see WP_Query::get_posts()
         *
         * @param array $args An array of arguments used to retrieve the recent posts.
         */
        $r = new WP_Query( apply_filters( \'widget_posts_args\', array(
            \'posts_per_page\'      => $number,
            \'no_found_rows\'       => true,
            \'post_status\'         => \'publish\',
            \'ignore_sticky_posts\' => true
        ) ) );

        if ($r->have_posts()) :
?>
        <?php echo $before_widget; ?>
        <?php if ( $title ) echo $before_title . $title . $after_title; ?>
        <ul>
        <?php while ( $r->have_posts() ) : $r->the_post(); ?>
            <li>
            <?php if ( $show_thumbnail ) : ?>
                <?php echo get_the_post_thumbnail (); ?>
            <?php endif; ?> 
                <a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a>
            <?php if ( $show_date ) : ?>
                <span class="post-date"><?php echo get_the_date(); ?></span>
            <?php endif; ?>
            </li>
        <?php endwhile; ?>
        </ul>
        <?php echo $after_widget; ?>
<?php
        // Reset the global $the_post as this query will have stomped on it
        wp_reset_postdata();

        endif;

        if ( ! $this->is_preview() ) {
            $cache[ $args[\'widget_id\'] ] = ob_get_flush();
            wp_cache_set( \'widget_recent_posts\', $cache, \'widget\' );
        } else {
            ob_flush();
        }
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance[\'title\'] = strip_tags($new_instance[\'title\']);
        $instance[\'number\'] = (int) $new_instance[\'number\'];
        $instance[\'show_date\'] = isset( $new_instance[\'show_date\'] ) ? (bool) $new_instance[\'show_date\'] : false;
        $instance[\'show_thumbnail\'] = isset( $new_instance[\'show_thumbnail\'] ) ? (bool) $new_instance[\'show_thumbnail\'] : false;
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( \'alloptions\', \'options\' );
        if ( isset($alloptions[\'svib_widget_recent_entries\']) )
            delete_option(\'svib_widget_recent_entries\');

        return $instance;
    }

    function flush_widget_cache() {
        wp_cache_delete(\'widget_recent_posts\', \'widget\');
    }

    function form( $instance ) {
        $title     = isset( $instance[\'title\'] ) ? esc_attr( $instance[\'title\'] ) : \'\';
        $number    = isset( $instance[\'number\'] ) ? absint( $instance[\'number\'] ) : 5;
        $show_date = isset( $instance[\'show_date\'] ) ? (bool) $instance[\'show_date\'] : false;
        $show_thumbnail = isset( $instance[\'show_thumbnail\'] ) ? (bool) $instance[\'show_thumbnail\'] : false;
?>
        <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 $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id( \'number\' ); ?>"><?php _e( \'Number of posts to show:\' ); ?></label>
        <input id="<?php echo $this->get_field_id( \'number\' ); ?>" name="<?php echo $this->get_field_name( \'number\' ); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>

        <p><input class="checkbox" type="checkbox" <?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( \'show_date\' ); ?>" name="<?php echo $this->get_field_name( \'show_date\' ); ?>" />
        <label for="<?php echo $this->get_field_id( \'show_date\' ); ?>"><?php _e( \'Display post date?\' ); ?></label></p>

        <p><input class="checkbox" type="checkbox" <?php checked( $show_thumbnail ); ?> id="<?php echo $this->get_field_id( \'show_thumbnail\' ); ?>" name="<?php echo $this->get_field_name( \'show_thumbnail\' ); ?>" />
        <label for="<?php echo $this->get_field_id( \'show_thumbnail\' ); ?>"><?php _e( \'Display post Thumbnail?\' ); ?></label></p>


<?php
    }
}

1 个回复
SO网友:engelen

问题似乎在于重新定义小部件:ID为“recent posts”的小部件已经存在,这在保存小部件时会导致一些奇怪的行为。这可能是由于将小部件保存在原始小部件类上时回调WP_Widget_Recent_Posts).

无论如何,重新定义小部件并不是一个好主意;widgets API不打算以这种方式使用。您的问题可以通过使用唯一的小部件ID来解决;用中的另一个ID替换“最近的帖子”

parent::__construct(\'recent-posts\', __(\'Recent Posts\'), $widget_ops);
同时,重命名小部件以避免出现重复的小部件标题:

parent::__construct( \'myplugin-recent-posts\', __( \'My plugin: Recent Posts\', \'myplugin_textdomain\' ), $widget_ops );

结束

相关推荐

根据URL更改sidebar.php和footer.php

几天前,我提出了一个类似的问题,但也许我的问题有点不正确。我想要我的页脚。php和侧栏。php将根据URL进行更改。如果URL包含/ru,则显示ru页脚。php else显示默认页脚(footer.php)。侧边栏也应该如此。如果可能的话,你能一步一步地引导我吗。非常感谢。