Я только что создал две сводные страницы для двух своих блогов: https://helloacm.com/archives-of-pagesposts/ и http://www.codingforspeed.com/archives-of-pagesposts/.
На обеих страницах все статьи (включая страницы) отсортированы по месяцам. Количество комментариев к каждому сообщению будет подсчитано и напечатано после заголовка сообщения в скобках.
Это может быть полезно для перечисления всех статей/страниц для пользователей и поисковых систем, поэтому эта страница также служит картой сайта.
Как вы можете видеть на сводной странице, сначала выводится общее количество сообщений/страниц, а для каждого месяца (только если в этом месяце опубликовано хотя бы одно сообщение/страница) будут генерироваться ссылки с отступом.
Итак, как мы собираемся этого добиться? Прежде всего, в WordPress вам понадобятся некоторые плагины, чтобы иметь возможность включать PHP-код в записи/страницы. Перейдите в панель управления WordPress после входа в систему и перейдите к «Плагины» и «Добавить новый». Найдите «Включить PHP», и вы найдете множество вариантов.
Затем скопируйте и вставьте следующий код PHP в один файл PHP в корневом каталоге темы.
// <a class="vglnk" target="_blank" href="http://helloacm.com" rel="nofollow"><span>helloacm</span><span>.</span><span>com</span></a>
global $wpdb;
$query = "select count(1) from `wp_posts` where (post_type = 'page' or post_type = 'post') and `post_status` = 'publish'";
$total = $wpdb->get_var($query);
echo "<h2>Archives</h2>";
$query = "select concat(year(`post_date`), '-', month(`post_date`)) as `month`, count(1) as `cnt` from `wp_posts` where (post_type='page' or post_type='post') and `post_status` = 'publish' group by `month` order by `post_date` desc";
$result = $wpdb->get_results($query);
echo "<ul>";
if ($result) {
foreach ($result as $month) {
echo "<li>".$month->month." (".$month->cnt.")</li>";
$m = explode('-', $month->month);
$y = $m[0];
$m = $m[1];
$q = "select `post_name`, `post_title`, day(`post_date`) as `day`, `id` from `wp_posts` where (post_type='page' or post_type='post') and `post_status` = 'publish' and month(`post_date`)='$m' and year(`post_date`)='$y' order by `post_date` desc";
$r = $wpdb->get_results($q);
if ($r) {
echo "<ul>";
foreach ($r as $post) {
$cnt = $wpdb->get_var("select count(1) from `wp_comments` where `comment_approved`=1 and `comment_post_ID` = ".$post->id);
if (!$cnt) $cnt = 0;
echo "<li>".$post->day.": <a title='".htmlentities($post->post_title, ENT_QUOTES)."' href='<a class="vglnk" target="_blank" href="https://helloacm.com/".$post-" rel="nofollow"><span>https</span><span>://</span><span>helloacm</span><span>.</span><span>com</span><span>/".$</span><span>post</span><span>-</span></a>>post_name."/'>".$post->post_title."</a> ($cnt)</li>";
}
echo "</ul>";
}
}
}
echo "</ul>";
Алгоритм здесь состоит в том, чтобы сгруппировать по годам и месяцам в SQL и зациклить каждый месяц и получить все сообщения/страницы за этот месяц. Используйте глобальную переменную $wpdb для запуска оператора SQL. Используйте get_var для операторов SQL с одной переменной, таких как select count(1), и используйте get_results для нескольких строк.
Измените имя таблицы wordpress wp_posts, если префикс не wp_. Однако вы можете использовать $wpdb->posts для получения имени таблицы сообщений, что является лучшим методом. Отфильтруйте сообщения/страницы, соответствующим образом изменив соответствующие операторы SQL (где причина).
Кроме того, лайки в Facebook учитываются и также включаются в скобки. Для этого вам нужно будет создать еще одну таблицу с парой ключей для идентификатора статьи и числа лайков. Вам нужно будет настроить crontab, который запускается, возможно, один раз в час, чтобы обновлять количество лайков в Facebook (или других социальных сетях) для каждого сообщения. Об этом будет рассказано в другом отдельном уроке.