按多个分类术语过滤帖子,例如在管理员帖子列表中?

时间:2010-11-04 作者:Ünsal Korkmaz

阅读后Adding a Taxonomy Filter to Admin List for a Custom Post Type?

有人知道如何同时过滤两种分类法吗?

2 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

我现在没有时间为你写一个完全可行的例子,但既然你在电子邮件中请求帮助,我想我会为你指出正确的方向。

你可能知道,也可能不知道,这对于管理员帖子列表来说并不是一个真正的问题;大多数代码都应该可以正常工作。问题是目前WordPress无法使用query_posts()/get_posts()/WP_Query 在不使用挂钩的情况下筛选多个分类术语(很有可能在v3.1中发生变化;我们只能寄希望于此!)

解决方案是使用\'posts_where\' 钩子,如图所示tax_terms_where() 为该答案编写的函数:

您还需要修改\'parse_query\' 钩子来捕获你的过滤器值,类似这样(我还没有测试过,所以可能会有一些小的语法错误):

<?php
add_filter(\'parse_query\',\'yoursite_parse_query\');
function yoursite_parse_query($query) {
  global $pagenow;
  $qv = &$query->query_vars;
  if ($pagenow==\'edit.php\') {
    $tax_terms = array();
    if (!empty($qv[\'marka\'])) 
      $tax_terms[] = "marka:{$qv[\'marka\']}";
    if (!empty($qv[\'konu\'])) 
      $tax_terms[] = "konu:{$qv[\'konu\']}";
    if (count($tax_terms)) 
      $qv[\'tax_terms\'] = implode(\',\',$tax_terms);
  }
}
以上假设您有名称为的下拉列表\'marka\'\'konu\'. 您可能还需要tell WordPress to recognize them as query vars 使用\'admin_init\' 钩再说一次,我还没有测试过这个,所以我希望它能像写的那样工作:

add_action(\'init\',\'yoursite_init\');
function yoursite_init() {
  global $wp;
  $wp->add_query_var(\'marka\');
  $wp->add_query_var(\'konu\');
}
就是这样。结合三个岗位的知识;这个,那个admin lists, 还有那个multiple taxonomy queries 我想你会完成的。您甚至可能想发布您的解决方案,供其他人学习。如果你卡住了,请告诉我。

SO网友:kaiser

迟交的答复

更新WordPress 3.5+

我编写了以下插件来扩展WP_List_Table用于具有以下功能的内置和自定义帖子类型:

添加列(如果show_admin_column 设置为false)

add_action( \'plugins_loaded\', array( \'WCM_Admin_PT_List_Tax_Filter\', \'init\' ) );
class WCM_Admin_PT_List_Tax_Filter
{
    private static $instance;

    public $post_type;

    public $taxonomies;

    public $new_cols = array();

    static function init()
    {
        null === self :: $instance AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        add_action( \'load-edit.php\', array( $this, \'setup\' ) );
    }

    public function setup()
    {
        add_action( current_filter(), array( $this, \'setup_vars\' ), 20 );
        add_action( \'restrict_manage_posts\', array( $this, \'get_select\' ) );
        add_filter( "manage_taxonomies_for_{$this->post_type}_columns", array( $this, \'add_columns\' ) );
    }

    public function setup_vars()
    {
        $this->post_type  = get_current_screen()->post_type;
        $this->taxonomies = array_diff(
             get_object_taxonomies( $this->post_type )
            ,get_taxonomies( array( \'show_admin_column\' => \'false\' ) )
        );
    }

    public function add_columns( $taxonomies )
    {
        return array_merge(
             $taxonomies
            ,$this->taxonomies
        );
    }

    /**
     * Select form element to filter the post list
     * @return string HTML
     */
    public function get_select()
    {
        $html = \'\';
        foreach ( $this->taxonomies as $tax )
        {
            $options = sprintf(
             \'<option value="">%s %s</option>\'
            ,__( \'View All\' )
                ,get_taxonomy( $tax )->label
            );
            $class = is_taxonomy_hierarchical( $tax ) ? \' class="level-0"\' : \'\';
            foreach ( get_terms( $tax ) as $taxon )
            {
                $options .= sprintf(
                     \'<option %s%s value="%s">%s%s</option>\'
                    ,isset( $_GET[ $tax ] ) ? selected( $taxon->slug, $_GET[ $tax ], false ) : \'\'
                    ,\'0\' !== $taxon->parent ? \' class="level-1"\' : $class
                    ,$taxon->slug
                    ,\'0\' !== $taxon->parent ? str_repeat( \'&nbsp;\', 3 ) : \'\'
                    ,"{$taxon->name} ({$taxon->count})"
                );
            }
            $html .= sprintf(
                \'<select name="%s" id="%s" class="postform">%s</select>\'
                ,$tax
                ,$tax
                ,$options
            );
        }

        return print $html;
    }
}
解释首先,我做了一个很棒的工作,但是做了大量的工作来获取自定义列(不知道show_admin_column). 然后我做了很多parse_query 通过两种分类法对其进行筛选。幸运的是,我立即得到了一个令人惊讶的结果(没有添加代码)。查看以下转储示例:

  public \'tax_query\' => 
    object(WP_Tax_Query)[429]
      public \'queries\' => 
        array (size=2)
          0 => 
            array (size=5)
              \'taxonomy\' => string \'post_format\' (length=11)
              \'terms\' => 
                array (size=1)
                  0 => string \'post-format-gallery\' (length=19)
              \'include_children\' => boolean true
              \'field\' => string \'slug\' (length=4)
              \'operator\' => string \'IN\' (length=2)
          1 => 
            array (size=5)
              \'taxonomy\' => string \'category\' (length=8)
              \'terms\' => 
                array (size=4)
                  0 => int 5
                  1 => int 6
                  2 => int 7
                  3 => int 8
              \'include_children\' => boolean false
              \'field\' => string \'term_id\' (length=7)
              \'operator\' => string \'IN\' (length=2)
      public \'relation\' => string \'AND\' (length=3)
WP已经默认这么做了!

结束

相关推荐

WP-ADMIN似乎正在重定向

我的w-admin登录有一个奇怪的问题。这是从我升级到3.0以后才开始的,当我转到wp admin时,登录表单显示正常,但当我输入用户名并通过时,每次都会再次显示登录表单。使用密码恢复功能会导致电子邮件未找到错误。我知道用户名密码和电子邮件是正确的,b/c我可以访问mysql数据库,我可以看到值(至少用户名和电子邮件) 有人知道会出什么问题吗