Функція виведення постів за кількістю коментарів
З версії WordPress 2.8 функцію можна замінити дивіться параметр orderby у get_posts(“orderby=comment_count”)
Ще одна функція про виведення постів. На цей раз функція розрахована на виведення постів за кількістю коментарів.
Вирішив написати цю функцію, тому що аналога в мережі, що повністю задовольняє мені, знайти я не зміг. Втім, я і не шукав старанно – легше свій велосипед зробити, він серцю ближче .
Функції, які пропонуються в мережі, то не зовсім правильні, то зовсім неправильні або незручні, або це взагалі плагін . Не зовсім правильні, тому що реалізація запиту до БД розраховані на старі версії WordPress, де поля comment_count в таблиці wp_posts ще, мабуть, не було передбачено, від чого запит виходить громіздким. Наприклад, такий запит робиться в цьому прикладі.
Загалом, ось функція, яка в мене вийшла і вставляти яку потрібно у файл теми functions.php або у той файл теми, де вона використовуватиметься:
/* Функція для виведення постів за кількістю коментарів -------------------------------------------------- ------ Параметри функції (у дужках вказано дефолтне значення): post_num (5) = кількість посилань format ('') = {date:jMY} - {a}{title}{/a} ({comments}) $days (0) = протягом останніх n днів. Приклад: $days=30 виведе посади за останні 30 днів. Або вказуємо рік, за який потрібно вивести коментарі. Приклад:2009 cache ('') = увімкнути кеш (за замовчуванням вимкнено), вказуємо 1, щоб увімкнути $post_type ('post') = тип записів --- Викликаємо функцію приблизно так: <?php echo kama_most_commented_posts(10, '{a}{title}{/a} <sup>{comments}</sup>', 0, 31); ?> */ function kama_most_commented_posts($post_num=10, $format='', $days=0, $cache='', $post_type='post'){ Global $wpdb; if( $cache ){ $key = (string) md5( $post_num . $format . $days . $post_type ); if ( $cache_out = wp_cache_get($key, __FUNCTION__) ) return $cache_out; } if($days){ $AND_days = "AND post_date > CURDATE() - INTERVAL $days DAY"; if(strlen($days)==4) $AND_days = "AND YEAR(post_date)=" . trim($days); } $sql = "SELECT ID, post_title, post_date, comment_count, guid FROM $wpdb->posts p WHERE post_status = 'publish' AND post_type = '$post_type' $AND_days ORDER BY comment_count DESC". ($post_num ? " LIMIT $post_num" : ''); $res = $wpdb->get_results($sql); if(!$res) return false; // Формування висновку if( $format ) preg_match ('!{date:(.*?)}!', $format, $date_m); foreach ($res as $pst){ if($pst->comment_count==0) continue; $x == 'li1'? $x = 'li2': $x = 'li1'; $title = esc_attr($pst->post_title); $a = "<a href='". get_permalink($pst->ID) ."' title='$title'>"; $Sformat = "$a$title ($pst->comment_count)</a>"; if($format){ $ replacement = array( '{title}' => $title ,'{a}' => $a ,'{/a}' => '</a>' ,'{comments}' => $pst->comment_count ); if($date_m) $replacement[$date_m[0]] = apply_filters('the_time', mysql2date($date_m[1], $pst->post_date)); $Sformat = strtr($format, $replacement); } $out .= "<li class='$x'>$Sformat</li>"; } if( !$out ) return "<li>Немає записів із коментарями</li>"; if($cache) wp_cache_add($key, $out, __FUNCTION__); return $out; }
Після того, як функція успішно встановлена у functions.php, її потрібно викликати так:
<ul> <?php echo kama_most_commented_posts(10); ?> </ul>
В результаті ми отримаємо список (оформлений у HTML теги li) з 10 посилань на пости з найбільшою кількістю коментарів. Якщо замість 10 поставити 0, то будуть виведені всі коментарі, без обмеження (може стати в нагоді, якщо обмежувати висновок за роком)
Розширені налаштування функції виведення постів за кількістю коментарів
Встановлюємо формат виводу
Другим параметром функції можна передати формат виводу, наприклад:
<ul> <?php echo kama_most_commented_posts(10, '{a}{title}{/a} <sup>{comments}</sup> ? {date:jMY}'); ?> </ul>
Виведе список посилань у такому форматі:
- Назва статті 25 ? 25 листопада 2010
- Назва іншої статті 12 ? 23 жовтня 2010
Так виглядатиме в HTML коді:
<ul> <li><a href="УРЛ">Назва статті</a> <sup>25</sup> ? 25 листопада 2010 року</li> <li><a href="УРЛ">Назва іншої статті</a> <sup>12</sup> ? 23 жовтня 2010 року</li> </ul>
Як форматувати дату можна переглянути на цій сторінці кодексу WordPress.
Обмежуємо вибірку коментованих постів кількістю днів або виводимо по року
Якщо нам потрібно вивести коментовані пости за, припустимо, останні 60 днів, то викликаємо функцію так:
<ul> <?php echo kama_most_commented_posts(10, '', 60); ?> </ul>
Якщо потрібно вивести посади, наприклад, за 2009 рік, то викликаємо так:
<ul> <?php echo kama_most_commented_posts(0, '', 2009); ?> </ul>
Включаємо кеш
Якщо використовуються плагіни кешування запитів, сумісні зі стандартним кешем WordPress, то встановлюємо четвертий параметр функції, ставимо 1 :
<ul> <?php echo kama_most_commented_posts(10, '', 0, 1); ?> </ul>
Тепер, висновок функції кешуватиметься
Вибираємо який тип найкоментованіших записів ми хочемо вивести
Припустимо, нам потрібно вивести найкоментованіші сторінки (не пости) або у нас є тип записів, відмінний від постів (post), скажімо, newpost_type. Тип записів за яким буде проходити вибірка задається в останньому параметрі:
<ul> <?php echo kama_most_commented_posts(10, '', 30, 0, 'newpost_type'); ?> </ul>
Запитання?