我在我的 WordPress 网站中添加了一个名为 movies 的 自定义帖子类型,以及名为 genres 的自定义分类法。最终目标是在 WordPress 管理仪表板中启用基于流派的电影过滤,但我的过滤器工作不太正常,并且在从下拉过滤器中选择一个值时,他们的页面上没有任何变化全部显示为所有电影。
我使用的组件:
自定义帖子类型:电影
自定义分类法:流派
过滤器挂钩:我使用 restrict_manage_posts 操作在管理电影列表中添加流派过滤器。
查询修改:之后,我使用 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');
即使放置过滤器下拉列表后,修改查询时,过滤也不起作用。如果我选择一种类型并单击筛选按钮,电影列表不会更改;不会根据所选类型进行过滤。
尝试使用我检查过的代码。
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');