WordPress記事の閲覧数を保存&管理画面で閲覧数を確認できるようにする方法。プラグインなし!
前もって言っておくと、本記事で実装する機能は、プラグインを使えば簡単に実装できる。
プラグイン使用でOKって人は「WP-PostViews」などがシンプルで使いやすい(有効化するだけで使えたはず)。
けど、この機能、結構シンプルじゃないですか。
シンプルな機能のためだけにプラグイン入れるのもなぁって気がしません?プラグイン入れると重くなったりするし。
たった数行コードを書くだけでOKだったら、そっちの方がいい気がしません?と僕は思ったので、プラグインは無しで実装しました。
【やりたいこと】
記事の閲覧数をWP管理画面で見れるようにして、
閲覧数順に並び替えしたい
目次
- 結論
- 解説① 閲覧数を保存する関数を定義
- 解説② 管理画面の投稿一覧に閲覧数用のカラムを追加
- 解説③ 閲覧数用のカラムに、実際の閲覧数を表示させる
- 解説④ 追加したカラムにソート(並び替え機能)を追加
- 解説⑤ ソートに利用するキーに「閲覧数」を使用するに設定
結論
まず、結論。実装だけしたい人は、functions.phpに下記コードを追加するだけでOK。
// 閲覧数の保存する関数を定義
function update_views() {
global $post;
if ( 'publish' === get_post_status( $post ) && is_single() ) {
$views = intval( get_post_meta( $post->ID, 'views', true ) );
update_post_meta( $post->ID, 'views', ( $views + 1 ) );
}
}
add_action( 'wp_head', 'update_views' );
// 管理画面の投稿一覧に閲覧数用のカラムを追加
function add_column( $defaults ) {
$defaults['view_column'] = '閲覧数';
return $defaults;
}
add_filter('manage_posts_columns', 'add_column');
// 閲覧数用のカラムに、実際の閲覧数を表示させる
function add_column_id($column_name, $id) {
global $post;
if ($column_name == 'view_column') {
$view_column = get_post_meta( $post->ID, 'views', true );
echo $view_column;
}
}
add_action('manage_posts_custom_column', 'add_column_id', 10, 2);
// 追加したカラムにソート(並び替え)機能を追加
function my_add_sort($columns){
$columns['view_column'] = 'my_sort';
return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'my_add_sort');
// ソートに利用するキーに「閲覧数」を使用するように設定
function my_add_sort_by_meta( $query ) {
if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {
switch( $orderby ) {
case 'my_sort':
$query->set( 'meta_key', 'views' );
$query->set( 'orderby', 'meta_value_num' );
break;
}
}
}
add_action( 'pre_get_posts', 'my_add_sort_by_meta', 1 );
以下、それぞれやってることの解説。
解説① 閲覧数の保存する関数を定義
function update_views() {
global $post;
if ( 'publish' === get_post_status( $post ) && is_single() ) {
$views = intval( get_post_meta( $post->ID, 'views', true ) );
update_post_meta( $post->ID, 'views', ( $views + 1 ) );
}
}
add_action( 'wp_head', 'update_views' );
- 関数
update_views
の定義
この関数は、記事の閲覧数を更新するために使用している。関数内でグローバル変数$post
を参照している。 if ( 'publish' === get_post_status( $post ) && is_single() ) { ... }
この条件分岐は、現在の記事のステータスが「公開」(publish)であり、かつシングルページ表示(個別記事ページ)の場合に限り、閲覧数を更新するように制限している。$views = intval( get_post_meta( $post->ID, 'views', true ) );
この行では、現在の記事の閲覧数を取得している。記事のメタデータからviews
キーを使って、閲覧数の情報を取得し、整数型に変換して$views
変数に格納している。update_post_meta( $post->ID, 'views', ( $views + 1 ) );
この行では、取得した閲覧数に1を加算し、その値を記事のメタデータにviews
キーとして保存している。これにより、記事の閲覧数が更新されるようになる。add_action( 'wp_head', 'update_views' );
この行では、wp_head
アクションフックを使って、update_views
関数を登録している。
これにより、テーマの<head>タグ内でwp_head()
関数が呼び出された際に、update_views
関数が実行される=ページが読み込まれるたびに、記事の閲覧数が更新される仕組みになっている。
- 関数
このコードを使用することで、記事の閲覧数を追跡・更新することができるようになる。
解説② 管理画面の投稿一覧に閲覧数用のカラムを追加
// 管理画面の投稿一覧に閲覧数用のカラムを追加
function add_column( $defaults ) {
$defaults['view_column'] = '閲覧数';
return $defaults;
}
add_filter('manage_posts_columns', 'add_column');
- 関数
add_column
の定義
この関数は、管理画面の投稿一覧に新しいカラムを追加するために使用される。引数として$defaults
を受け取っている。この$defaults
は、投稿一覧のカラムを表す連想配列。 $defaults['view_column'] = '閲覧数';
この行では、連想配列$defaults
に新しい要素を追加している。キーをview_column
と設定(「解説③」で説明する関数の中でこのキーを利用する)。これにより、投稿一覧に新しいカラム「閲覧数」が追加される。return $defaults;
この行では、新しいカラムを追加した連想配列$defaults
を返している。これにより、WordPressの投稿一覧画面が更新され、新しいカラムが表示される。add_filter('manage_posts_columns', 'add_column');
この行では、manage_posts_columns
フィルターフックを使って、add_column
関数を登録している。これにより、WordPressが投稿一覧のカラムを生成する際に、add_column
関数が実行される。
結果として、投稿一覧画面に新しいカラム「閲覧数」が追加される。
- 関数
このコードを使用することで、WordPressのオリジナルテーマ開発者は、管理画面の投稿一覧に「閲覧数」カラムを追加し、各投稿の閲覧数を一覧表示することができる。
ただし、このコードはカラムの追加のみを行っており、実際の閲覧数の表示には解説③の作業が必要になる。
解説③ 閲覧数用のカラムに、実際の閲覧数を表示させる
function add_column_id($column_name, $id) {
global $post;
if ($column_name == 'view_column') {
$view_column = get_post_meta( $post->ID, 'views', true );
echo $view_column;
}
}
add_action('manage_posts_custom_column', 'add_column_id', 10, 2);
- 関数
add_column_id
の定義
この関数は、管理画面の投稿一覧の「閲覧数」カラムに、各投稿の閲覧数を表示するために使用される。
引数として$column_name
と$id
を受け取る。$column_name
はカラム名を表す文字列であり、$id
は投稿IDを表す整数である。 global $post;
この行では、グローバル変数$post
を参照する。$post
は現在の投稿オブジェクトを表す。if ($column_name == 'view_column') { ... }
この条件分岐は、カラム名が ‘view_column’(解説②で設定したカラム名をここで利用する) の場合に限り、閲覧数を表示するように制限している。これにより、投稿一覧において「閲覧数」カラムのみが対象となる。$view_column = get_post_meta( $post->ID, 'views', true );
この行では、現在の投稿の閲覧数を取得する。get_post_meta()
関数を使って、投稿のメタデータから、解説①で作った ‘views’ キーに対応する閲覧数を取得し、$view_column
変数に格納している。echo $view_column;
この行では、取得した閲覧数を表示する。これにより、管理画面の投稿一覧の「閲覧数」カラムに、各投稿の閲覧数が表示される。add_action('manage_posts_custom_column', 'add_column_id', 10, 2);
この行では、manage_posts_custom_column
アクションフックを使って、add_column_id
関数を登録している。
これにより、WordPressが投稿一覧のカラムにデータを表示する際に、add_column_id
関数が実行される。結果として、投稿一覧の「閲覧数」カラムに、各投稿の閲覧数が表示される。
- 関数
ここまでで、投稿一覧に、「閲覧数」の表示をさせることまではできた。以降で、ソート機能を実装していく。
解説④ 追加したカラムにソート(並び替え機能)を追加
// 追加したカラムにソート(並び替え)機能を追加
function my_add_sort($columns){
$columns['view_column'] = 'my_sort';
return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'my_add_sort');
- 関数
my_add_sort
の定義
この関数は、投稿一覧のカラムにソート機能を追加するために使用される。引数として$columns
を受け取る。この$columns
は、投稿一覧のカラムに関する情報を表す連想配列。 $columns['view_column'] = 'my_sort';
この行では、連想配列$columns
に新しい要素を追加している。キーはview_column
で、値はmy_sort
としている(このmy_sortは解説⑤で利用する)。
ここの、view_column
は先程追加した「閲覧数」カラムのキーである。return $columns;
この行では、ソート機能を追加した連想配列$columns
を返している。これにより、WordPressの投稿一覧画面が更新され、新しいソート機能が適用される。
- 関数
ただし、このコードだけではソート機能が正しく動作しない。このコードはソート機能を追加するための準備のみであり、実際のソート処理には解説⑤のコードが必要である。
解説⑤ ソートに利用するキーに「閲覧数」を使用するに設定
// ソートに利用するキーに「閲覧数」を使用するように設定
function my_add_sort_by_meta( $query ) {
if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {
switch( $orderby ) {
case 'my_sort':
$query->set( 'meta_key', 'views' );
$query->set( 'orderby', 'meta_value_num' );
break;
}
}
}
add_action( 'pre_get_posts', 'my_add_sort_by_meta', 1 );
- 関数
my_add_sort_by_meta
の定義
この関数は、投稿一覧の「閲覧数」カラムのソート処理を実行するために使用される。引数として、$query
を受け取る。この$query
は、現在の(≒閲覧中の)クエリオブジェクトを表す。 if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) { ... }
この条件分岐は、現在のクエリがメインクエリであり、かつ、クエリにソート順が指定されている場合に、ソート処理を実行するように制限している。switch( $orderby ) { ... }
このswitch
文では、クエリに指定されたソート順に応じて、ソート処理を実行する。ここで、$orderby
はクエリに指定されたソート順を表す文字列である。case 'my_sort': ... break;
このケースでは、ソート順が「解説④」で登場したmy_sort
の場合、閲覧数によるソート処理を実行する。これは、先程追加した「閲覧数」カラムのソート機能に対応するケースである。$query->set( 'meta_key', 'views' );
この行では、現在のクエリにメタキーviews
を設定している。これにより、クエリが閲覧数を基にソートを行うようになる。$query->set( 'orderby', 'meta_value_num' );
この行では、クエリのソート順を数値型のメタ値(meta_value_num
)に設定している。これにより、views
メタキーの数値に基づいてソートが実行される。add_action( 'pre_get_posts', 'my_add_sort_by_meta', 1 );
この行では、pre_get_posts
アクションフックを使って、my_add_sort_by_meta
関数を登録している。これにより、投稿データを取得する前にソート処理が実行される。
第3引数の1
は、この関数の優先度を表す。1
が指定されているため、他のフック関数よりも優先的に実行される。
- 関数
このコードを使用することで、WordPressのオリジナルテーマ開発者は、管理画面の投稿一覧で「閲覧数」カラムにソート機能を実装することができる。
まとめ 色々解説したから長くなったけど、コード自体は短いので、実装は簡単。
この機能の実装自体は結構色んなブログ記事とかでも見たが、「xxという記述をすることで、xxが動き、xxxという流れで、処理がされている」というところまで詳細に説明してくれているところが少なかったので、細か〜く記述した。
WordPressサイトを自作しているエンジニアさんなどは、参考になるかもしれない。