最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Is it possible to filter a taxonomy archive by other taxonomies that are on posts?

programmeradmin0浏览0评论

Alright. I've worked with Wordpress for more than 10 years. I've never had a need to do this before and I don't think it's actually possible without some pretty custom dev work. So let me set this up. An item can be added to a collection. This item also has other taxonomies - topic, artist, and type. On the collection archive, I have select-able lists on the page that list the other taxonomies that the items can have.

My question is, when I click on a topic to filter the collection, what is the taxonomy query I need to get collections that have posts that have a selected topic? To make it more difficult, I'm working inside of a theme with Elementor and Crocoblock's JetEngine/JetSmartFilter and I've been asked to use those plugins (or a shortcode) to make it easier for the team to copy it to future sites.

Happy to answer questions and thank you in advance for any help!

Alright. I've worked with Wordpress for more than 10 years. I've never had a need to do this before and I don't think it's actually possible without some pretty custom dev work. So let me set this up. An item can be added to a collection. This item also has other taxonomies - topic, artist, and type. On the collection archive, I have select-able lists on the page that list the other taxonomies that the items can have.

My question is, when I click on a topic to filter the collection, what is the taxonomy query I need to get collections that have posts that have a selected topic? To make it more difficult, I'm working inside of a theme with Elementor and Crocoblock's JetEngine/JetSmartFilter and I've been asked to use those plugins (or a shortcode) to make it easier for the team to copy it to future sites.

Happy to answer questions and thank you in advance for any help!

Share Improve this question asked Feb 8, 2021 at 3:31 Josh ChristophersonJosh Christopherson 111 silver badge3 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

Depending on use case scenario you might need to write some custom code or a tiny plugin to achieve this. If you want to filter the posts in admin dashboard post list then you can use following code snipped to jump start

<?php
if (is_admin()){
   //this hook will create a new filter on the admin area for the specified post type
   add_action( 'restrict_manage_posts', function(){
        global $wpdb, $table_prefix;

        $post_type = (isset($_GET['post_type'])) ? quote_smart($_GET['post_type'], true) : 'post';
 
        //only add filter to post type you want
        if ($post_type == 'YOUR_POST_TYPE_HERE'){
            $values = array();
            $query_years = $wpdb->get_results("SELECT year(post_date) as year from ".$table_prefix."posts
                    where post_type='".$post_type."'
                    group by year(post_date)
                    order by post_date");
            foreach ($query_years as &$data){
                $values[$data->year] = $data->year;
            }
            ?>
            <select name="admin_filter_year">
                <option value="">All years</option>
                <?php 
                $current_v = isset($_GET['admin_filter_year'])? $_GET['admin_filter_year'] : '';
                foreach ($values as $label => $value) {
                    printf(
                        '<option value="%s"%s>%s</option>',
                        $value,
                        $value == $current_v? ' selected="selected"':'',
                        $label
                    );
                }
                ?>
            </select>
            <?php
        }
    });

    //this hook will alter the main query according to the user's selection of the custom filter we created above:
    add_filter( 'parse_query', function($query){
        global $pagenow;
        $post_type = (isset($_GET['post_type'])) ? quote_smart($_GET['post_type'], true) : 'post';

        if ($post_type == 'YOUR_POST_TYPE_HERE' && $pagenow=='edit.php' && isset($_GET['admin_filter_year']) && !empty($_GET['admin_filter_year'])) {
            $query->query_vars['year'] = $_GET['admin_filter_year'];
        }
    });
}

If you want to do it in front end then my suggestion will be a custom query and ajax. For this scenario I'm for not be able to provide an example as it's a bit complex. As you have to use elementor in front end you can develop a widget for this too!

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>