最近的帖子wordpress小部件,有限的文字和'阅读更多'链接

时间:2013-01-04 20:49:33

标签: widget wordpress-plugin wordpress

我正在为练习创建一个Wordpress Recent Posts小部件。但是我遇到了一些我不知道该怎么做的事情。首先,小部件必须显示帖子的日期和时间,帖子标题,具有智能截断字符限制的文本以及阅读更多链接。它还必须允许管理员指定标题,类别,要显示的帖子数量,帖子上显示的字符数,最后更改“阅读更多”链接的措辞。

我已经创建了小部件并想出了如何做所有事情,但是将类别选择作为下拉选择,其中已有类别(现在它只是管理员的文本块,您可以在哪个类别中键入显示),如何限制the_excerpt中的字符,使其巧妙地切断一个单词的结尾,并允许管理员指定我的字符是如何被允许的,以及如何在允许管理员的同时创建一个阅读更多的链接指明它的内容。

我将发布到目前为止的代码,以及包含侧边栏中小部件的网站的链接。我是Wordpress Widget设计的新手,所以非常感谢帮助。

<?php
/*
Plugin Name: News Recent Posts Widget
Plugin URI: 
Description: A recent post widget with extra functions for client management
Author: Kevin Ullyott
Version: 1.0
Author URI: http://modmacro.com/
*/


class recentpost extends WP_Widget {

    public function __construct() {
    parent::WP_Widget(
    // or parent::__construct(
        false, 
        'Kevin - Recent Posts Widget',
        array(
            'description' => __('A recent post widget with extra functions for client management') 

        )
    );
    ;
}

    public function widget( $args, $instance ) {


        extract( $args );

        $headline = $instance['headline'];
        $category = $instance['category'];
        $numberposts = $instance['numberposts'];
        $readmore = $instance['readmore'];


        echo $before_widget;

        echo $before_title;

        echo "<p class=\"headline\">$headline</p>";

        echo $after_title;

        $args = array( 'numberposts' => $numberposts, 'category_name' => $category );
        $recent_posts = wp_get_recent_posts( $args );
        foreach( $recent_posts as $recent ){
        setup_postdata(get_post($recent['ID']));
        echo '<a href="' . get_permalink() . '" title=" '.esc_attr(get_the_title()).'" >' .   get_the_title().'</a> ';
        echo get_the_time('F j, Y', $recent['ID']);
        the_excerpt();
}
wp_reset_postdata();


        echo $after_widget;


    }

    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['headline'] = ( $new_instance['headline'] );
        $instance['category'] = ( $new_instance['category'] );
        $instance['numberposts'] = ( $new_instance['numberposts'] );
        $instance['readmore'] = ( $new_instance['readmore'] );
        return $instance;
    }


    public function form( $instance ) {

        $headline = $instance[ 'headline' ];
        $category = $instance[ 'category' ];
        $numberposts = $instance[ 'numberposts' ];
        $readmore = $instance[ 'readmore' ];

        ?>

<p>
  <label for="<?php echo $this->get_field_id( 'headline' ); ?>">
    <?php _e( 'Headline:' ); ?>
  </label>
  <input class="widefat" id="<?php echo $this->get_field_id( 'headline' ); ?>" name="<?php echo $this->get_field_name( 'headline' ); ?>" type="text" value="<?php echo esc_attr( $headline ); ?>" />
</p>
<label for="<?php echo $this->get_field_id( 'category' ); ?>">
  <?php _e( 'Category:' ); ?>
</label>
<input class="widefat" id="<?php echo $this->get_field_id( 'category' ); ?>" name="<?php echo $this->get_field_name( 'category' ); ?>" type="text" value="<?php echo esc_attr( $category ); ?>" />
</p>
<label for="<?php echo $this->get_field_id( 'numberposts' ); ?>">
  <?php _e( 'Number of posts:' ); ?>
</label>
<input class="widefat" id="<?php echo $this->get_field_id( 'numberposts' ); ?>" name="<?php echo $this->get_field_name( 'numberposts' ); ?>" type="text" value="<?php echo esc_attr( $numberposts ); ?>" />
</p>
<label for="<?php echo $this->get_field_id( 'readmore' ); ?>">
  <?php _e( 'Read More:' ); ?>
</label>
<input class="widefat" id="<?php echo $this->get_field_id( 'readmore' ); ?>" name="<?php echo $this->get_field_name( 'readmore' ); ?>" type="text" value="<?php echo esc_attr( $readmore ); ?>" />
</p>
<?php 
    }
}

add_action( 'widgets_init', create_function('', 'return register_widget("recentpost");') );


?>

http://www.modmacro.us/wpsandbox/

1 个答案:

答案 0 :(得分:1)

这个问题很多。我认为你将这个作为练习练习是很好的。这正是我学习的方式。我可以提供一些帮助。

类别

在表单函数中,首先需要使用WordPress'get_categories函数获取所有类别的列表。

$categories = get_categories(array('type'=>'post','orderby'=> 'name','order'=> 'ASC'));

然后,要在表单中显示一个下拉菜单,可以使用for循环遍历每个类别。

echo '<select name="' . $this->get_field_name('category') . '" id="' . $this->get_field_id('category') . '">';
  foreach($categories as $category):
    echo '  <option value="' . $category->slug .'" '. selected($category->slug, $instance['category'], false) . '>' . $category->name . '</option>';        
  endforeach;
echo '</select>';

显示发布日期/时间等

我认为最好使用WP_Query类,它更灵活,似乎是目前的首选路径。在您的小部件功能中,它看起来像这样

$args = array( 'numberposts' => $numberposts, 'category_name' => $category );

$myquery = new WP_Query($args);

while($myquery->have_posts()): $myquery->the_post();

  echo '<a href="' . get_permalink() . '" title=" '.esc_attr(get_the_title()).'" >' .   get_the_title().'</a> ';
  echo get_the_time('F j, Y', $myquery->ID);
  the_excerpt();

endwhile;
wp_reset_query();
wp_reset_postdata();

限制摘录

这将适用于您主题中摘录的所有用法。

function new_excerpt_length($length) {
    return 20;
}
add_filter('excerpt_length', 'new_excerpt_length');