Фильтрация сообщений по нескольким терминам таксономии, например, в списке сообщений администратора?


После прочтения Добавление фильтра таксономии в Список администраторов для пользовательского типа записи? Я попробовал, но мне не удалось заставить его фильтровать две (2) разные таксономии одновременно. Система фильтрует только последнюю таксономию и игнорирует другую.

Кто-нибудь знает, как фильтровать две таксономии одновременно?

Author: Community, 2010-11-04

2 answers

У меня сейчас нет времени на то, чтобы написать для вас полностью рабочий пример, но, поскольку вы запросили помощь по электронной почте, я решил, что укажу вам правильное направление.

Как вы можете знать, а можете и не знать, на самом деле это не проблема для списка сообщений администратора; почти весь этот код должен работать нормально. Проблема в том, что в настоящее время WordPress не имеет возможности использовать query_posts()/get_posts()/WP_Query для фильтрации по нескольким терминам таксономии без использования крючков. (Существует очень хороший шанс, что это изменится в версии 3.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'. Вероятно, вам также потребуется сообщить WordPress, чтобы он распознал их как переменные запроса с помощью крючка 'admin_init'. Опять же, я не проверял это, поэтому я надеюсь, что это работает так, как написано:

add_action('init','yoursite_init');
function yoursite_init() {
  global $wp;
  $wp->add_query_var('marka');
  $wp->add_query_var('konu');
}

Вот и все. Объедините знания трех постов; этот, тот, что в списках администраторов, и тот, что в нескольких запросах таксономии, и я думаю, вы это сделаете. Вы могли бы даже хотите опубликовать свое решение, чтобы другие могли у вас поучиться. Дай мне знать, если застрянешь.

 6
Author: MikeSchinkel, 2017-04-13 12:37:46

Поздний ответ

Обновление для WordPress 3.5+

Я написал следующий плагин для расширения WP_List_Table для встроенных и пользовательских типов сообщений со следующими функциями:

  • Добавить столбец (если show_admin_column имеет значение false)
  • Добавьте таксоны вкл. ссылки на ячейку таблицы
  • Добавьте раскрывающийся список, показывающий количество записей, назначенных таксону, для фильтрации отображаемых записей
  • Позволяет фильтровать более чем по одному таксономия

Вот плагин (лучше всего использовать как mu-плагин):

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;
    }
}

Объяснение

Сначала я проделал потрясающую, но большую работу, чтобы добавить пользовательские столбцы (не знал об обновлении 3.5 для 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 уже делает это по умолчанию!

 1
Author: kaiser, 2013-01-19 20:20:31