web-dev-qa-db-fra.com

Filtrage des publications par taxonomie multiple Termes tels que dans une liste de publication pour les administrateurs?

Après avoir lu Ajout d’un filtre de taxonomie à la liste des administrateurs pour un type de publication personnalisé? Je l’ai essayé mais n'a pas réussi à le faire pour filtrer deux (2) taxonomies différentes en même temps. Le système ne fait que filtrer la dernière taxonomie et en ignorer une autre.

Est-ce que quelqu'un sait comment filtrer deux taxonomies en même temps?

3
Ünsal Korkmaz

Je n'ai pas le temps de vous donner un exemple parfaitement fonctionnel pour le moment, mais puisque vous avez demandé de l'aide par courrier électronique, j'ai pensé que je vous orienterais dans la bonne direction.

Comme vous le savez peut-être ou non, ce n'est pas vraiment un problème pour la liste des publications de l'administrateur; presque tout ce code devrait fonctionner correctement. Le problème est qu’à présent, WordPress n’a pas la possibilité d’utiliser la fonction query_posts()/get_posts()/WP_Query pour filtrer plus d’un terme de taxonomie sans utiliser de points d'ancrage. (Il y a une très bonne chance que cela change dans la v3.1; nous ne pouvons qu'espérer!)

La solution consiste à utiliser un hook 'posts_where', comme illustré ici, avec la fonction tax_terms_where() écrite pour cette réponse:

Vous aurez également besoin de modifier le hook 'parse_query' pour capturer vos valeurs de filtre, comme ceci (Je n'ai pas testé cela, donc il peut y avoir de petites erreurs de syntaxe):

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

Ce qui précède suppose que vous avez des listes déroulantes avec les noms 'marka' et 'konu'. Vous devrez probablement aussi dire à WordPress de les reconnaître comme requêtes vars à l’aide d’un hook 'admin_init'. Encore une fois, je n’ai pas testé cela, alors j’espère que cela fonctionnera comme prévu:

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

C'est à peu près ça. Combinez la connaissance des trois postes; celui-ci, celui de admin répertorie et celui de plusieurs requêtes de taxonomie et je pense que vous allez y arriver. Vous voudrez peut-être même publier votre solution pour que les autres apprennent. Faites-moi savoir si vous êtes bloqué.

6
MikeSchinkel

Réponse tardive

Mise à jour pour WordPress 3.5+

J'ai écrit le plugin suivant pour étendre le WP_List_Tables pour les types de publication intégrés et personnalisés avec les fonctionnalités suivantes:

  • Ajouter une colonne (si show_admin_column est défini sur false)
  • Ajouter les taxons incl. liens vers la cellule de table
  • Ajouter une liste déroulante indiquant le nombre de publications attribuées au taxon pour filtrer les publications affichées.
  • Autoriser le filtrage par plus d'une taxonomie

Voici le plugin (mieux servi en tant que 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;
    }
}

Explication

J'ai d'abord fait un travail génial, mais volumineux, pour obtenir les colonnes personnalisées (je ne connaissais pas la mise à jour 3.5 pour show_admin_column). Ensuite, j'ai beaucoup fait pour que parse_query soit filtré par deux taxonomies. Heureusement, j'ai instantanément eu un résultat surprenant (sans code ajouté). Regardez l'exemple de vidage suivant:

  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 le fait déjà par défaut!

1
kaiser