Taxonomy Abhängige Einstellungen – Teil 2

Im ersten Teil haben wir die Basis gelegt und eine neue Option in WordPress registriert. Nun gehen wir aber einen Schritt weiter und werden pro Kategorie eine eigene Option anlegen.

 Ziel des Tutorials

Im Laufe des Tutorials werden wir ein Plugin entwickeln, welches mit der Taxonomy „Kategorie“, die man von den Posts her kennt, arbeitet und pro Kategorie eine eigene Einstellungsseite erstellt. In dem Beispiel wird das lediglich eine Einstellung als Textfeld (Message) sein, die wir dann im Frontend bei den Posts ausgeben.

Den gesamten Code findest du auf GitHub: tax-settings.

v1: eine Einstellung für alle Kategorien

v2: pro Kategorie eine Einstellung


Im 2. Teil dieser Serie starten wir mit der Überarbeitung des in Teil 1 erstellten Plugins. Damit später pro Kategorie eine eigene Nachricht abspeichern können müssen wir auch jeweils eine Option dafür abspeichern. Aber bevor wir komplett in Code versinken lass uns mal anschauen, wie das Endergebnis ausschauen wird.

Das Endergebnis wir sein …

Im Backend haben wir 3 verschiedene Beiträge die in ihrer jeweiligen Kategorie einsortiert sind.

Tax-Settings: 3 Posts in 3 verschiedenen Kategorien. (Admin Bereich)

Die Settings page aus Teil 1 existiert natürlich auch wird aber etwas erweitert. Für jede Kategorie, die zu dem Zeitpunkt der Darstellung registriert ist, wird ein Link gesetzt, der die jeweilige Einstellungsseite anzeigt.

Tax-Settings: Screenshot der fertigen Settings page

Im Screenshot kannst du oben sehen, dass es nicht nur 3 Seiten für die Kategorien Apple NewsLinus News und Windows News gibt sondern auch noch eine 4. Seite namens General erstellt ist. Diese Seite soll als Fallback dienen.

Zum Beispiel wurde für die Kategorie Linux News keine eigene Nachricht festgelegt und die Nachricht von General wird als Fallback genutzt.

Tax-Settings: Linux News Settings Page – General Nachricht als Placeholder im Field

Und wenn wir dass dann alles soweit haben erscheinen im Frontend verschiedene Nachrichten.

Tax-Settings: Posts

Settings registrieren

Nun da wir wissen, wo die Reise hingehen soll können wir ja loslegen. Als erstes fangen wir damit an den Code so umzuschreiben, dass er generisch wird und pro Kategorie eine neue Einstellung für WordPress registriert.

Als erste passen wir die admin_init method an. Wir rufen jetzt die Methoden register_settings, add_sections  und add_fields nicht mehr in einem Rutsch auf, sondern die werden stufenweise aufgerufen. Denn da wir nun die verschiedenen Namen nicht mehr hardcoden können müssen wir diese übergeben.

public function admin_init() {
    $categories = $this->get_categories();
    $this->register_settings( 'general', 'General' );
    
    foreach ( $categories as $key => $category ) {
        $this->register_settings( $category->slug, $category->name );
    }
}

Als erstes holen wir alle Kategorien und legen schon mal eine allgemein gültige Option an namens „General“. Danach loopen wir durch alle Kategorien und legen für diese jeweils eine eigene Kategorie an. Für die Namen verwenden wir hier ganze einfach den Slug der Kategorie.

Bevor wir die Optionen anlegen führe ich noch ein paar einfach Methoden ein, die bei der Namensgenerierung helfen sollen. Die folgenden Methoden bekommen einfach den slug und liefern den passenden Namen für die Option, die Sektion oder die Seite zurück.

Sicherlich könnte man dies auch in der jeweiligen Funktion direkt machen, aber da wir dies hier auslagern in eigene Methoden können andere Klassen / Funktionen den korrekten Namen bekommen ohne die jeweilige Namenskonvention zu wissen.

public function get_option_name( $slug ) {
    return 'ts_' . $slug . '_options';
}

