Mã cho widget bài viết gần đây


8

Tôi muốn thực hiện thay đổi mã của tiện ích Bài đăng gần đây - bất cứ ai cũng có thể vui lòng cho tôi biết mã đó được đặt ở đâu không?

Cảm ơn bạn trước!


4
Đừng hack cốt lõi, bao giờ. Đăng ký cho mình một tiện ích mới: codex.wordpress.org/Widgets_API Bạn có thể sử dụng tiện ích bài đăng gần đây làm ví dụ mã hóa.
Andrew Bartel

Câu trả lời:


8

Mã Widget Bài viết gần đây mặc định nằm trong includes/default-widgets.phpnhưng bạn không nên hack Mã lõi. Sao chép chức năng đó vào chủ đề của bạn functions.php, đổi tên nó và tạo tiện ích tùy chỉnh của riêng bạn.


Một câu hỏi, mặc dù, @s_ha_dum: tại sao việc hack mã lõi lại không thực tế?
Astoria

2
1) Bạn có thể phá vỡ mọi thứ rất dễ dàng và thậm chí có thể không nhận ra và 2) tất cả công việc của bạn sẽ bị ghi đè vào lần tiếp theo khi bạn cập nhật WordPress. Sau đó, bạn phải làm lại mọi thứ. Hack lõi là một đau đầu rất lớn.
s_ha_dum

18

Có một cái nhìn trong 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
    }
}

Nếu bạn sửa đổi Widget này, hãy chắc chắn rẽ nhánh nó và đăng ký Widget rẽ nhánh của bạn như một Widget mới .

Biên tập

Cách rẽ nhánh một Widget lõi

Bắt đầu với mục Codex trên API Widgets .

  1. Đổi tên widget

    Thay đổi cai nay đi:

    class WP_Widget_Recent_Posts extends WP_Widget {}

    ... đến đây:

    class wpse97411_Widget_Recent_Posts extends WP_Widget {}
  2. Sửa đổi lớp Widget cho phù hợp với nhu cầu của bạn

  3. Đăng ký Widget của bạn:

    function wpse97413_register_custom_widgets() {
        register_widget( 'wpse97411_Widget_Recent_Posts' );
    }
    add_action( 'widgets_init', 'wpse97413_register_custom_widgets' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.