Функция отображения постов по просмотрам в WordPress: примеры и параметры

## Функция для отображения постов по количеству просмотров

Сегодня я хочу поделиться с вами функцией, которая поможет отображать посты на вашем сайте. Эта функция является дополнением к статье "Подсчет просмотров страниц на WordPress без плагинов". С помощью этой функции можно выводить посты, отсортированные по количеству просмотров, то есть показывать самые просматриваемые посты на вашем блоге.

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

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

```php
/**
 * Функция для отображения постов на основе специального поля с числовым значением.
 *
 * Пример использования:
 *     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)     Количество постов для отображения. Например, 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 - вернуть для обработки.
 *     @type string     $return (string) Может быть: string|array. Позволяет вернуть массив объектов постов вместо готового HTML.
 * }
 *
 * @return string|array В зависимости от аргумента return.
 */
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'] ) && ( strtoupper( $i['order'] ) === 'ASC' ) ? '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 = md5( __FUNCTION__ . serialize( $args ) );

        if( $cache_out = wp_cache_get( $cache_key ) ){
            if( $echo ){
                return print( $cache_out );
            }

            return $cache_out;
        }
    }

    $AND_days = $days ? "AND post_date > CURDATE() - INTERVAL $days DAY" : '';
    if( 4 === strlen( $days ) ){
        $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       = '";
        $a2       = '';
        $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 .= "
  • $Sformat
  • "; } if ( $cache ) { wp_cache_add( $cache_key, $out ); } if ( $echo ) { echo $out; } return $out; }

    Как обычно, вам нужно вставить этот код в файл functions.php вашей темы или в то место, где вы хотите использовать эту функцию. Если у вас нет такого файла, вы можете создать его!

    После того, как функция будет скопирована в functions.php, вы сможете её использовать. Как это сделать? Очень просто: откройте файл шаблона и в том месте, где хотите отобразить список самых просматриваемых постов, вставьте следующий код:

    Здесь num=10 — это количество постов, которые нужно показать в списке.

    Всё готово, функция должна работать!

    Расширенное использование

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

    Параметры функции

    • num — количество ссылок (постов) для отображения в списке. По умолчанию отображается 10.
    • key — название ключа специального поля, по которому будет происходить выборка. Так как в функции для подсчета просмотров используется ключ "views", по умолчанию этот параметр равен "views".
    • format — формат отображаемых ссылок. По умолчанию формат: {a}{title}{/a}. Изменяя формат, можно использовать следующие короткие коды:
      • {comments} — отображает количество комментариев к статье;
      • {title} — заголовок статьи;
      • {date:j.M.Y} — дата в формате j.M.Y (например, 11.Apr.2010);
      • {a} и {/a} — теги для ссылки. Открывают и закрывают ссылку;
      • {views} — количество просмотров поста.
    • days — количество дней, за которые нужно отображать посты на основе количества просмотров. Если указан год (например, 2011, 2010), будут выбраны популярные посты за этот год.
    • cache — использовать кэш или нет. Опции: 1 — кэширование включено, 0 — отключено (по умолчанию).
    • echo — отображать на экране или возвращать для дальнейшей обработки. 1 — отображение на экране (по умолчанию), 0 — возврат для обработки.

    Примеры использования

    1. Список из 15 самых просматриваемых постов

    В этом случае в списке должна отображаться дата поста и количество просмотров. Реализуется следующим образом:

    В результате будет показан список в формате: Заголовок статьи - 11.Apr.2010 (2300, 25), где 2300 — количество просмотров, 25 — количество комментариев.

    2. Изменение ключа специального поля

    Чтобы изменить ключ, добавьте &key=<новое название ключа> к параметрам:

    Это также покажет список в формате: Заголовок статьи - 11.Apr.2010 (2300, 25). Посты будут отобраны по специальному полю с именем "views".

    3. Отображение 15 самых просматриваемых постов за последние 3 месяца (90 дней):

    Завершение

    Если у вас возникли какие-либо вопросы во время прочтения или установки этой функции, комментарии под статьей — это отличное место для их обсуждения!

    Leave a Reply

    Ваш адрес email не будет опубликован. Обязательные поля помечены *