2

今週最も人気のある投稿を表示する、Wordpress プラットフォーム用のウィジェットを作成しました。ただし、これには問題があります。過去 7 日間ではなく、月曜日の最も人気のある投稿をカウントします。たとえば、火曜日には、火曜日と月曜日の投稿のみが含まれることを意味します。

ここに私のウィジェットコードがあります:

<?php class PopularWidget extends WP_Widget
{
    function PopularWidget(){
        $widget_ops = array('description' => 'Displays Popular Posts');
        $control_ops = array('width' => 400, 'height' => 300);
        parent::WP_Widget(false,$name='ET Popular Widget',$widget_ops,$control_ops);
    }

  /* Displays the Widget in the front-end */
    function widget($args, $instance){
        extract($args);
        $title = apply_filters('widget_title', empty($instance['title']) ? 'Popular This Week' : $instance['title']);
        $postsNum = empty($instance['postsNum']) ? '' : $instance['postsNum'];
        $show_thisweek = isset($instance['thisweek']) ? (bool) $instance['thisweek'] : false;

        echo $before_widget;

        if ( $title )
        echo $before_title . $title . $after_title;

?>
<?php
    $additional_query = $show_thisweek ? '&year=' . date('Y') . '&w=' . date('W') : '';

    query_posts( 'post_type=post&posts_per_page='.$postsNum.'&orderby=comment_count&order=DESC' . $additional_query ); ?>
        <div class="widget-aligned">
        <h3 class="box-title">Popular Articles</h3>
        <div class="blog-entry">
            <ol>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
            <li><h4 class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4></li>
    <?php endwhile; endif; wp_reset_query(); ?>
            </ol>
        </div>
        </div> <!-- end widget-aligned -->
        <div style="clear:both;"></div>
<?php
        echo $after_widget;
    }

  /*Saves the settings. */
    function update($new_instance, $old_instance){
        $instance = $old_instance;
        $instance['title'] = stripslashes($new_instance['title']);
        $instance['postsNum'] = stripslashes($new_instance['postsNum']);
        $instance['thisweek'] = 0;
        if ( isset($new_instance['thisweek']) ) $instance['thisweek'] = 1;

        return $instance;
    }

  /*Creates the form for the widget in the back-end. */
    function form($instance){
        //Defaults
        $instance = wp_parse_args( (array) $instance, array('title'=>'Popular Posts', 'postsNum'=>'','thisweek'=>false) );

        $title = htmlspecialchars($instance['title']);
        $postsNum = htmlspecialchars($instance['postsNum']);


        # Title
        echo '<p><label for="' . $this->get_field_id('title') . '">' . 'Title:' . '</label><input class="widefat" id="' . $this->get_field_id('title') . '" name="' . $this->get_field_name('title') . '" type="text" value="' . $title . '" /></p>';
        # Number of posts
        echo '<p><label for="' . $this->get_field_id('postsNum') . '">' . 'Number of posts:' . '</label><input class="widefat" id="' . $this->get_field_id('postsNum') . '" name="' . $this->get_field_name('postsNum') . '" type="text" value="' . $postsNum . '" /></p>';  ?>
        <input class="checkbox" type="checkbox" <?php checked($instance['thisweek'], 1) ?> id="<?php echo $this->get_field_id('thisweek'); ?>" name="<?php echo $this->get_field_name('thisweek'); ?>" />
        <label for="<?php echo $this->get_field_id('thisweek'); ?>"><?php esc_html_e('Popular this week','Aggregate'); ?></label>
        <?php
    }

}// end AboutMeWidget class

function PopularWidgetInit() {
  register_widget('PopularWidget');
}

add_action('widgets_init', 'PopularWidgetInit');

?>

このスクリプトを変更して、先週の月曜日の投稿ではなく、過去 7 日間をカウントするようにするにはどうすればよいですか?

4

1 に答える 1

2

わかりました、あなたの要求とディエゴのリンクに基づいて、このようなもの (テストされていません) が機能するはずです。

まず、によって選択された行をフィルタリングする関数をクラスに追加しますquery_posts

function this_week_filter($where = '') {
    $where .= " AND post_date >= '" . date('Y-m-d', strtotime('-7 days')) . "'";
    return $where;
}

次に、(必要に応じて) を呼び出す前にフィルターを追加しますquery_posts

if ($show_thisweek) {
    add_filter('posts_where', array($this, 'this_week_filter'));
}

安全のために、呼び出し後に削除してquery_postsください(実行する他のクエリには影響しません)。

if ($show_thisweek) {
    remove_filter('posts_where', array($this, 'this_week_filter'));
}

すべてを一緒に入れて:

<?php class PopularWidget extends WP_Widget
{
    function PopularWidget(){
        $widget_ops = array('description' => 'Displays Popular Posts');
        $control_ops = array('width' => 400, 'height' => 300);
        parent::WP_Widget(false,$name='ET Popular Widget',$widget_ops,$control_ops);
    }

    function this_week_filter($where = '') {
        $where .= " AND post_date >= '" . date('Y-m-d', strtotime('-7 days')) . "'";
        return $where;
    }

  /* Displays the Widget in the front-end */
    function widget($args, $instance){
        extract($args);
        $title = apply_filters('widget_title', empty($instance['title']) ? 'Popular This Week' : $instance['title']);
        $postsNum = empty($instance['postsNum']) ? '' : $instance['postsNum'];
        $show_thisweek = isset($instance['thisweek']) ? (bool) $instance['thisweek'] : false;

        echo $before_widget;

        if ( $title )
        echo $before_title . $title . $after_title;

        if ($show_thisweek) {
            add_filter('posts_where', array($this, 'this_week_filter'));
        }


        query_posts( 'post_type=post&posts_per_page='.$postsNum.'&orderby=comment_count&order=DESC'); ?>
        <div class="widget-aligned">
        <h3 class="box-title">Popular Articles</h3>
        <div class="blog-entry">
            <ol>
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                <li><h4 class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4></li>
            <?php endwhile; endif;

            if ($show_thisweek) {
                remove_filter('posts_where', array($this, 'this_week_filter'));
            }

            wp_reset_query(); ?>
            </ol>
        </div>
        </div> <!-- end widget-aligned -->
        <div style="clear:both;"></div>
<?php
        echo $after_widget;
    }

コードの残りの部分は変更されていません。

remove_filter呼び出しを前に (の直後に)移動することはおそらく可能query_postsですが、今はテストできません。

于 2012-12-11T17:01:40.170 に答える