将分类过滤器添加到自定义帖子类型

时间:2012-09-01 15:35:50

标签: php wordpress

大约两年前,在Wordpress应答网站上有一个amazing conversation,其中有很多人想出了一个很好的解决方案,可以在自定义帖子类型的管理界面添加分类过滤器(请参阅屏幕的URL)我指的是):

http://[yoursite.com]/wp-admin/edit.php?s&post_status=all&post_type=[post-type]

无论如何,我喜欢Michael的精彩贡献,但最终使用了Manny的层次结构选项来实现Somatic的实现。我把它包装在一个类中 - 因为我喜欢做的事情 - 它几乎可以工作。下拉列表出现,但下拉列表中的值都在查看您要过滤的分类法slug-name的$ _GET属性。出于某种原因,我什么都没得到。我查看了下拉列表的HTML,对我来说似乎没问题。这是一些上下文的快速截图:

enter image description here

你可以从中判断出我的帖子类型被称为“练习”,我试图用作过滤器的分类法是“动作”。然后是下拉列表周围的HTML:

<select name="actions" id="actions" class="postform">
   <option value="">Show all Actions</option>
   <option value="ate-dinner">Ate dinner(1)</option>
   <option value="went-running">Went running(1)</option>
</select>

我还确认所有表单元素都在DOM的部分内。然而,如果我选择“运行”并单击过滤器按钮,则URL查询字符串将返回,而不会引用我所选择的内容。

更明确地说,页面首先使用以下URL加载:

/wp-admin/edit.php?post_type=exercise

并在从操作过滤器选择“Went Running”作为选项时按下过滤器按钮:

/wp-admin/edit.php?s&post_status=all&post_type=exercise&action=-1&m=0&actions&paged=1&mode=list&action2=-1

实际上,您可以看到对“actions”变量的引用,但它设置为空,我现在详细看看,当我点击页面上的“过滤器”时,它会将过滤器重置为默认值“显示所有操作”。谁能帮我这个?

顺便说一句,我已经在这里附上了PHP代码(尽管我现在开始倾向于将其作为js问题):gist

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并添加了一个小修补程序,基本上检查是否设置了分类法$ _GET参数。我希望它有所帮助:

add_action( 'restrict_manage_posts', 'my_restrict_manage_posts' );
function my_restrict_manage_posts() {
    global $typenow;
    $taxonomy = 'mytaxonomy'; // Change this
    if( $typenow != "page" && $typenow != "post" ){
        $filters = array($taxonomy);
        foreach ($filters as $tax_slug) {
            $tax_obj = get_taxonomy($tax_slug);
            $tax_name = $tax_obj->labels->name;
            $terms = get_terms($tax_slug);
            echo "<select name='$tax_slug' id='$tax_slug' class='postform'>";
            echo "<option value=''>Show All $tax_name</option>";
            foreach ($terms as $term) { 
                $label = (isset($_GET[$tax_slug])) ? $_GET[$tax_slug] : ''; // Fix
                echo '<option value='. $term->slug, $label == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>';
            }
            echo "</select>";
        }
    }
}

答案 1 :(得分:0)

Try this class,它很棒