This blog page uses “Cocoon” as theme, which is famous in Japan.
I added function to this theme so that we can show “popolar_list” by filtering tag id.
This is what I introduced in Twitter.
– Sorry for Japanese.
How to implement
I added some code to child theme to avoid affecting parant theme.
Existing implementation of showing “popular_list” is
- popular_entries_shortcode is called.
- generate_popular_entries_tag is called in popular_entries_shortcode.
- get_access_randking_records is called in generate_popular_entries_tag.
To visualize, you can see this structure.
popular_entries_shortcode -> generate_popular_entries_tag -> get_access_ranking_records
These 3 functions are implemented in parent theme and are considered to customize like below.
if ( !function_exists( 'get_access_ranking_records' ) ): function get_access_ranking_records(snip
So the best strategy to add function is below.
– Copying corresponding functions from parent theme to child theme functions.php
– Modifying source code of funtions.php
Code modification
Let’s see actual source code which I implemented.
* Please be noted that Cocoon is on development now so there will be update. So source code in this article and actual source code in Cocoon may differ.
Firstly popular_entries_shortcode.
I show code diffs with symbol “+” and “-” which seems “diff -ruN”.
Do not include “+” and “-” to source code in your case.
“tags” is added in attribute as well as “cats”.
If both are in short code, cats are higher priority.
01/20/2022
Added to initialize $tag_ids.
– Thank you Risa Yazawa for advise!
if ( !function_exists( 'popular_entries_shortcode' ) ): function popular_entries_shortcode($atts) { extract(shortcode_atts(array( 'days' => 'all', 'count' => 5, 'type' => 'default', 'rank' => 0, 'pv' => 0, 'cats' => 'all', 'children' => 0, + 'tags' => 'all', 'bold' => 0, 'arrow' => 0, 'class' => null, ), $atts, 'popular_list')); $cat_ids = array(); $tag_ids = array(); // 01/20/2022 added if ($cats && $cats != 'all') { $cat_ids = explode(',', $cats); } + else if ($tags && $tags != 'all') { + $tag_ids = explode(',', $tags); + } $atts = array( 'days' => $days, 'entry_count' => $count, 'entry_type' => $type, 'ranking_visible' => $rank, 'pv_visible' => $pv, 'cat_ids' => $cat_ids, 'children' => $children, + 'tag_ids' => $tag_ids, 'bold' => $bold, 'arrow' => $arrow, 'class' => $class, ); ob_start(); generate_popular_entries_tag($atts); //_v($atts); //generate_popular_entries_tag($days, $count, $type, $rank, $pv, $categories); $res = ob_get_clean(); return $res; } endif;
Next is “generate_popular_entries_tag”.
This is also easy to understand, just adding “tag_ids” and “excluding_tag_ids”.
//人気ランキングリストの取得 if ( !function_exists( 'generate_popular_entries_tag' ) ): function generate_popular_entries_tag($atts){ extract(shortcode_atts(array( 'days' => 'all', 'entry_count' => 5, 'entry_type' => ET_DEFAULT, 'ranking_visible' => 0, 'pv_visible' => 0, 'cat_ids' => array(), 'children' => 0, + 'tag_ids' => array(); 'exclude_post_ids' => array(), 'exclude_cat_ids' => array(), + 'exclude_tag_ids' => array(), 'bold' => 0, 'arrow' => 0, 'class' => null, ), $atts)); - $records = get_access_ranking_records($days, $entry_count, $entry_type, $cat_ids, $exclude_post_ids, $exclude_cat_ids, $children); + $records = get_access_ranking_records($days, $entry_count, $entry_type, $cat_ids, $tag_ids, $exclude_post_ids, $exclude_cat_ids, $exclude_tag_ids, $children); (snip)
Lastly modify “get_access_ranking_records”.
01/20/2022
Added to initialize $tags.
Thank you Risa Yazawa for advise!
//アクセスランキングを取得 if ( !function_exists( 'get_access_ranking_records' ) ): -function get_access_ranking_records($days = 'all', $limit = 5, $type = 'post', $cat_ids = array(), $exclude_post_ids = array(), $exclude_cat_ids = array(), $children = 0){ +function get_access_ranking_records($days = 'all', $limit = 5, $type = 'post', $cat_ids = array(), $tag_ids = array(), $exclude_post_ids = array(), $exclude_cat_ids = array(), $exclude_tag_ids = array(), $children = 0){ (略) //アクセスキャッシュを有効にしている場合 if (is_access_count_cache_enable()) { (略) $tags = implode(',', $tag_ids); //2022/01/20追加 //除外投稿 $archive_exclude_post_ids = get_archive_exclude_post_ids(); if ($archive_exclude_post_ids && is_array($archive_exclude_post_ids)) { $exclude_post_ids = array_unique(array_merge($exclude_post_ids, $archive_exclude_post_ids)); } $expids = implode(',', $exclude_post_ids); $excats = implode(',', $exclude_cat_ids); + $extags = implode(',', $exclude_tag_ids); $type = get_accesses_post_type(); - $transient_id = TRANSIENT_POPULAR_PREFIX.'?days='.$days.'&limit='.$limit.'&type='.$type.'&cats='.$cats.'&children='.$children.'&expids='.$expids.'&excats='.$excats; + $transient_id = TRANSIENT_POPULAR_PREFIX.'?days='.$days.'&limit='.$limit.'&type='.$type.'&cats='.$cats.'&tags='.$tags.'&children='.$children.'&expids='.$expids.'&excats='.$excats.'&extags='.$extags; (snip) //カテゴリを指定する場合 if (is_ids_exist($cat_ids) || is_ids_exist($exclude_cat_ids)) { (snip) + // In case specifying tag id + else if (is_ids_exist($tag_ids) || is_ids_exist($exclude_tag_ids)) { + global $post; + $term_relationships = $wpdb->term_relationships; + $term_taxonomy = $wpdb->term_taxonomy; + $joined_table = 'terms_accesses'; + //specifying tag id to be included + if (is_ids_exist($tag_ids)) { + $tag_ids = implode(',', $tag_ids); + //$where .= " AND {$term_relationships}.term_taxonomy_id IN ({$tag_ids}) ".PHP_EOL; + $where .= " AND {$term_taxonomy}.term_id IN ({$tag_ids}) ".PHP_EOL; + } + //specifying excluding tag id + if (is_ids_exist($exclude_cat_ids)) { + //remove empty arrays + $exclude_tag_ids = array_filter($exclude_tag_ids, "strlen"); + //separating by comma + $ex_tag_ids = implode(',', $exclude_tag_ids); + $ex_tag_ids = preg_replace('/,$/', '', $ex_tag_ids); + $where .= " AND {$term_relationships}.term_taxonomy_id NOT IN ({$ex_tag_ids}) ".PHP_EOL; + } + + $where .= " AND {$term_taxonomy}.taxonomy = 'post_tag' ".PHP_EOL; +(snip - do same as category) } else { $query = " SELECT {$access_table}.post_id, SUM({$access_table}.count) AS sum_count FROM {$access_table} $where GROUP BY {$access_table}.post_id ORDER BY sum_count DESC "; //1回のクエリで投稿データを取り出せるようにケーブル結合クエリを追加 $query = wrap_joined_wp_posts_query($query, $limit); }
10/04/2022 There is update to Cocoon to 2.5.0. In this version post_type can be specified in parameters and hence wrap_joined_wp_posts_query() arguments are changed like below. Please update your code if needed. $query = wrap_joined_wp_posts_query($query, $limit, $author, $post_type);
Diffs seems many lines of code, but I just added based on this way.
Before
//カテゴリを指定する場合
if (is_ids_exist($cat_ids) || is_ids_exist($exclude_cat_ids)) {
(Code of category)
} else {
(Code of non category)
}
After
//カテゴリを指定する場合
if (is_ids_exist($cat_ids) || is_ids_exist($exclude_cat_ids)) {
(Code of category)
+else if (is_ids_exist($tag_ids) || is_ids_exist($exclude_tag_ids)) {
+ (Code of tag)
} else {
(Code of non category/tag)
}
If “taxonomy” is there it was forced to category base.
I added to support tag by specifying “post_tag” like this.
$where .= " AND {$term_taxonomy}.taxonomy = 'post_tag' ".PHP_EOL;
WordPress article can be got by PHP code.
Please see this page for more detail.
If everything is fine, you can filter popular_list by tag id.
[popular_list count="2" type="border_square" tags="271"]
Conclusion
How was it?
I modified because I want this function.
I am very happy if this customization is useful for you!
Comments