Сегодня хочу поделится с вами очередной функцией вывода записей. Функция является прямым дополнением статьи "Считаем количество посещений страниц на WordPress без плагинов". В задачу функции входит вывод записей отсортированных по произвольному полю, в котором собирается количество просмотров каждого поста. Проще говоря, функция выводит самые просматриваемые записи блога/сайта на WordPress.
Однако, чтобы применить эту функцию для начала необходимо использовать код из статьи Считаем количество посещений страниц на WordPress без плагинов, именно этот код будет считать количество посещений страницы и записывать их в произвольное поле, а функция из этой статьи будет выводить записи по этому произвольному полю, т.е. по наибольшему количеству просмотров.
Итак, знакомьтесь:
Функция для вывода самых просматриваемых записей:
/** Функция для вывода записей по произвольному полю содержащему числовое значение.
-------------------------------------
Параметры передаваемые функции (в скобках дефолтное значение):
num (10) - количество постов.
key (views) - ключ произвольного поля, по значениям которого будет проходить выборка.
order (DESC) - порядок вывода записей. Чтобы вывести сначала менее просматириваемые устанавливаем order=1
format(0) - Формат выводимых ссылок. По дефолту такой: ({a}{title}{/a}). Можно использовать, например, такой: {date:j.M.Y} - {a}{title}{/a} ({views}, {comments}).
days(0) - число последних дней, записи которых нужно вывести по количеству просмотров. Если указать год (2011,2010), то будут отбираться популярные записи за этот год.
cache (0) - использовать кэш или нет. Варианты 1 - кэширование включено, 0 - выключено (по дефолту).
echo (1) - выводить на экран или нет. Варианты 1 - выводить (по дефолту), 0 - вернуть для обработки (return).
Пример вызова: kama_get_most_viewed("num=5 &key=views &cache=1 &format={a}{title}{/a} - {date:j.M.Y} ({views}) ({comments})");
*/
function kama_get_most_viewed($args=''){
parse_str($args, $i);
$num = isset($i['num']) ? $i['num']:10;
$key = isset($i['key']) ? $i['key']:'views';
$order = isset($i['order']) ? 'ASC':'DESC';
$cache = isset($i['cache']) ? 1:0;
$days = isset($i['days']) ? (int)$i['days']:0;
$echo = isset($i['echo']) ? 0:1;
$format = isset($i['format']) ? stripslashes($i['format']):0;
global $wpdb,$post;
$cur_postID = $post->ID;
if( $cache ){ $cache_key = (string) md5( __FUNCTION__ . serialize($args) );
if ( $cache_out = wp_cache_get($cache_key) ){ //получаем и отдаем кеш если он есть
if ($echo) return print($cache_out); else return $cache_out;
}
}
if( $days ){
$AND_days = "AND post_date > CURDATE() - INTERVAL $days DAY";
if( strlen($days)==4 )
$AND_days = "AND YEAR(post_date)=" . $days;
}
$sql = "SELECT p.ID, p.post_title, p.post_date, p.guid, p.comment_count, (pm.meta_value+0) AS views
FROM $wpdb->posts p
LEFT JOIN $wpdb->postmeta pm ON (pm.post_id = p.ID)
WHERE pm.meta_key = '$key' $AND_days
AND p.post_type = 'post'
AND p.post_status = 'publish'
ORDER BY views $order LIMIT $num";
$results = $wpdb->get_results($sql);
if( !$results ) return false;
$out= '';
preg_match( '!{date:(.*?)}!', $format, $date_m );
foreach( $results as $pst ){
$x == 'li1' ? $x = 'li2' : $x = 'li1';
if ( (int)$pst->ID == (int)$cur_postID ) $x .= " current-item";
$Title = $pst->post_title;
$a1 = "<a href='". get_permalink($pst->ID) ."' title='{$pst->views} просмотров: $Title'>";
$a2 = "</a>";
$comments = $pst->comment_count;
$views = $pst->views;
if( $format ){
$date = apply_filters('the_time', mysql2date($date_m[1],$pst->post_date));
$Sformat = str_replace ($date_m[0], $date, $format);
$Sformat = str_replace(array('{a}','{title}','{/a}','{comments}','{views}'), array($a1,$Title,$a2,$comments,$views), $Sformat);
}
else $Sformat = $a1.$Title.$a2;
$out .= "<li class='$x'>$Sformat</li>";
}
if( $cache ) wp_cache_add($cache_key, $out);
if( $echo )
return print $out;
else
return $out;
}
Как обычно, этот код нужно поместить в ваш файл шаблона functions.php или в то место где будет использована эта функция. Если такого файла у вас нет, то его можно и даже нужно создать!
После того, как функция скопирована в functions.php её можно использовать. Как? Очень просто: открываете файл шаблона (темы) и в то место где нужно вывести список самых просматриваемых записей вызываете функцию (вставляете следующий код):
<ul>
<?php kama_get_most_viewed("num=10"); ?>
</ul>
где, num=10 — это указание сколько записей показывать в списке.
Это все, функция должна работать.
Расширенное использование
Те, кто заглянул в код функции, наверняка увидели вначале строчку "Параметры передаваемые функции" и догадались что функция то не простая, вывод можно немного настроить, а как это сделать я, конечно, сейчас расскажу.
Параметры, которые можно передать функции:
- num - количество выводимых ссылок в списке (постов). по умолчанию выводится 10;
- key - название ключа произвольного поля, по значениям которого будет проходить выборка. Так как в функции для подсчета просмотров используется ключ "Просмотров", то этот параметр по умолчанию равен "Просмотров".
- format - Формат выводимых ссылок. По умолчанию формат такой: {a}{title}{/a}. При изменении формата можно использовать, следующие шоткоды:
* {comments} - покажет колличество комментариев у статьи;
* {title} - заголовок статьи;
* {date:j.M.Y} - дата в формате j.M.Y (11.Апр.2010);
* {a} и {/a} - тег ссылки. Открывается и закрывается.
* {views} - число просмотров поста. - days - число последних дней, записи которых нужно вывести по количеству просмотров. Если указать год (2011,2010), то будут отбираться популярные записи за этот год.
- cache - использовать кэш или нет. Варианты 1 - кэширование включено, 0 - выключено (по дефолту). Кэш будет работать только совместно с плагинами кэширования запросов. По умолчанию кэширование отключено.
- echo - выводить на экран или возвращать для обработки. 1 - выводить на экран (по дефолту), 0 - вернуть для обработки (return).
Примеры использования
1. Нам нужно вывести список из 15 самых просматриваемых записей, при этом в списке нужно указать дату записи и количество просмотров. Реализуется так:
<ul>
<?php kama_get_most_viewed("num=15 &format={a}{title}{/a} - {date:j.M.Y} ({views}, {comments})"); ?>
</ul>
выведет список в формате: Заголовок статьи - 11.Апр.2010 (2300, 25) где, 2300 - просмотры, 25 - комментарии.
2. Если нужно изменить ключ произвольного поля, то добавляем в параметры &key=<название нового ключа>
<ul>
<?php kama_get_most_viewed("num=15 &format={a}{title}{/a} - {date:j.M.Y} ({views}, {comments}) &key=views"); ?>
</ul>
выведет список в формате: Заголовок статьи - 11.Апр.2010 (2300, 25). Выборка постов будет проходить по произвольному полю со значением "views".
3. Выведем 15 самых просматриваемых записей за последние 3 месяца (90 дней):
<ul>
<?php kama_get_most_viewed("num=15 &days=120"); ?>
</ul>
Пожалуй, это все.
Если появятся вопросы по ходу прочтения или при установке этой функции, комментарии на блоге как раз для них.
А пока, вопрос со своей стороны, - Задумался собрать обе эти функции и сделать плагин, нечто подобное wp-postviews. Только гораздо проще. Стоит ли стараться?
- Предыдущие по меткам
- Предыдущие записи
- Автоматическое растягивание поля (textarea) комментария ← 16.Июл.2010 // 4
- Перелинковка статей в WordPress (предыдущие записи из категории) ← 4.Май.2010 // 94
- Отключаем уведомления (пинги) на свои же посты ← 5 Июнь 2010 // 8
- Плагин для защиты от спама в комментариях WordPress ← 14 Июль 2010 // 80
- Автоматическое растягивание поля (textarea) комментария ← 16 Июль 2010 // 4
А зачем городить такое количество текста в function, если можно короче, и не менее функциональней - прямо в тему:
<?php $popular=new WP_Query('orderby=comment_count&showposts=7');?> <?php if ($popular->have_posts()):?> <ul> <?php while ($popular->have_posts()):$popular->the_post();?> <li><a href="<?php the_permalink();?>"><?php the_title();?></a> | <small>Опубликовано <?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' тому назад'; ?></small></li> <?php endwhile;?> </ul> <?php endif;?>А смотрится это так - смотрим в табе "Популярное".
Здесь записи выводятся по значению произвольного поля, которое ко всему прочему числовое и чтобы сделать правильную числовую сортировку я сделал так: (pm.meta_value+0) AS views.
Согласен, что можно сделать и через WP_Query (лучше get_posts()), но это сейчас, а когда я писал этот пост, тогда еще в параметрах WP_Query не была предусмотрена возможность указывать тип данных (число) для произвольных полей и соответственно запрос получался неправильный.
И опять же, этот нагорожденный код можно в functions.php сунуть или куда-нить в низ файла шаблона, а где нужен вывод одной строкой вызвать функцию. Получится аккуратно и нагляднее. Не люблю когда в шаблоне много кода - глаза мозолит.
Здравствуйте! Очень нравится ваша функция, еще раз огромное спасибо!
А как исключить категорию или наоборот выводить только из определенной категории посты?
Здравствуйте Кама. Спасибо большое за ваш сайт. Нахожу много полезного для себя. Он для меня как настольная книга.
У меня есть несколько вопросов к вашей функции:
1. Как в вашей функции выводить имя автора?
2. Вывожу список записей через таблицу. в файле function.php ваш код вывода изменил на
, а на странице архива вывод наиболее просматриваемых записей за сегодня сделал
<?php kama_get_most_viewed("num=100&days=1&format=<td>{date:d.m.Y}</td><td class='autorarchive'>{a}{title}{/a}</td><td>{views}</td><td>{comments}</td>"); ?>На странице архива у меня выводит только одно сообщение, хотя просматривал разные. В чем может быть причина?
3. Каким образом, используя вашу функцию, можно вывести числовую статистику - просмотров за сегодня - (20) например.
Очень жду на ваш совет
Спасибо.
Уточню по 3 вопросу. Количество просмотров необходимо общее по всем статьям за определенный период.
Было бы очень полезным добавить параметр, определяющий принадлежность выводимых постов к категории, например, вывести самые просматриваемые записи из категории (cat=ID или slug или name)
Возможно я что-то упустил, есть такая возможность на данный момент?
Спасибо, работает! Очипятка: в 63-й строке кода лишняя буковка "n" затесалась:
Спасибо за поправку!
Здравствуйте, а как можно склонять месяцы? при таком выводе:
Чтоб было не так: 4 Март 2012, 15:03, а так 4 марта 2012, 15:03
В блоге использую плагин для русского вывода времени, можно ли их подружить?
Плагин "TheRussianDate", вызывается так:
Спасибо))
Вообще, функция дружит вроде с плагином: http://mywordpress.ru/plugins/russian-date/ или нет, по коду должна!
Собралась вывести самые читаемые записи за последний месяц и обнаружила, что функция выводит только статьи, опубликованные в последний месяц, естественно с количеством просмотров.
Если за месяц опубликовано, например, 2 статьи, то выводит только 2.
А хотелось, чтобы выводились 10, самых читаемых в этом месяце.
Может я что то не учла?
Выводила так:
kama_get_most_viewed("num=10 &days=30 &format={a}{title}{/a} Просм. {views} раз. Коммент. {comments}");
Пробовал пользоваться разными плагинами, но пришлось отказаться из-за нагрузки на сервер.
Воспользовался вашей функцией + вывел популярные записи в виджете в админ панели для себя/статистики.
Отлично получилось, большое спасибо!