WP-Plugin: Generierung eines Artikelbaums


Beiträge in einer einfache Baumansicht auflisten

Auf dieser Seite möchten wir Ihnen ein Listing für ein Plugin vorstellen, welches uns für den weiteren Ausbau der Verwaltung von WordPress-Installationen geeignet erscheint. Bei diesem Plugin handelt es sich um eine Beta-Version, die zwar in einigen Tests fehlerfrei funktionierte, jedoch noch nicht mit WordPress-Installationen getestet wurde, die sehr viele Kategorien und hunderte oder gar tausende Artikel als Content enthalten.

Das Plugin generiert einen einfachen Artikelbaum aus vorhandenen Beiträgen und die Seite mit dieser Baumansicht wird dem Dashboard-Menü bei der Aktivierung des Plugins hinzugefügt. Die Kategorien werden dabei in alphabetischer Reihenfolge sortiert, Unterkategorien eingerückt und die in den jeweiligen Kategorien gespeicherten Beiträge mit ihrem Beitragsnamen und der jeweiligen ID als verlinkte Liste ausgegeben.
Im Beispiel wurde dem Parameter posts_per_page der Wert 30 zugewiesen. Dabei sollte beachtet werden, dass sich dieser Wert in diesem Listing nicht auf Posts per Seite bezieht, sondern auf Posts per Kategorie, da die Funktion in Abhängigkeit von der Anzahl der gefundenen Kategorien und Unterkategorien wiederholt aufgerufen wird. Bei einer größeren Anzahl an Kategorien sollte somit dieser Wert bei den ersten Tests eher verringert statt erhöht werden.

Weiterhin wurden die Funktionen setup_postdata und wp_reset_postdata aus den Beispiel-Codes von WordPress übernommen. Die Infos zu beiden Funktionen sind reichlich dürftig, im Web ließ sich nicht viel mehr finden, die Funktion an sich enthält jedoch einige globale Variablen und ob und wann nun der Einsatz dieser beiden Funktionen wirklich erforderlich ist, konnte noch nicht abschließend geklärt werden.
In den Tests ergab sich zwischen mit und ohne diesen Funktionen kein Unterschied. In einem ewig alten Thread fand sich dafür der Hinweis, dass get_posts einige Daten nicht zur Verfügung stehen würden, wenn setup_postdata nicht verwendet würde und im Codex von WordPress, dass setup_postdata die globalen Variablen $id und $page füllen würde. Beide sind in der Funktion enthalten.

Codelisting (artikelbaum.php):

<?php
/**---------------------------------------------------------------------------------
 * Plugin Name:   HM-Artikelbaum
 * Beschreibung:  PHP-Script für eine einfache Baumansicht
 * Einzelheiten:  http://www.coder-welten.com/generierung-eines-artikelbaums/
 * Autor:         Horst Müller
 * Version:       Beta 0.1
 * Datum:         08. April 2014
 * Lizenz:        GPL v2 - http://www.gnu.org/licenses/gpl-2.0.html
 -----------------------------------------------------------------------------------
 */

if ( ! class_exists('WP') ) {
    exit("The autumn is golden.");
}
if ( is_admin() ) {

    $hm_instanz_baumansicht = new HM_Artikelbaum();
    add_action( 'admin_menu',
                 array( $hm_instanz_baumansicht,
                       'registriere_seite_mit_baumansicht'
                      )
               );
}
class HM_Artikelbaum {

    public function registriere_seite_mit_baumansicht() {

        /*-- Registrieren einer Seite und Methode für das Dashboard --------------*/

        add_menu_page( 'HM-Artikelbaum',
                       'Artikelbaum',
                       'administrator',
                        plugins_url(  '/artikelbaum.php', __FILE__ ),
                        array( $this, 'generiere_baumansicht' ),
                        plugins_url(  '/icon.png', __FILE__ )
                       );
    }

    /*-- Die Methode zur Erzeugung einer Liste für die Baumansicht ---------------*/

    private function liste_alle_beitraege_auf( $catids, $einrueckung ) {

        global $post;
        /*--------------------------------------------------------------------------
        posts_per_page bezieht sich in diesem Fall auf Posts per Kategorie und mit
        category__in werden Beiträge aus Kind-Kategorien nicht zusätzlich in den
        Eltern-Kategorien gelistet.
        ----------------------------------------------------------------------------
        */
        $args = array( 'posts_per_page' => 30,
                       'category__in'   => $catids,
                     );

        $alleposts = get_posts( $args );
        $liste     = "<ul>\n";

        foreach ( $alleposts as $post ){

            setup_postdata( $post );

            $liste .= '<li'.$einrueckung.'><a href="'.esc_html( get_permalink() ).'">'.
                       esc_html( get_the_title().' (ID: '.get_the_ID() ).')</a>'.
                      '</li>'."\n";
        }
        $liste .= "</ul>\n";

        wp_reset_postdata();
        return $liste;
    }

    /*-- Die Methode zur Generierung der Baumansicht -----------------------------*/

    public function generiere_baumansicht() {
        ?>
        <div class="wrap">
        <h2>Baumansicht</h2>
        <p>Auflistung von Beiträgen als einfacher Artikelbaum.</p>
        <div style="margin-left:38px">
        <?php
        $alle_cats = get_categories();

        foreach ( $alle_cats as $diese ) {

            /*-- Sortieren nach Eltern-Kategorien und Kind-Kategorien ----------------*/

            if ( $diese->category_parent > 0 ) {
                $parentcats = get_category_parents( $diese->category_parent );
                $cat_arr[$parentcats.$diese->name] = $diese->term_id;
            }
            else {
                $cat_arr[$diese->name] = $diese->term_id;
            }
        }
        /*-- In alphabetischer Reihenfolge sortieren ---------------------------------*/

        ksort($cat_arr);

        /*-- Den Artikelbaum ausgeben ------------------------------------------------*/

        foreach ( $cat_arr as $kategorie => $catid ) {

            if ( stripos($kategorie, "/") === false ) {
                $einrueckung = '';
            }
            else {
                $kategorie = str_replace( "/", " &raquo; ", $kategorie );
                $einrueckung = ' style="margin-left:28px"';
            }

            echo '<p'.$einrueckung.'><strong>'.esc_html( $kategorie ).'</strong> '.
                 '<em>(Kategorie-ID: '.esc_html( $catid ).')</em></p>'."\n".
                  $this->liste_alle_beitraege_auf( $catid, $einrueckung );
        }
        ?>
        </div>
        </div>
<?php    } // Ende der Methode generiere_baumansicht
}          // Ende der Klasse

?>

Bedingt durch die bei WP übliche Vermischung von HTML und PHP-Code, muss in Templates und Plugins immer ein Kompromiss zwischen den bei PHP üblichen Einrückungen, die der besseren Lesbarkeit des Codes dienen und den bei HTML üblichen Einrückungen, welche die Lesebarkeit des Quelltextes verbessern, gefunden werden. Im Beispiel wird so ein Kompromiss in der Methode generiere_baumansicht sichtbar.

Hinterlasse eine Antwort

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