Code for Recent Posts Widget

时间:2013-04-26 作者:Astoria

我想更改“最近的帖子”小部件的代码——有人能告诉我代码在哪里吗?

提前感谢您!

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

默认的最近发布小部件代码为includes/default-widgets.php 但您不应该对核心代码进行黑客攻击。将该函数复制到主题的functions.php, 重命名它,并创建自己的自定义小部件。

SO网友:Chip Bennett

进去看看wp-includes\\default-widgets.php.

/**
 * Recent_Posts widget class
 *
 * @since 2.8.0
 */
class WP_Widget_Recent_Posts extends WP_Widget {

    function __construct() {
        $widget_ops = array(\'classname\' => \'widget_recent_entries\', \'description\' => __( "The most recent posts on your site") );
        parent::__construct(\'recent-posts\', __(\'Recent Posts\'), $widget_ops);
        $this->alt_option_name = \'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 = wp_cache_get(\'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\' );
        $title = apply_filters( \'widget_title\', $title, $instance, $this->id_base );
        $number = ( ! empty( $instance[\'number\'] ) ) ? absint( $instance[\'number\'] ) : 10;
        if ( ! $number )
            $number = 10;
        $show_date = isset( $instance[\'show_date\'] ) ? $instance[\'show_date\'] : false;

        $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>
                <a href="<?php the_permalink() ?>" title="<?php echo esc_attr( get_the_title() ? get_the_title() : get_the_ID() ); ?>"><?php if ( get_the_title() ) the_title(); else 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;

        $cache[$args[\'widget_id\']] = ob_get_flush();
        wp_cache_set(\'widget_recent_posts\', $cache, \'widget\');
    }

    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\'] = (bool) $new_instance[\'show_date\'];
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( \'alloptions\', \'options\' );
        if ( isset($alloptions[\'widget_recent_entries\']) )
            delete_option(\'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;
?>
        <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>
<?php
    }
}
如果修改此小部件,请确保fork it, 并将您的分叉小部件注册为new Widget.

编辑如何分叉核心小部件

从开始the Codex entry on the Widgets API.

重命名小部件

更改此项:

class WP_Widget_Recent_Posts extends WP_Widget {}
。。。对此:

class wpse97411_Widget_Recent_Posts extends WP_Widget {}
修改Widget类以满足您的需要

注册小部件:

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

结束

相关推荐

Using tabs in admin widgets

更新:我应该指出,我在插件/主题选项页面上测试了下面的方法,效果非常好。事实上,我还能够包括jQuery cookie插件,以保留页面加载之间的当前选项卡选择(很好!)。当您有多个小部件选项时,尝试向管理小部件添加选项卡以减少表单占用空间。我正在使用WordPress附带的jQuery UI选项卡。以下是我迄今为止在插件中编写的代码。http://pastebin.com/fe4wdBcp当小部件被拖动到小部件区域时,选项卡似乎呈现为OK,但您无法单击查看第二个选项卡。更糟糕的是,如果刷新窗口小部件页面,