toscho.design

WordPress: Automatische Taxonomiespalte

Im Trunk ist gerade ein Patch gelandet, der die Arbeit mit Custom Taxonomies sehr erleichtert: Mit dem Argument 'show_admin_column' => TRUE in register_taxonomy() bekommen wir jetzt eine Spalte für die Taxonomie in allen Posttypen, für die sie registriert wurde.

Ich habe zur Demonstration ein kleines Plugin geschrieben, das eine Taxonomie locations registriert für Artikel, Seiten und Anhänge.
GitHub: Plugin T5 Taxonomy Location · Download

screenshot

Den kompletten Code kann man im Repository sehen; hier möchte ich nur kurz die eigentliche Registrierung zeigen:

/**
 * Register taxonomy.
 *
 * @wp-hook init
 * @since   2012.09.11
 * @return  void
 */
protected function register_taxonomy()
{
    $this->set_labels();
    $args = array (
        'labels'            => $this->labels,
        'label'             => $this->labels['singular_name'],
        'public'            => TRUE,
        'show_in_nav_menus' => TRUE,
        'show_ui'           => TRUE,
        'show_tagcloud'     => TRUE,
        'rewrite'           => array (
            'slug'       => _x( 'location', 'slug', 'plugin_t5_tax_location' ),
            'with_front' => apply_filters( 't5_tax_location_slug_front', FALSE )
        ),
        'query_var'         => 'location',
        'hierarchical'      => TRUE,
        // New in WordPress 3.5
        // see http://core.trac.wordpress.org/ticket/21240
        'show_admin_column' => TRUE
    );
    $tax_post_types = apply_filters(
        't5_tax_location_post_types',
        array( 'post', 'page', 'attachment' )
    );
    register_taxonomy( $this->taxonomy, $tax_post_types, $args );
}

Wer viel unterwegs ist, kann das Plugin installieren und ab sofort allen Beiträgen einen Ort zuweisen. Im Theme listen wir diese Orte mit get_the_term_list() auf:

print get_the_term_list( get_the_ID(), 'location', 'Orte: ', ', ', '' );

Der Slug ist natürlich übersetzbar und wird im Deutschen (die Sprachdatei liegt bei) als ort ausgegeben. Diesen Punkt übersehen leider noch viele Autoren, und auch im Core klappt das nicht sehr sauber.

Was die Automatik nicht anbietet: Ein Sortieren der Artikel nach Taxonomie. Diese Frage wird seltsamerweise oft gestellt – und sie legt ein Mißverständnis offen: Ein Objekt (Artikel, Seite oder ein anderer Posttyp) kann ja mehreren Taxonen zugewiesen worden sein, beispielsweise Berlin, Dortmund und Potsdam, wenn jemand über seine Reise berichtet. Dann gibt es keine vernünftige Sortierung. Der Sinn des Konstruktes Taxonomie in WordPress liegt eben darin.
Möchte man einander ausschließende Eigenschaften zuweisen, so benutze man Postmetadaten. Die kann man auch ordentlich sortieren.

Bis WordPress 3.5 erscheint, kann man sich mit Scribus Klasse APP_Tax_Admin_Column aushelfen. Wirft man die ins Theme oder Plugin, so erledigt sie genau das Gleiche wie später der Core: Sie prüft, ob das Argument 'show_admin_column' gesetzt wurde und zu TRUE evaluiert, dann erzeugt sie die neue Spalte.