toscho.design

WordPress: Setup-Funktion fürs Theme

Eine Sache, die gerade Einsteiger oft falsch machen: Sie können nicht warten. Die functions.php des Themes sollte jeden Code-Schnipsel an eine feste Aktion binden und nie etwas einfach so ausführen, damit Child-Themes oder Plugins sie einfacher deaktivieren können. Der passende Hook für die Grundeinstellungen ist after_setup_theme.

Hier meine Setup-Funktion aus dem nächsten Theme für diese Seiten.

add_action( 'after_setup_theme', 't5_setup' );

/**
 * Basic theme settings.
 *
 * @wp-hook after_setup_theme
 *
 * @return void
 */
function t5_setup()
{
    // default settings
    add_post_type_support( 'page', 'excerpt' );
    add_theme_support( 'automatic-feed-links' );
    // see http://toscho.de/?p=2269
    add_theme_support(
        'post-formats',
        array_diff(
            array_keys( get_post_format_strings() ),
            array( 'standard' )
        )
    );

    $lang_dir = get_template_directory() . '/lang';
    $lang_dir = apply_filters( 't5_theme_lang_dir', $lang_dir );
    load_theme_textdomain( 't5_theme', $lang_dir );

    // theme specific settings
    $GLOBALS['content_width'] = 750;

    // extra functions just for nav menus
    locate_template( 'php/functions.nav-menu.php', TRUE, TRUE );

    $bg_options = array (
        'wp-head-callback' => 't5_custom_background_frontend',
        'default-color'    => 'f0f0f0',
        'default-image'    => '',
    );
    add_theme_support( 'custom-background', $bg_options );
    // see http://toscho.de/?p=2187
    add_action( 'login_head', $bg_options['wp-head-callback'] );

    add_theme_support(
        'custom-header',
        array (
            'width'       => 960,
            'height'      => 200,
            'flex-height' => TRUE,
            'flex-width'  => TRUE,
            'header-text' => FALSE,
        )
    );

    // used on the first page of main loop only
    register_sidebar(
        array (
            'name'          => __( 'First Frontpage', 't5_theme' ),
            'id'            => 'first-frontpage',
            'before_widget' => '',
            'after_widget'  => '',
            'before_title'  => '',
            'after_title'   => '',
        )
    );

    // used on pages with multiple posts only
    register_sidebar(
        array (
            'name'          => __( 'Archive Post Listings', 't5_theme' ),
            'id'            => 't5-archive-sidebar',
            'before_widget' => '<li class="small-font widget %2$s">',
            'after_widget'  => '</li>',
            'before_title'  => '<h2>',
            'after_title'   => '</h2>',
        )
    );

    // debug scripts
    current_user_can( 'administrator' )
        && add_action( 'wp_footer', 't5_debug_theme' );
}

Außerhalb dieser Funktion habe ich noch ein paar Filter gesetzt, und in der Datei fürs Menü gibt es noch einige sehr spezifische Funktionen, über die ich später vielleicht mehr schreibe. Im Grunde versuche ich aber immer, mich im Theme zurückzuhalten. Denn ein gutes Theme tut so wenig wie möglich.

5 Kommentare

  1. Frank am 08.09.2012 · 20:04

    Wobei mir für ein öffentliches Theme die Abfrage der Funktion fehlt, damit man es im Child Theme ersetzen kann. Ansonsten Zustimmung, einhaken, wo es hingehört und nicht blind.

  2. David am 08.09.2012 · 20:14

    Ein guter Anfang! Es würde wahrscheinlich noch eine ganze Artikelserie füllen, wie man Themes childtheme-freundlich schreibt. Leider ist hier Automattic selbst kein sonderlich gutes Vorbild.

  3. Thomas Scholz am 09.09.2012 · 03:03

    @Frank: Das Child-Theme kann mit remove_action( 'after_setup_theme', 't5_setup' ); diese Funktion rechtzeitig deaktivieren und eine eigene Setup-Funktion laufen lassen. Und die sollte ohnehin nicht genauso heißen wie die des Parent-Themes, damit beim Debuggen ganz klar ist, wo ein Fehler auftritt.

  4. Frank am 09.09.2012 · 11:39

    @Thomas: richtig, aktuell dokumentiert Automattic das leider nicht so, so dass man dann wieder als Autor in die Pflicht muss. Ansonsten gefällt mir das ja besser, da schlanker und lesbarer. Gerade bei Verwendung in class ist es schöner, aber dann sind Laien gleich ganz abgehängt.

  5. Kaiser am 09.09.2012 · 11:45

    Schön gemacht. Ein paar kleine Anmerkungen zu den Funktionen wären ganz nett - vor allem für Anfänger.