このコードを使用して、コメント数に基づいて3つの最も人気のある投稿を表示しています。
<?php
$pop_posts = 3;
$popularposts = "SELECT $wpdb->posts.ID, $wpdb->posts.post_title, COUNT($wpdb->comments.comment_post_ID) AS 'stammy' FROM $wpdb->posts, $wpdb->comments WHERE comment_approved = '1' AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status = 'publish' AND comment_status = 'open' GROUP BY $wpdb->comments.comment_post_ID ORDER BY stammy DESC LIMIT ".$pop_posts;
$posts = $wpdb->get_results($popularposts);
if($posts){
foreach($posts as $post){
$post_title = stripslashes($post->post_title);
$guid = get_permalink($post->ID);
$thumb = get_post_meta($post->ID,'_thumbnail_id',false);
$thumb = wp_get_attachment_image_src($thumb[0], 'popular-posts-image', false);
$thumb = $thumb[0];
?>
<?php if ($thumb) { ?>
<img src="<?php echo $thumb; ?>" width=80 height=80 />
<?php } ?>
<h4><a href="<?php echo $guid; ?>" title="<?php echo $post_title; ?>"><?php echo $post_title; ?></a></h4>
<div class="clear"></div>
<?php
}
}
?>
しかし、このコードを2つの異なる場所で使用したいので、最初の3つの投稿をオフセットしたいと思います。 3つの投稿を相殺できる方法はありますか?ありがとう
これがあなたのコードをプラグインにまとめたものです。重要なことは、それが入力をprepare()
sするので、クエリは安全であるということです。オフセットと制限の2つの引数を定義できます。これらは基本的に単なるSQLのLIMIT
です。
プラグインを使用しない場合は、プラグインを無効にしてください。何もしません。出力はフィルタに接続されています…
$most_commented = apply_filters( 'wpse70027_display_comments', 0, 3 );
// Now process the result in your template...
…これは単純に任意のテンプレートファイルに入れることができます。
<?php
/**
* Plugin Name: (#70027) »kaiser« Get Most Commented.
* Description: Just place the filter in your themes template file and you're ready to go.
*/
function wpse70027_get_comments( $offset = 0, $limit = 10 )
{
global $wpdb;
static $instance;
// Validate input
$offset = absint( $offset );
$limit = absint( $limit );
// Prevent wrong user input
0 > $offset AND $instance['offset'] = 0;
// Setup offset/limit as 0/10 on the 1st run
! isset( $instance['offset'] ) AND $instance['offset'] = $offset;
! isset( $instance['limit'] ) AND $instance['limit'] = $limit;
// Setup the query string
! isset( $instance['query'] ) AND $instance['query'] =
"
SELECT $wpdb->posts.ID, $wpdb->posts.post_title,
COUNT($wpdb->comments.comment_post_ID) AS cmt
FROM $wpdb->posts, $wpdb->comments
WHERE comment_approved = '1'
AND $wpdb->posts.ID = $wpdb->comments.comment_post_ID
AND post_status = 'publish'
AND comment_status = 'open'
GROUP BY $wpdb->comments.comment_post_ID
ORDER BY cmt
DESC
LIMIT %d, %d
";
! isset( $instance['posts'] ) AND $instance['posts'] = array();
// Three conditions trigger a new query:
# A) Plugin is running the first time and 'posts' isn't set
# B) The input offset is below the default offset
# C) The input limit is above the default limit
if (
! isset( $instance['posts'] )
OR ! in_array( $offset, range( $instance['offset'], $instance['limit'] ) )
OR ! in_array( $limit, range( $instance['offset'], $instance['limit'] ) )
)
{
// Adjust the range
$instance['offset'] = $instance['offset'] > $offset ? $offset : $instance['offset'];
$instance['limit'] = $instance['limit'] < $limit ? $limit : $instance['limit'];
$instance['posts'] = $wpdb->get_results( $wpdb->prepare(
$instance['query']
,$instance['offset']
,$instance['limit']
) );
}
// Only return what was requested
return array_intersect_key(
$instance['posts']
,range( $offset, $limit )
);
}
add_filter( 'wpse70027_display_comments', 'wpse70027_get_comments', 10, 2 );
そして、それを自分のfunctions.phpファイルに入れてもパフォーマンスに違いはありません。唯一のことは、このコードはテーマの更新や変更の際に使われることになるので、プラグインの中に置いたほうがいいです。
ワードプレスクエリを使用して、1ページに複数のループを配置し、2番目のループでカウントをオフセットすることができます。
<?php
$args = array(
'posts_per_page' => 3,
'orderby' => 'comment_count'
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
//Put what you want to output here
<?php
endwhile;
endif; ?>
<?php wp_reset_postdata(); ?>
次に、2番目のクエリでそれをオフセットします。
<?php
$args = array(
'posts_per_page' => 3,
'orderby' => 'comment_count',
'offset' => 3
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
//Put what you want to output here
<?php
endwhile;
endif; ?>
http://codex.wordpress.org/Class_Reference/WP_Query#Post_.26_Page_Parameters