Algumas vezes, desenvolvendo alguns dos meus projetos eu me deparava com essa necessidade de criar uma listagem de mais visualizados. Mas eu não queria só instalar um plugin para isso, então pensando nisso hoje eu vou mostrar para vocês como criar uma listagem de posts mais visualizados sem plugin.
Primeiramente você ter que abrir o arquivo functions.php e aplicar a função abaixo, para criar o campo personalizado “post_views_count“.
“Mas lembrando que ele só vai criar a listagem correta dos post mais acessados a partir da data da aplicação dessa função, os acessos passados não vão ser contados…”
<?php | |
/* | |
* Set post views count using post meta | |
*/ | |
function chr_setPostViews($postID) { | |
$countKey = 'post_views_count'; | |
$count = get_post_meta($postID, $countKey, true); | |
if($count==''){ | |
$count = 0; | |
delete_post_meta($postID, $countKey); | |
add_post_meta($postID, $countKey, '0'); | |
return 'Nenhuma Visualização'; | |
}elseif( is_single($postID) ){ | |
$count++; | |
update_post_meta($postID, $countKey, $count); | |
} | |
return $count . ' Visualização(ões)'; | |
} |
Essa função é a responsável por criar o nosso “input personalizado” que vai receber a quantidade de acessos que o post recebeu e também que será feito o nosso filtro. Mas para que fique mais fácil a visualização da quantidade de acesso, que o post recebeu eu vou aplicar na listagem dos post’s do nosso wp-admin uma nova coluna que vai ficar melhor a visualização:
<?php | |
/** | |
* Add a new column in the wp-admin posts list | |
*/ | |
function chr_posts_column_views( $defaults ) { | |
$defaults['post_views'] = __( 'Visualização(ões)' ); | |
return $defaults; | |
} | |
/** | |
* Display the number of views for each posts | |
*/ | |
function chr_posts_custom_column_views( $column_name, $id ) { | |
if ( $column_name === 'post_views' ) { | |
echo chr_setPostViews( get_the_ID() ); | |
} | |
} | |
add_filter( 'manage_posts_columns', 'chr_posts_column_views' ); | |
add_action( 'manage_posts_custom_column', 'chr_posts_custom_column_views', 5, 2 ); |
Agora vamos para a aplicação da função que é a responsável pela “contagem” de acesso que a na nossa single receberá, eu como exemplo vou colocar a single.php do meu framework favorito que é o Odin para exemplificar:
<?php | |
/** | |
* The Template for displaying all single posts. | |
* | |
* @package Odin | |
* @since 2.2.0 | |
*/ | |
get_header(); ?> | |
<main id="content" class="<?php echo odin_classes_page_sidebar(); ?>" tabindex="-1" role="main"> | |
<?php | |
// Function for account how many access this post has | |
chr_setPostViews( get_the_ID() ); | |
// Start the Loop. | |
while ( have_posts() ) : the_post(); | |
/* | |
* Include the post format-specific template for the content. If you want to | |
* use this in a child theme, then include a file called content-___.php | |
* (where ___ is the post format) and that will be used instead. | |
*/ | |
get_template_part( 'content', get_post_format() ); | |
// If comments are open or we have at least one comment, load up the comment template. | |
if ( comments_open() || get_comments_number() ) : | |
comments_template(); | |
endif; | |
endwhile; | |
?> | |
</main><!-- #main --> | |
<?php | |
get_sidebar(); | |
get_footer(); |
Vocês vão ver que eu apliquei a função na linha 12 junto com o get_the_ID() para retornar o ID do post dentro da nossa função.
chr_setPostViews( get_the_ID() );
Sem essa função na nossa single.php o contador de visualização não vai funcionar corretamente, porque é ela que “multiplica”e “atualiza” a quantidade de acesso que o post recebeu.
Agora vamos para a parte de criar o nosso WP_Query personalizado, para gerar a nossa listagem, com o post’s mais acessados:
<?php | |
// WP_Query arguments | |
$args = array( | |
'post_type' => array( 'post' ), | |
'post_status' => array( 'publish' ), | |
'orderby' => 'meta_value_num', | |
'meta_key' => 'post_views_count', | |
'order' => 'DESC', | |
'ignore_sticky_posts' => 1, | |
'posts_per_page' => '4', | |
); | |
// The Query | |
$query_trending = new WP_Query( $args ); | |
$count = 0; | |
// The Loop | |
if ( $query_trending->have_posts() ) { | |
echo ' | |
<article id="box-trending" class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> | |
<h5 class="text-center">Trending</h5> | |
<dl>'; | |
while ( $query_trending->have_posts() ) { $query_trending->the_post(); $count ++; | |
echo ' | |
<dd title="' . get_the_title() . ' ('. chr_setPostViews( get_the_ID() ) .')"> | |
<span>' . $count . '.</span><h6><a href="' . get_permalink() . '" title="' . get_the_title() . '">' . wp_trim_words( get_the_title(), 6, '...' ) . '</a></h6> | |
</dd>'; | |
} | |
} else { | |
echo '<dd>No posts viewed...</dd>'; | |
} | |
echo '</dl> | |
</article> | |
'; | |
// Restore original Post Data | |
wp_reset_postdata(); |
Nesse WP_Query eu trabalhei com os atributos padrões para um loop a partir de post publicados, mas eu adicionei os argumentos meta_key e orderby.
No meta_key eu “chamei” o nome do nosso campo personalizado “post_views_count“ que criamos para esse tutorial e uma ordenação por “meta_value_num“ que ele irá visualizar os números de acesso e aplicar uma ordenação decrescente do mais à menos acessados.
Agora, abaixo vocês podem ver como irá ficar a nossa função aplicada e com um estilo aplicado:
Espero que vocês tenham gostado desse tutorial e até breve ?
Por favor, se você gostou deixe seu like e também se possível compartilhe.