如何在最近发布的帖子小工具中截断标题?

时间:2011-07-28 作者:katkat

我读了这里的帖子。。。

http://wordpress.org/support/topic/truncate-titles-in-recent-posts-widget?replies=8

但建议的解决方案不起作用,因为我不确定该如何处理代码。

任何人都可以使用pastebin链接中的代码给我完整的代码,在这里:http://wordpress.org/support/topic/post-title-char-count?replies=5

请把标题缩短到25个字符?我真的不擅长PHP。

制作插件可能更容易,因为代码已经存在,所以任何人都可以选择限制标题的字符数?

非常感谢!

1 个回复
SO网友:t31os

我不确定我是否会回答这个话题,或者只是投票结束这个话题,我觉得我已经问了你提到的最初的话题,我只想在这里重复我自己。

这就是说,这里有一个最新版本,你可以使用(只花了我2分钟),你只需要实现自己的代码来截断小部件中的标题,我已经为你标记了代码区域。

add_action( \'widgets_init\', \'switch_recent_posts_widget\' );

function switch_recent_posts_widget() {

    unregister_widget( \'WP_Widget_Recent_Posts\' );
    register_widget( \'WP_Widget_Recent_Posts_Truncated\' );

}

class WP_Widget_Recent_Posts_Truncated 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($cache[$args[\'widget_id\']]) ) {
            echo $cache[$args[\'widget_id\']];
            return;
        }

        ob_start();
        extract($args);

        $title = apply_filters(\'widget_title\', empty($instance[\'title\']) ? __(\'Recent Posts\') : $instance[\'title\'], $instance, $this->id_base);
        if ( ! $number = absint( $instance[\'number\'] ) )
            $number = 10;

        $r = new WP_Query(array(\'posts_per_page\' => $number, \'no_found_rows\' => true, \'post_status\' => \'publish\', \'ignore_sticky_posts\' => true));
        if ($r->have_posts()) :
?>
        <?php echo $before_widget; global $post ?>
        <?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(); // DO YOUR STRING LENGTH RESTRICTION HERE!
            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_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_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;
?>
        <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
    }
}
您需要决定如何截断标题,或者是按一定的字数,或者如您在问题中所说,按字符数,无论如何,每种方法都有一些缺点,这就是为什么我让您来决定要实现哪个以及为什么。。

您需要更新的区域旁边有一条注释,如下所示。。

// DO YOUR STRING LENGTH RESTRICTION HERE!
小纸条,只需确保使用get_the_title() 当您需要操纵标题时,因为这将给您一个返回值,而不是打印的值(您将得到the_title()).

这里有一个关于StackOverflow主题的链接,该主题与截断文本有关,还有一个google链接,其中包含大量链接,您可以研究这些链接,了解截断的方法。

https://stackoverflow.com/questions/965235/how-can-i-truncate-a-string-in-php
http://www.google.comk/search?q=php+truncate+string+to+length

NOTE: 这是现有“最近发布”小部件的替代品,您不会丢失任何已设置的内容,它将继承并接管默认“最近发布”小部件的设置。

结束

相关推荐

Why use widgets?

我对使用WordPress很陌生,我想知道使用小部件的好处是什么?看here 这听起来像是为那些不是程序员的人准备的,他们想在他们的网站上添加插件。对吗?或者小部件是否在某种程度上使站点更加健壮?