せっかく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;
}
④条件文を追加
下記のように修正して、条件文を追加します。
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で人気記事を言語別に切り分けられるようになったと思います。
コメント