在“最近发布的帖子”小部件中包含自定义帖子类型

时间:2010-09-30 作者:Sampson

我可以通过使用query_posts(), 但我不确定如何在“最近的帖子”边栏小部件(或任何其他小部件)中包含自定义帖子类型。

我应该如何扩展“最近发表的文章”的范围,使其不仅仅包括本机文章类型?

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

您必须编辑最近帖子小部件的代码,或者根据默认值创建自己的版本。代码位于wp-includes/default-widgets.php 在第513行周围归档。但是,由于您不应该对core进行修改,我的建议是复制代码来创建您自己的“我的自定义最近帖子”小部件,并在您的站点上使用它。只需将新的widget类放入主题functions.php 文件或在插件中使用它。

您只需要对小部件的类名和封装的函数和选项进行真正的修改(这样就不会与原始的最近发布的小部件有任何命名冲突。之后,您需要编辑对WP_Querywidget() 构造函数,以便它包含自定义的帖子类型。

对于这个示例,我设置了post_type 等于array(\'post, \'page\', \'custom-post-type\') ... 您需要修改它以适合您的特定用例

以下是小部件的完整代码供参考:

/**
  * My_Custom_Recent_Posts widget class
  *
  */
class WP_Widget_My_Custom_Recent_Posts extends WP_Widget {

    function __construct() {
        $widget_ops = array(\'classname\' => \'widget_my_custom_recent_entries\', \'description\' => __( "The most recent posts on your site") );
        $this->WP_Widget(\'my-custom-recent-posts\', __(\'My Custom Recent Posts\'), $widget_ops);
        $this->alt_option_name = \'widget_my_custom_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_my_custom_recent_posts\', \'widget\');

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

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

        ob_start();
        extract($args);

        $title = apply_filters(\'widget_title\', empty($instance[\'title\']) ? __(\'My Custom Recent Posts\') : $instance[\'title\'], $instance, $this->id_base);
        if ( !$number = (int) $instance[\'number\'] )
            $number = 10;
        else if ( $number < 1 )
            $number = 1;
        else if ( $number > 15 )
            $number = 15;

        $r = new WP_Query(array(\'showposts\' => $number, \'nopaging\' => 0, \'post_status\' => \'publish\', \'ignore_sticky_posts\' => true, \'post_type\' => array(\'post\', \'page\', \'custom-post-type\')));
        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></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_my_custom_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\'];
        $this->flush_widget_cache();

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

        return $instance;
    }

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

    function form( $instance ) {
        $title = isset($instance[\'title\']) ? esc_attr($instance[\'title\']) : \'\';
        if ( !isset($instance[\'number\']) || !$number = (int) $instance[\'number\'] )
            $number = 5;
?>
        <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>
<?php
    }
}

SO网友:David Pashley

至少从3.6开始,您可以使用以下代码来修改所使用的查询:

add_filter(\'widget_posts_args\', \'widget_posts_args_add_custom_type\'); 
function widget_posts_args_add_custom_type($params) {
   $params[\'post_type\'] = array(\'post\',\'custom_type\');
   return $params;
}
只需在post\\u type的数组中添加所需的类型,它们就会出现。

更新:根据http://core.trac.wordpress.org/ticket/16159, 这从3.4开始提供

SO网友:Steve Meisner

我刚刚遇到了一个很好的插件,它已经完成了繁重的工作,并且有很好的文档和作者支持。我真的很感动。

信息技术allows WP_Query overrides (允许您filter by custom post types 和其他任何你想要的)以及一些关于如何使用它的明确说明。

Documentationhttp://www.pjgalbraith.com/2011/08/recent-posts-plus/

Wordpress Plugin URLhttp://wordpress.org/extend/plugins/recent-posts-plus/

把我的作品缩短了很多!

SO网友:sorich87

您可以复制小部件代码(请参阅/wp includes/default widgets.php)并修改查询行。

SO网友:jaredwilli

我还为此创建了一个小部件插件,它比最近发布的小部件更具可定制性。如果有兴趣,可以在这里下载http://new2wp.com/pro/latest-custom-post-type-posts-sidebar-widget/

SO网友:Brad Dalton

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\',

SO网友:Marco Faustinelli

现在是2020年,我来这里是为了找到“最新10个自定义帖子类型XYZ”的解决方案。我找到了做这件事的插件,还有更多。

Custom Post Type Widgets 将常用的小部件标准帖子功能(最近、每月存档、使用的类别、最近的评论、搜索、日历)扩展到自定义帖子类型。

您选择所需的小部件(在我的例子中是“最近的”),然后首先得到一个选择,您可以在其中指定小部件必须针对的自定义帖子类型。默认选择是好的旧“post”,所以这个插件是与普通WP post相关的小部件的替代品。

结束

相关推荐

Sidebar slideshow widget

有人知道可以放在边栏上的高质量图像幻灯片小部件吗?