it-swarm.com.de

Beiträge nach mehreren Taxonomie-Begriffen filtern, z. B. in einer Admin-Beitragsliste?

Nach dem Lesen vonHinzufügen eines Taxonomiefilters zur Admin-Liste für einen benutzerdefinierten Beitragstyp?Ich habe es versucht, aber ich konnte es nicht dazu bringen, zwei (2) verschiedene Taxonomien gleichzeitig zu filtern. Das System filtert nur die neueste Taxonomie und ignoriert die andere.

Weiß jemand, wie man zwei Taxonomien gleichzeitig filtert?

3
Ünsal Korkmaz

Ich habe momentan nicht die Zeit, ein voll funktionsfähiges Beispiel für Sie zu schreiben, aber da Sie um Hilfe per E-Mail gebeten haben, dachte ich, ich würde Sie in die richtige Richtung weisen.

Wie Sie vielleicht wissen oder auch nicht, ist dies kein wirkliches Problem für die Auflistung der Administrationsbeiträge. Die meisten Code sollte gut funktionieren. Das Problem ist, dass WordPress derzeit nicht in der Lage ist, query_posts()/get_posts()/WP_Query zu verwenden, um nach mehr als einem Taxonomiebegriff zu filtern, ohne Hooks zu verwenden. (Es gibt eine sehr gute Chance, dass sich in Version 3.1 etwas ändert; wir können nur hoffen!)

Die Lösung besteht darin, einen 'posts_where'-Hook wie hier dargestellt mit der Funktion tax_terms_where() zu verwenden, die für diese Antwort geschrieben wurde:

Sie müssen auch den Haken 'parse_query' modifizieren, um Ihre Filterwerte zu erfassen, etwa so (Ich habe dies nicht getestet, daher kann es zu kleinen Syntaxfehlern kommen):

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

Bei den obigen Angaben wird davon ausgegangen, dass Dropdowns mit den Namen 'marka' und 'konu' vorhanden sind. Sie müssen WordPress wahrscheinlich auchmitteilen, damit sie als Abfragevariablenmit einem 'admin_init'-Hook erkannt werden. Ich habe das noch nicht getestet, also hoffe ich, dass es so funktioniert, wie es geschrieben steht:

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

Das ist alles. Kombinieren Sie das Wissen der drei Beiträge; Dieses, das auf admin listet und das auf multiple Taxonomie-Abfragen und ich denke, Sie werden es schaffen. Vielleicht möchten Sie sogar Ihre Lösung veröffentlichen, von der andere lernen können. Lassen Sie mich wissen, wenn Sie stecken bleiben.

6
MikeSchinkel

Späte Antwort

Update für WordPress 3.5+

Ich habe das folgende Plugin geschrieben, um den WP_List_Tables für eingebaute und benutzerdefinierte Beitragstypen mit den folgenden Funktionen zu erweitern:

  • Spalte hinzufügen (wenn show_admin_column auf false gesetzt ist)
  • Fügen Sie die Taxons inkl. Links zur Tabellenzelle
  • Fügen Sie ein Dropdown-Menü hinzu, das die Anzahl der dem Taxon zugewiesenen Beiträge anzeigt, um die angezeigten Beiträge zu filtern
  • Erlaube das Filtern nach mehr als einer Taxonomie

Hier ist das Plugin (am besten als Mu-Plugin):

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

Erläuterung

Zuerst habe ich ein großartiges, aber umfangreiches Workaround durchgeführt, um die benutzerdefinierten Spalten zu erhalten (wusste nichts über das 3.5-Update für show_admin_column). Dann habe ich viel getan, um parse_query nach zwei Taxonomien zu filtern. Zum Glück hatte ich sofort ein überraschendes Ergebnis (ohne Code). Schauen Sie sich das folgende Beispiel an:

  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 macht das schon standardmäßig!

1
kaiser