Функция вывода записей по количеству просмотров - Web-Global: Связывая миры через веб-технологии

Функция вывода записей по количеству просмотров

19.02.2023 66
Поделиться:

Сегодня хочу поделится с вами очередной функцией вывода записей. Функция является прямым дополнением статьи «Считаем количество посещений страниц на WordPress без плагинов». В задачу функции входит вывод записей отсортированных по произвольному полю, в котором собирается количество просмотров каждого поста. Проще говоря, функция выводит самые просматриваемые записи блога/сайта на WordPress.

Однако, чтобы применить эту функцию для начала необходимо использовать код из статьи, ссылку на которую я дал выше, именно тот код будет считать количество посещений страницы и записывать их в произвольное поле, а функция из этой статьи будет выводить записи по этому произвольному полю, т.е. по наибольшему количеству просмотров.

Функция для вывода самых просматриваемых записей

/**
 * Функция для вывода записей по произвольному полю содержащему числовое значение.
 *
 * Пример вызова:
 *     kama_get_most_viewed( "num=5 &key=views &cache=1 &format={a}{title}{/a} - {date:j.M.Y} ({views}) ({comments})" );
 *
 * @param string $args {
 *
 *     @type string     $key    (views)  Ключ произвольного поля, по значениям которого будет проходить выборка.
 *     @type int|string $num    (10)     Количество постов или offset для пагинации - 10 или 20,10.
 *     @type string     $order  (desc)   Порядок вывода записей. Может быть: asc|desc.
 *     @type string     $format  ('')    Формат выводимых ссылок. По дефолту такой: ({a}{title}{/a}).
 *                                       Можно использовать, например, такой:
 *                                       {date:j.M.Y} - {a}{title}{/a} ({views}, {comments}).
 *     @type int        $days   (0)      Число последних дней, записи которых нужно вывести
 *                                       по количеству просмотров. Если указать год (2011,2010),
 *                                       то будут отбираться популярные записи за этот год.
 *     @type int        $cache  (0)      Использовать кэш или нет.  Варианты 1 - кэширование включено, 0 - выключено (по дефолту).
 *     @type string     $echo   (1)      Выводить на экран или нет. Варианты 1 - выводить (по дефолту), 0 - вернуть для обработки (return).
 *     @type string     $return (string) Может быть: string|array. Позволяет вернуть массив объектов постов, а не готовый HTML.
 * }
 *
 * @return bool|int|mixed|string
 *
 * @ver 1.2
 */
function kama_get_most_viewed( $args = '' ){
    global $wpdb, $post;

    parse_str( $args, $i );

    $num    = isset( $i['num'] )    ? preg_replace( '/[^0-9,\s]/', '', $i['num'] ) : 10; // 20,10 | 10
    $key    = isset( $i['key'] )    ? sanitize_text_field($i['key']) : 'views';
    $order  = isset( $i['order'] ) && in_array( strtoupper($i['order']), [ 'ASC', 1 ] )  ? 'ASC' : 'DESC';
    $days   = isset( $i['days'] )   ? (int) $i['days'] : 0;
    $format = isset( $i['format'] ) ? stripslashes( $i['format'] ) : '';
    $cache  = isset( $i['cache'] );
    $echo   = isset( $i['echo'] )   ? (int) $i['echo'] : 1;
    $return = isset( $i['return'] ) ? $i['return'] : 'string';

    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";
    }

    $esc_key = esc_sql( $key );

    $sql = "SELECT *, (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 = '$esc_key' $AND_days
        AND p.post_type = 'post'
        AND p.post_status = 'publish'
    ORDER BY views $order LIMIT $num";

    $posts = $wpdb->get_results( $sql );
    if( ! $posts )
        return false;

    if( 'array' === $return )
        return $posts;

    $out = $x = '';
    preg_match( '!{date:(.*?)}!', $format, $date_m );

    foreach( $posts as $pst ){

        $x = ( $x == 'li1' ) ? 'li2' : 'li1';

        if( $pst->ID == $post->ID )
            $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( [ '{a}', '{title}', '{/a}', '{comments}', '{views}' ], [ $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 )
        echo $out;
    else
        return $out;
}
/**
 * 1.2 - параметр return + небольшой рефакторинг
 * 1.1 - в num можно указывать offset
 */

Как обычно, этот код нужно поместить в ваш файл шаблона 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=90"); ?>
</ul>

На этом все.

Если появятся вопросы по ходу прочтения или при установке этой функции, комментарии на блоге как раз для них.

Быстро, а главное — недорого купить подписчиков в группу Телеграмм Вам поможет сервис Avi1.ru. На страницах данного сайта Вы можете также получить различные услуги по развитию страниц в данной социальной сети. При желании, Вам помогут опытные и квалифицированные специалисты технической поддержки сайта.