Cocoon×Bogoで人気記事を言語別に出しわける

せっかくBogoを導入して、ページを言語別に切り分けたのに、Cocoonの『人気記事』ですべての言語の記事が表示されて困ってはいませんか?

当記事ではCocoon×Bogoで人気記事を言語別に出しわける方法について記します。



①人気記事を取得するクエリを見つける

Cocoonの人気記事を取得するクエリはwrap_joined_wp_posts_queryメソッドで生成されています。
/wp-content/themes/cocoon-master/lib/page-access/access-func.phpの330行目にあります。

※私はCocoon2.5.2を使用していますが、バージョンによっては違う場所にあるかもしれません。

function wrap_joined_wp_posts_query ($query, $limit, $author, $post_type){
  global $wpdb;
  $wp_posts = $wpdb->posts;
  $ranks_posts = 'ranks_posts';
  $author_query = null;
  if ($author) {
    $author_query = ' AND post_author = '.esc_sql($author);
  }
  $query = "
    SELECT ID, sum_count, post_title, post_author, post_date, post_modified, post_status, post_type, comment_count FROM (
      {$query}
    ) AS {$ranks_posts}
    INNER JOIN {$wp_posts} ON {$ranks_posts}.post_id = {$wp_posts}.id
    WHERE post_status = 'publish' AND
          post_type = '{$post_type}'".
          $author_query."
    ORDER BY sum_count DESC
    LIMIT $limit
  ";
  return $query;
}





②言語を取得する

下記のように1行追記して、言語を取得して変数に格納します。
後でSQLの条件文で使用します。

function wrap_joined_wp_posts_query ($query, $limit, $author, $post_type){
  global $wpdb;
  $wp_posts = $wpdb->posts;
  $ranks_posts = 'ranks_posts';
  $author_query = null;
  $locale = get_locale();        //追記
  if ($author) {
    $author_query = ' AND post_author = '.esc_sql($author);
  }
  $query = "
    SELECT ID, sum_count, post_title, post_author, post_date, post_modified, post_status, post_type, comment_count FROM (
      {$query}
    ) AS {$ranks_posts}
    INNER JOIN {$wp_posts} ON {$ranks_posts}.post_id = {$wp_posts}.id
    WHERE post_status = 'publish' AND
          post_type = '{$post_type}'".
          $author_query."
    ORDER BY sum_count DESC
    LIMIT $limit
  ";
  return $query;
}






③wp_postmetaテーブルを結合する

下記のように1行追記して(15行目)、wp_postmetaテーブルを結合します。

function wrap_joined_wp_posts_query ($query, $limit, $author, $post_type){
  global $wpdb;
  $wp_posts = $wpdb->posts;
  $ranks_posts = 'ranks_posts';
  $author_query = null;
  $locale = get_locale();
  if ($author) {
    $author_query = ' AND post_author = '.esc_sql($author);
  }
  $query = "
    SELECT ID, sum_count, post_title, post_author, post_date, post_modified, post_status, post_type, comment_count FROM (
      {$query}
    ) AS {$ranks_posts}
    INNER JOIN {$wp_posts} ON {$ranks_posts}.post_id = {$wp_posts}.id
    LEFT JOIN wp_postmeta ON ranks_posts.post_id = wp_postmeta.post_id AND wp_postmeta.meta_key='_locale'    #追記
    WHERE post_status = 'publish' AND
          post_type = '{$post_type}'".
          $author_query."
    ORDER BY sum_count DESC
    LIMIT $limit
  ";
  return $query;
}





connaiconnai

④条件文を追加

下記のように修正して、条件文を追加します。

function wrap_joined_wp_posts_query ($query, $limit, $author, $post_type){
  global $wpdb;
  $wp_posts = $wpdb->posts;
  $ranks_posts = 'ranks_posts';
  $author_query = null;
  $locale = get_locale();
  if ($author) {
    $author_query = ' AND post_author = '.esc_sql($author);
  }
  $query = "
    SELECT ID, sum_count, post_title, post_author, post_date, post_modified, post_status, post_type, comment_count FROM (
      {$query}
    ) AS {$ranks_posts}
    INNER JOIN {$wp_posts} ON {$ranks_posts}.post_id = {$wp_posts}.id
    LEFT JOIN wp_postmeta ON ranks_posts.post_id = wp_postmeta.post_id AND wp_postmeta.meta_key='_locale'
    WHERE post_status = 'publish' AND
          post_type = '{$post_type}'".
          $author_query." AND                   #修正(ANDを追記)
          wp_postmeta.meta_value='{$locale}'    #追記
    ORDER BY sum_count DESC
    LIMIT $limit
  ";
  return $query;
}




これで、Cocoon×Bogoで人気記事を言語別に切り分けられるようになったと思います。



コメント

タイトルとURLをコピーしました