2018/04/01 ブログのテーマをcocoonに変更しました。
スポンサーリンク

WordPress Popular Posts をカスタマイズする

スポンサーリンク

Popular Posts便利ですよね。人気記事を自動で取得してくれるプラグインです。当サイトでも使用しています。

ただ get_postsで記事を取得出来ないのが欠点で、サイトごとにアレンジするのはとても大変です。

get_postsで記事を取得するには、meta_keyを追加・設定しないといけなく、プラグインを直接書き換えるのは大変です。なので今回は無理やりquery_postsで取得できるようにします。

query_postsでランキングを取得する流れ

  1. Popular Postsのショートコード(wpp)で人気記事毎のurlを取得
  2. 人気記事毎のurlから投稿IDを取得
  3. 取得した投稿IDの配列のパラメータとして指定する。

作成したコード

function.phpに以下を追加

//popular post からquery_posts生成
function get_popular_args($range= "weekly", $limit = 8){
  //urlを作成
  $shortcode = '[wpp';
  $atts = '
          post_html="{url},"            
          wpp_start=""
          wpp_end=""
          order_by="views"
          post_type="post"
          stats_comments=0
          stats_views=1
            ';
  $atts_2 = ' range='. $range;
  $atts_3 = ' limit='. $limit;
  $shortcode .= ' ' . $atts . $atts_2 . $atts_3 . ']';
  $result = explode(",", strip_tags(do_shortcode( $shortcode )));
  $ranked_post_ids = array();
  
  //urlから投稿IDを作成
  foreach($result as $_url){        
    if(!empty($_url) && trim($_url) != ''){
      $id_string = url_to_postid($_url);
      array_push ($ranked_post_ids, intval($id_string));
    }
  }
  
  //idをreturn
  $args = array(
    'posts_per_page' => 20,
    'post__in' => $ranked_post_ids,
    'orderby' => 'post__in'
  );

  return $args;
}

 

使い方

get_popular_argsでquery_postsのパラメータを取得出来ます。

引数として、集計期間と表示する件数が指定出来ます。

集計期間で指定できる引数は以下の通りです。

引数集計期間
daily1日
weekly週間
monthly月間
all全期間

引数を何も指定しない場合はデフォルトで週間人気記事を8件取得するようになっています。

//例,月間人気記事を10件取得
<?php $args = get_popular_args('monthly', '10');
query_posts($args); ?>

 

当サイトでは

スマホ版のレイアウトで使用しています。一応パソコンでも見る事が出来ます。(レイアウトは違いますが)

人気記事

簡単に人気記事を取得する事が可能で、Popular_Postsのレイアウトに影響されず、自分のテーマのレイアウトで記事を取得する事が出来ます。(やったー)

余談

get_postsで人気記事を取得出来るWP-PostViewsはとても便利ですが、全期間の人気記事しか取得できないのはナンセンスです。Popular_Postsがget_postsに対応してくれればいいのに。

参考

WordPress Popular Posts のランキングを無理やりquery_postsで取得し直す | ハックノート
$shortcode = ']'; $result = split(',', strip_tags(do_shortcode( $shortcode ))); $ranked_post_ids = array(); foreach($result as $_url){ if(!empty($_url) && trim(...

いつもお世話になっております。

The following two tabs change content below.

オーカワ

GCPばっか触ってるにゃーんエンジニア こちらのブログでも活躍中

コメント