public function get_sec_name( $slug ) {
    return 'ts_' . $slug . '_sec';
}

public function get_page_name( $slug ) {
    return 'ts_' . $slug . '_page';
}

Nun aber zurück zum Registrieren. Die überarbeitete Methode sieht dann wie folg aus.

public function register_settings( $slug, $name ) {
    $option = $this->get_option_name( $slug );

    // register settings for new show
    register_setting(
        $option,
        $option,
        array( $this, 'validate_options' )
    );

    $this->add_sections( $slug, $name );
}

Durch die Methode get_option_name bekommen wir den Namen und setzen die Variabel einfach ein. Dadurch registrieren wir für jede Kategorie eine eigene Option. Am Schluss rufen wir dann add_section auf um mit dem nächsten Schritt fortzufahren.

Section anlegen

Beim anlegen der jeweiligen Sektionen machen wir im Grunde nichts anderes. Durch den Slug wird der Name und Seitenname generiert und dann fügen wir eine neue Sektion hinzu.

public function add_sections( $slug, $name ) {
    $sec = $this->get_sec_name( $slug );
    $page = $this->get_page_name( $slug );

    add_settings_section(
        $sec, // ID
        "Category '{$name}' Settings", // Name
        array( $this, 'category_settings_description' ), // Callback for description
        $page // Page
    );

    $this->add_fields( $slug ,$sec, $page );
}

Die Callback Funktion category_settings_description ist dabei gleich geblieben. Man könnte allerdings noch die Callback Argument verwenden um die Beschreibung individueller zu gestalten. Im Codex findest du dazu mehr.

Option Feld hinzufügen

Nachdem die Einstellung und auch die Sektion hinzugefügt wurden muss als letztes noch das Feld her für die Einstellung. Wir erstellen für jede Sektion, die erstellt wurde, ein eigenes Feld. Dafür wird der Slug, der Sektionsname und auch die Seite der Methode übergeben.

Der $slug wird nur nur für die Callback-Funktion verwende. $page und $sec allerdings werden für die add_settings_field Funktion verwendet.

Der Name des Felds (die ID) bleibt allerdings bei allen Feldern gleich. Das hat 2 Gründe. a) es dreht sich inhaltlich immer um das selbe Feld und b) dadurch ist das Handlich später einfacher (Stichword: view und validation).

public function add_fields( $slug, $sec, $page ) {
    add_settings_field(
        'ts_category_message', // ID
        'Message', // Title
        array( $this, 'category_message' ), // Callback
        $page, // Page
        $sec, // Settings ID
        array( 'slug' => $slug ) // Callback args
    );
}

Die Callback Funktion sieht dann wie folg aus. Als erstes werden value und placholder für das Feld angefordert um danach das eigentliche Feld zu rendern. Die Methode get_field_value besprechen wir dann im dritten Teil wenn es um den Admin Bereich geht.

public function category_message( $args ) {
    $value = $this->get_field_value( $args['slug'], "ts_cat_message" );
    $placeholder = $this->get_field_value( 'general', "ts_cat_message" );
    $options_name = $this->get_option_name( $args['slug'] );

    ?>
    
< ?php }

Zusammenfassung

In diesem Teil haben wir die Möglichkeit hinzugefügt für jede Kategorie eine eigene Option zu erstellen. Zudem werden auch noch Sektionen und auch eigene Felder dafür angelegt. Damit ist der erste Stein gelegt und darauf können wir in den nächsten Teilen aufbauen, wenn wir die Einstellungsseite im Backend überarbeiten und danach auch noch im Frontend ein paar Änderungen vornehmen werden.

Den ganzen Code könnt ihr wie gewohnt auf GitHub finden: obstschale/tax-settings.

Veröffentlicht von Hans-Helge

Als studierter Informatiker arbeitet Hans-Helge gerne als freiberuflicher WordPress Entwickler und betreut neben eigenen Projekten viele andere Webseiten u.A. im ehrenamtlichen Bereich.

Beteilige dich an der Unterhaltung

1 Kommentar

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.