photomuza
SMYK писал:
Если вариант рабочий, то, конечно интересно взглянуть.
Вариант БЕЗ плагина WP-PostViews. Вставляем в function.php
/* Подсчет количества посещений страниц
---------------------------------------------------------- */
add_action('wp_head', 'kama_postviews');
function kama_postviews() {
/* ------------ Настройки -------------- */
$meta_key = 'views'; // Ключ мета поля, куда будет записываться количество просмотров.
$who_count = 0; // Чьи посещения считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированых пользователей.
$exclude_bots = 1; // Исключить ботов, роботов, пауков и прочую нечесть
? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета.
$url_no_count = '/gall/'; // не считать переходы с галерей на пост
$refurl=$_SERVER['HTTP_REFERER']; // реф для проверки предыд. переменной
/* СТОП настройкам */
global $user_ID, $post;
if(is_singular()) {
$id = (int)$post->ID;
static $post_views = false;
if($post_views) return true; // чтобы 1 раз за поток
$post_views = (int)get_post_meta($id,$meta_key, true);
$should_count = false;
switch( (int)$who_count ) {
case 0: $should_count = true;
break;
case 1:
if( (int)$user_ID == 0 )
$should_count = true;
break;
case 2:
if( (int)$user_ID > 0 )
$should_count = true;
break;
}
if( (int)$exclude_bots==1 && $should_count ){
$useragent = $_SERVER['HTTP_USER_AGENT'];
$notbot = "Mozilla|Opera"; //Chrome|Safari|Firefox|Netscape - все равны Mozilla
$bot = "Bot/|robot|Slurp/|yahoo"; //Яндекс иногда как Mozilla представляется
if ( !preg_match("/$notbot/i", $useragent) || preg_match("!$bot!i", $useragent) || (stripos($refurl,$url_no_count))>0)
$should_count = false;
}
if($should_count)
if( !update_post_meta($id, $meta_key, ($post_views+1)) ) add_post_meta($id, $meta_key, 1, true);
}
return true;
}
// yacc - РЕЙТИНГ
/*
Эти константы опрделяют названия полей (Custom Fields) поста.
POST_VIEWS Количество просмотров постов.
HTML_VIEWS Сумма просмотров html-ов к посту.
POST_RATING Ратио.
Если менять, то именно здесь.
*/
define( 'POST_VIEWS', 'views' );
define( 'HTML_VIEWS', 'html_views' );
define( 'POST_RATING', 'post_rating' );
/*
Обработчик Ajax-запросов.
Выполняет основную задачу - считает HTML_VIEWS и POST_RATING.
Чтобы отключить закомментируй оба add_action ниже.
*/
add_action( 'wp_ajax_yacc_process', 'yacc_process' );
add_action( 'wp_ajax_nopriv_yacc_process', 'yacc_process' );
function yacc_process() {
// $_POST[ 'pid' ] обязательный параметр - ID поста
if( isset( $_POST[ 'pid' ] ) ) {
$pid = $_POST[ 'pid' ];
// Если поля POST_VIEWS ещё нет.
// Обрати внимание, что с само поле никак не изменяется.
// Но нужно установить $post_views для подсчёта ратио.
if( '' === ( $post_views = get_post_meta( $pid, POST_VIEWS, TRUE ) ) )
$post_views = 0;
// Если поле HTML_VIEWS уже есть.
if( '' !== ( $html_views = get_post_meta( $pid, HTML_VIEWS, TRUE ) ) ) {
// Обновить HTML_VIEWS = HTML_VIEWS + 1
update_post_meta( $pid, HTML_VIEWS, ++$html_views );
// Обновить POST_RATING = HTML_VIEWS / POST_VIEWS
update_post_meta( $pid, POST_RATING, $html_views / $post_views );
}
// Если поля HTML_VIEWS ещё нет.
else {
// Добавить поле HTML_VIEWS = 1
add_post_meta( $pid, HTML_VIEWS, 1, TRUE );
// Добавить поле POST_RATING = POST_VIEWS
// На самом деле это нужно только для старых постов,
// для всех вновь создаваемых это поле будет создаваться автоматически.
add_post_meta( $pid, POST_RATING, $post_views, TRUE );
}
}
}
/*
Подключение обработчика мета боксов в форме редактирования поста в админке.
Нужно для создания поля POST_RATING.
*/
add_action( 'add_meta_box', 'yacc_add_field' );
function yacc_add_field() {
if( '' === ( $html_views = get_post_meta( $pid, HTML_VIEWS, TRUE ) ) )
add_post_meta( $pid, POST_RATING, $post_views, TRUE );
}
/*
Подключение обработчика обновления/изменения поля POST_VIEWS.
Нужно для обновления поля POST_RATING.
При каждом обновлении любого поля юбого поста будет выполнятся функция yacc_update_rating,
которой будут переданы 4 параметра:
$mid ID поля (не используется)
$pid ID поста
$key название поля
$value содержимое поля
Если это будет поле с названием, определённым константой POST_VIEWS,
то ратио поста (с ID = $pid) будет обновлено: пересчитано и сохранено.
*/
add_action( 'updated_post_meta', 'yacc_update_rating', 10, 4 );
function yacc_update_rating( $mid, $pid, $key, $value ) {
if( POST_VIEWS == $key AND '' !== ( $html_views = get_post_meta( $pid, HTML_VIEWS, TRUE ) ) AND 0 !== $html_views )
update_post_meta( $pid, POST_RATING, $html_views / $value );
}
/*
Выводит список заголовков постов, упорядоченных по POST_RATING.
*/
function yacc_top_posts( $count = 10 ) {
global $wpdb;
$q = new WP_Query(
array(
'posts_per_page' => $count,
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_key' => POST_RATING
)
);
if( $q->have_posts() ) {
echo '<ul>';
while( $q->have_posts() ) {
$q->the_post();
$id = get_the_ID();
echo '<li><a href="'.get_permalink( $id ).'">'.get_the_title().'</a> | '
.get_post_meta( $id, HTML_VIEWS, 1 ).' / '
.get_post_meta( $id, POST_VIEWS, 1 ).' = '
.round(yacc_rating( $id ),3)
.'</li>';
}
echo '</ul>';
}
else {
echo '<h2>No posts found</h2>';
}
}
function yacc_rating( $pid, $d = 1 ) {
if( '' === ( $post_rating = get_post_meta( $pid, POST_RATING, TRUE ) ) )
$post_rating = 0;
return $post_rating / $d;
}
В HTML-ы где отображается большое фото вставляем перед </head> (нужно вставить урл бога и var pid = ID поста):
<!-- yacc -->
<script src="http://YOUR_BLOG.com/wp-includes/js/jquery/jquery.js"></script>
<script>
jQuery(document).ready( function yacc_ajax() {
var pid = ЗДЕСЬ_ДОЛЖЕН_БЫТЬ_ID_ПОСТА
jQuery.ajax({
type: 'POST',
url: 'http://' + window.location.host + '/wp-admin/admin-ajax.php',
data: { action: 'yacc_process', pid: pid }
})
})
</script>
<!-- end yacc -->>
Мои добавки и пояснения по 1-му коду(они уже в коде).
Строка
.round(yacc_rating( $id ),3)
До этого была строка
.yacc_rating( $id )
Округление до 3 цифр после запятой. Т.е. вместо 1,33333333 будет 1,333
Добавил (/gall/ заменить на нужное)
Код:
$url_no_count = '/gall/'; // не считать переходы с галерей на пост
$refurl=$_SERVER['HTTP_REFERER']; // реф для проверки предыд. переменной
и соотв.
Код:
|| (stripos($refurl,$url_no_count))>0)
Это фильтр подсчета постов (т.е. с урла в котором есть /gall/): переход с HTML поста на сам пост не засчитывается, т.к. юзер может кликать туда-сюда с целью выбора превью, и если эти просмотры поста считать, его ратио будет снижаться, что нелогично.
У меня урлы галь такие: хттп://domain.com
/gall/name-gallery/01.html Т.е. вам для фильтра следует задать значение переменной
$url_no_count соотв. вашим урлам.