Written by Anonymous
function get_access_ranking_records($days = 'all', $limit = 5, $type = ET_DEFAULT, $cat_ids = array(), $exclude_post_ids = array(), $exclude_cat_ids = array(), $children = 0, $author = null, $post_type = 'post', $snippet = 0){
//カテゴリー配列を文字列に変換
$cat_ids = is_array($cat_ids) ? $cat_ids : array();
$cats = implode(',', $cat_ids);
//アクセスキャッシュを有効にしている場合
if (is_access_count_cache_enable()) {
if ($cat_ids) {
//子孫カテゴリーも含める場合
if ($children) {
$categories = $cat_ids;
$res = $categories;
foreach ($categories as $category) {
$res = array_merge($res, get_term_children( $category, 'category' ));
}
$cat_ids = $res;
$cats = implode(',', $res);
}
}
//除外投稿
$archive_exclude_post_ids = get_archive_exclude_post_ids();
if ($archive_exclude_post_ids && is_array($archive_exclude_post_ids)) {
$exclude_post_ids = array_unique(array_merge($exclude_post_ids, $archive_exclude_post_ids));
}
$exclude_post_ids = is_array($exclude_post_ids) ? $exclude_post_ids : array();
$expids = implode(',', $exclude_post_ids);
$exclude_cat_ids = is_array($exclude_cat_ids) ? $exclude_cat_ids : array();
$excats = implode(',', $exclude_cat_ids);
$type = get_accesses_post_type();
$transient_id = TRANSIENT_POPULAR_PREFIX.'?days='.$days.'&limit='.$limit.'&type='.$type.'&cats='.$cats.'&children='.$children.'&expids='.$expids.'&excats='.$excats.'&author='.$author.'&post_type='.$post_type;
$cache = get_transient( $transient_id );
if ($cache) {
if (DEBUG_MODE && is_user_administrator()) {
// echo('<pre>');
// echo $transient_id;
// echo('</pre>');
} elseif (is_user_administrator()){
} else {
return $cache;
}
}
}
global $wpdb;
$access_table = ACCESSES_TABLE_NAME;
$date = get_current_db_date();
$where = " WHERE {$access_table}.post_type = '$post_type' ".PHP_EOL;
if ($days != 'all') {
$date_before = get_current_db_date_before($days);
$where .= " AND {$access_table}.date BETWEEN '$date_before' AND '$date' ".PHP_EOL;
}
if (is_ids_exist($exclude_post_ids)) {
$where .= " AND {$access_table}.post_id NOT IN(".implode(',', $exclude_post_ids).") ".PHP_EOL;
}
if (!is_numeric($limit)) {
$limit = 5;
}
//カテゴリーを指定する場合
if (is_ids_exist($cat_ids) || is_ids_exist($exclude_cat_ids)) {
$term_relationships = $wpdb->term_relationships;
$term_taxonomy = $wpdb->term_taxonomy;
$joined_table = 'terms_accesses';
//カテゴリー指定
if (is_ids_exist($cat_ids)) {
$cat_ids = implode(',', $cat_ids);
$where .= " AND {$term_taxonomy}.term_id IN ({$cat_ids}) ".PHP_EOL;
}
//除外カテゴリー指定
if (is_ids_exist($exclude_cat_ids)) {
//空の配列を取り除く
$exclude_cat_ids = array_filter($exclude_cat_ids, "is_numeric");
//カンマ区切りにする
$ex_cat_ids = implode(',', $exclude_cat_ids);
$ex_cat_ids = preg_replace('/,$/', '', $ex_cat_ids);
$where .= " AND {$term_relationships}.term_taxonomy_id NOT IN ({$ex_cat_ids}) ".PHP_EOL;
}
$where .= " AND {$term_taxonomy}.taxonomy = 'category' ".PHP_EOL;
$query = "
SELECT {$joined_table}.post_id, SUM({$joined_table}.count) AS sum_count, {$joined_table}.term_taxonomy_id, {$joined_table}.taxonomy
FROM (
#カテゴリーとアクセステーブルを内部結合してグルーピングし並び替えた結果
SELECT {$access_table}.post_id, {$access_table}.count, {$term_relationships}.term_taxonomy_id, {$term_taxonomy}.taxonomy
FROM {$term_relationships}
INNER JOIN {$access_table} ON {$term_relationships}.object_id = {$access_table}.post_id
INNER JOIN {$term_taxonomy} ON {$term_relationships}.term_taxonomy_id = {$term_taxonomy}.term_taxonomy_id
$where #WHERE句
GROUP BY {$access_table}.id
) AS {$joined_table} #カテゴリーとアクセステーブルを内部結合した仮の名前
GROUP BY {$joined_table}.post_id
ORDER BY sum_count DESC, post_id
";
//_v($query);
//1回のクエリで投稿データを取り出せるようにテーブル結合クエリを追加
$query = wrap_joined_wp_posts_query($query, $limit, $author, $post_type, $snippet);
// wrap_joined_wp_posts_query の内部ORDERを上書き(PV同率時に新しい投稿を優先)
$query = preg_replace(
'/ORDER BY\s+[^)]*$/i',
'ORDER BY sum_count DESC, wp_posts.post_date DESC',
$query
);
} else {
$query = "
SELECT {$access_table}.post_id, SUM({$access_table}.count) AS sum_count
FROM {$access_table} $where
GROUP BY {$access_table}.post_id
ORDER BY sum_count DESC, post_id
";
//1回のクエリで投稿データを取り出せるようにテーブル結合クエリを追加
$query = wrap_joined_wp_posts_query($query, $limit, $author, $post_type, $snippet);
// 同様に、post_dateで並び替えを補強
$query = preg_replace(
'/ORDER BY\s+[^)]*$/i',
'ORDER BY sum_count DESC, wp_posts.post_date DESC',
$query
);
}
$records = $wpdb->get_results( $query );
// var_dump($query);
// _v($records);
if (is_access_count_cache_enable() && $records) {
set_transient( $transient_id, $records, 60 * get_access_count_cache_interval() );
}
return $records;
}