自定义帖子类型分类过滤器在管理仪表板中不起作用

问题描述 投票:0回答:1

我在我的 WordPress 网站中添加了一个名为 movies自定义帖子类型,以及名为 genres 的自定义分类法。最终目标是在 WordPress 管理仪表板中启用基于流派的电影过滤,但我的过滤器工作不太正常,并且在从下拉过滤器中选择一个值时,他们的页面上没有任何变化全部显示为所有电影

我使用的组件:

  1. 自定义帖子类型:电影

  2. 自定义分类法:流派

  3. 过滤器挂钩:我使用 restrict_manage_posts 操作在管理电影列表中添加流派过滤器。

  4. 查询修改:之后,我使用 pre_get_posts 修改管理查询以添加流派过滤器。

注册自定义帖子类型分类法

function register_movies_post_type() {
    $labels = array(
        'name'               => 'Movies',
        'singular_name'      => 'Movie',
        'menu_name'          => 'Movies',
        'name_admin_bar'     => 'Movie',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Movie',
        'new_item'           => 'New Movie',
        'edit_item'          => 'Edit Movie',
        'view_item'          => 'View Movie',
        'all_items'          => 'All Movies',
        'search_items'       => 'Search Movies',
        'not_found'          => 'No movies found.',
        'not_found_in_trash' => 'No movies found in Trash.',
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'rewrite'            => array('slug' => 'movies'),
        'supports'           => array('title', 'editor', 'thumbnail'),
        'taxonomies'         => array('genres'), // Associate genres taxonomy
    );

    register_post_type('movies', $args);
}
add_action('init', 'register_movies_post_type');

function create_movies_taxonomy() {
    $labels = array(
        'name'              => 'Genres',
        'singular_name'     => 'Genre',
        'search_items'      => 'Search Genres',
        'all_items'         => 'All Genres',
        'edit_item'         => 'Edit Genre',
        'update_item'       => 'Update Genre',
        'add_new_item'      => 'Add New Genre',
        'new_item_name'     => 'New Genre Name',
        'menu_name'         => 'Genres',
    );

    $args = array(
        'hierarchical'      => true, // like categories
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'genre'),
    );

    register_taxonomy('genres', array('movies'), $args);
}
add_action('init', 'create_movies_taxonomy');


2. Adding the Genre Filter to Admin Dashboard:

function filter_movies_by_genre() {
    global $typenow;

    if ($typenow == 'movies') {
        $taxonomy = 'genres';
        $genres = get_terms($taxonomy);
        
        if ($genres) {
            echo '<select name="genres" id="genres" class="postform">';
            echo '<option value="">Show All Genres</option>';
            foreach ($genres as $genre) {
                $selected = (isset($_GET['genres']) && $_GET['genres'] == $genre->slug) ? ' selected="selected"' : '';
                echo '<option value="' . esc_attr($genre->slug) . '"' . $selected . '>' . esc_html($genre->name) . '</option>';
            }
            echo '</select>';
        }
    }
}
add_action('restrict_manage_posts', 'filter_movies_by_genre');


3. Modifying the Query by Changing the Filtering Criteria:

function filter_movies_by_genre_in_query($query) {
    global $pagenow;
    $post_type = isset($_GET['post_type']) ? $_GET['post_type'] : '';

    if ($post_type == 'movies' && is_admin() && $pagenow == 'edit.php' && isset($_GET['genres']) && $_GET['genres'] != '') {
        $query->query_vars['tax_query'] = array(
            array(
                'taxonomy' => 'genres',
                'field'    => 'slug',
                'terms'    => $_GET['genres'],
            )
        );
    }
}
add_action('pre_get_posts', 'filter_movies_by_genre_in_query');

即使放置过滤器下拉列表后,修改查询时,过滤也不起作用。如果我选择一种类型并单击筛选按钮,电影列表不会更改;不会根据所选类型进行过滤。

wordpress custom-taxonomy
1个回答
0
投票

尝试使用我检查过的代码。

function movies_post_type_filter_by_taxonomy()
    {
        global $typenow;
        $post_type = 'movies';
    
        if ($typenow == $post_type) {
            $taxonomies = array('genre');
            foreach ($taxonomies as $taxonomy) {
                $selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
                $info_taxonomy = get_taxonomy($taxonomy);
                wp_dropdown_categories(array(
                    'show_option_all' => __("Show All {$info_taxonomy->label}"),
                    'taxonomy' => $taxonomy,
                    'name' => $taxonomy,
                    'orderby' => 'name',
                    'selected' => $selected,
                    'show_count' => false,
                    'hide_empty' => true,
                ));
            }
        }
    }
    add_action('restrict_manage_posts', 'movies_post_type_filter_by_taxonomy');
    
    function movies_post_type_filtering_by_taxonomy($query)
    {
        global $pagenow;
        $post_type = 'movies';
        $taxonomies = array('genre');
    
        if (is_admin() && $pagenow == 'edit.php' && $query->get('post_type') == $post_type) {
            foreach ($taxonomies as $taxonomy) {
                if (isset($_GET[$taxonomy]) && $_GET[$taxonomy] != '') {
                    $term_id = intval($_GET[$taxonomy]);
                    if ($term_id > 0) {
                        $term = get_term_by('id', $term_id, $taxonomy);
                        if ($term) {
                            $query->query_vars[$taxonomy] = $term->slug;
                        }
                    }
                }
            }
        }
    }
    add_filter('parse_query', 'movies_post_type_filtering_by_taxonomy');
© www.soinside.com 2019 - 2024. All rights reserved.