This Code Creates a New Recent Posts Widget Which Includes Your CPT\'s
扩展本机“最近发布”小部件时需要两个步骤:
i、 为自定义的最近帖子小部件创建一个新类,可以通过从默认小部件复制和重命名最近帖子小部件代码来实现。wp中的php包含文件夹。
二、然后,您还需要注册新的小部件,您可以选择取消注册本机最近发布的小部件或同时使用这两个小部件。
所有代码都可以使用子主题复制到函数文件中,或者创建另一个文件并将其包含在子主题函数文件中。
<?php
class WPSites_Recent_Posts extends WP_Widget {
public function __construct() {
$widget_ops = array(\'classname\' => \'wpsites_recent_posts\', \'description\' => __( "Latest CPT\'s & Posts.") );
parent::__construct(\'wpsites-recent-posts\', __(\'WP Sites Recent Posts\'), $widget_ops);
$this->alt_option_name = \'wpsites_recent_posts\';
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\') );
}
public function widget($args, $instance) {
$cache = array();
if ( ! $this->is_preview() ) {
$cache = wp_cache_get( \'wpsites_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();
$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;
$r = new WP_Query( apply_filters( \'widget_posts_args\', array(
\'posts_per_page\' => $number,
\'no_found_rows\' => true,
\'post_status\' => \'publish\',
\'post_type\' => array(\'post\', \'portfolio\',
\'ignore_sticky_posts\' => true
) ) ) );
if ($r->have_posts()) :
?>
<?php echo $args[\'before_widget\']; ?>
<?php if ( $title ) {
echo $args[\'before_title\'] . $title . $args[\'after_title\'];
} ?>
<ul>
<?php while ( $r->have_posts() ) : $r->the_post(); ?>
<li>
<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 $args[\'after_widget\']; ?>
<?php
wp_reset_postdata();
endif;
if ( ! $this->is_preview() ) {
$cache[ $args[\'widget_id\'] ] = ob_get_flush();
wp_cache_set( \'wpsites_widget_recent_posts\', $cache, \'widget\' );
} else {
ob_end_flush();
}
}
public 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;
$this->flush_widget_cache();
$alloptions = wp_cache_get( \'alloptions\', \'options\' );
if ( isset($alloptions[\'wpsites_recent_posts\']) )
delete_option(\'wpsites_recent_posts\');
return $instance;
}
public function flush_widget_cache() {
wp_cache_delete(\'wpsites_widget_recent_posts\', \'widget\');
}
public 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
}
}
Register the new custom recent posts widget
function wpsites_widgets_init() {
if ( !is_blog_installed() )
return;
register_widget(\'WPSites_Recent_Posts\');
do_action( \'widgets_init\' );
}
add_action( \'init\', \'wpsites_widgets_init\', 2 );
该代码包括一个修改后的WP\\u查询,其中包含一个帖子类型数组,其中包括可以重命名以匹配自定义帖子类型的公文包CPT。
下面是需要修改的代码行:
\'post_type\' => array(\'post\', \'portfolio\',