Kategorien
(Free-) Software PHP Programmierung Wordpress

WordPress: Verzeichnisinhalt listen

Mit PHP kann man sich relativ problemfrei die Dateien eines Verzeichnisses auf dem Webserver listen lassen.
In WordPress kann es auch sinnvoll sein, seinen Authoren die Möglichkeit zu geben den Inhalt eines bestimmten Verzeichnisses zu listen… hier die Möglichkeit ohne PlugIn über die WP-eigene functions.php.

Ziel: In einem Artikel oder einer Seite soll ein Verzeichnis angegeben werden können, dessen Dateien dann automatisch als klickbare Liste in den Artikel integriert werden.
Dabei werden im folgenden Beispiel Unterverzeichnisse und bestimmte Dateitypen aus der Liste ausgenommen.

Hier der PHP-Code der in die functions.php eingefügt werden muß. Diese liegt im Theme-Verzeichnis, sollte es die Datei noch nicht geben, dann kann sie einfach angelegt werden.

// Verlinkte Dateiliste fuer ein vorgegebenes Directory erstellen
function insert_dateiliste ( $article )
{
  // Verzeichnispfad(e) holen
  $suche = '#(?<={dirlist}).*(?={/dirlist})#U';   
  preg_match_all($suche, $article, $verzeichnisse);
    
  if (is_array($verzeichnisse)) {
    foreach ($verzeichnisse[0] as $dirlistitem=>$value) 
    {
      $formatierteliste = "<div id='dateiliste'><ul>";
      $rootpath         = $_SERVER['DOCUMENT_ROOT'];
      $verzeichnispfad  = $rootpath.$value;   
      $dateiliste       = array();
      $name             = array();      
      $kb               = array();
      $datum            = array();
    
      // Dateiliste erstellen... 
      foreach (new DirectoryIterator( $verzeichnispfad ) as $datei)
      {
        if (!$datei->isDir() 
            && !$datei->isDot() 
            && substr($datei,-3)!='php'
            && substr($datei,-3)!='htm'
            && substr($datei,-4)!='html'
            && substr($datei,-3)!='css'
            && substr($datei,-3)!='bak' )
        {
          $dateiliste[] = array( 'name' => $datei->getFilename() , 
                                 'kb' => ceil( $datei->getSize()/1024 ) , 
                                 'datum' => date( 'd.m.Y', $datei->getMTime() ) );        
        }
      }

      // ...und sortieren
      foreach ($dateiliste as $nr => $inhalt)
      {
        $name[$nr]  = strtolower( $inhalt['name']  );
        $kb[$nr]    = strtolower( $inhalt['kb']    );
        $datum[$nr] = strtolower( $inhalt['datum'] );
      }
      array_multisort($name, SORT_ASC, $dateiliste);
    
      // Formatierte Liste aufbauen
      $anzahl = count ( $dateiliste );
      for ($x = 0; $x < $anzahl; $x++)
      {
        if ($zeilenstyle == " class="gerade"" or $zeilenstyle == "" )  
          { $zeilenstyle = " class="ungerade"";
          } else {
            $zeilenstyle = " class="gerade"";
          }
        $formatierteliste .= "<li".$zeilenstyle."><a href="".$value."/".$dateiliste[$x]['name']."" target="_blank">";
        $formatierteliste .= $dateiliste[$x]['name'];
        $formatierteliste .= "</a> (".$dateiliste[$x]['kb']."KB";
        $formatierteliste .= " - ".$dateiliste[$x]['datum'];
        $formatierteliste .= ")</li>";
      }
                 
      $formatierteliste .= "</ul></div>";
      
      $article = str_replace('{dirlist}'.$value.'{/dirlist}', $formatierteliste , $article);

    }
  }  
  return $article;
}
// Filter der die Funktion zum Einsetzen des Dateilisten aktiviert
add_filter('the_content', 'insert_dateiliste', 2);

Einige Erklärungen:
In Zeile 19 bis 25 werden verschiedene Dateitypen sowie Unterverzeichnisse und die Einträge „.“ und „..“ aus der Ergebnisliste gefiltert. Die Funktion hier soll keinen Dateibrowser ersetzen, was auch noch mehr Code verlangen würde.
In Zeile 52 – 55 wird der Listenpunkt zusammengesetzt, hier kann eingegriffen werden um zu entscheiden welche Infos und in welcher Reihenfolge bzw. Form gelistet werden sollen.

Jetzt muß nur noch an gewünschter Stelle im Artikel oder der Seite das Verzeichnis zum auslesen vorgegeben werden. Dabei wird die komplette URL, allerdings ohne Domain angegeben. Das dann in folgendem Syntax

 {dirlist}/wp-content/uploads{/dirlist}

Dieser Eintrag wird dann im Ergebnis durch die Dateiliste ersetzt… Mehrfache Angaben innerhalb eines Artikels/einer Seite sind auch möglich.

Via CSS kann man dann noch die Liste über die eingefügten IDs und Klassen ansprechen und formatieren. Z.B. durch folgenden Eintrag in die Stylesheet-Datei des Themes

li.gerade {
  background-color: #ECECEC;
}
Quellen zum Skript:
[1] [2] [3]

 

9 Antworten auf „WordPress: Verzeichnisinhalt listen“

Hallo, schönes Snippet hast du erstellt, habe nur ein Problem damit.
Wenn ich dies auf meiner Seite einbinde, dann habe ich auch alle Dokumente aus den Ordern oberhalb des Ordners welchen ich anzeigen möchte.
Kann man das noch irgendwie begrenezen?

Hallo flocki.
Das konnte ich bisher nicht feststellen… der Syntax im Shorttag, also die Pfadangabe stimmt mit dem Beispiel überein?
Das Script ist zwar schon ein paar Tage alt, läuft aber aktuell wie hier beschrieben immer noch aktiv im Einsatz, das ohne Probleme.
Hm, prüf nochmal den übernommenen Code und den Aufruf genau, ansonsten hier mal die Details posten, vlt. ist ja was erkennbar.

Hallo, ja habe den Code noch einmal überprüft, habe Ihn egenauso im Einsatz, einzige Ausnahme ist, das ich das Plugin „Toolbox“ benutze.

So sieht das bei mir aus:

– Ordner 2
{dirlist}/cms/wp-content/uploads/1/2{/dirlist}

– Ordner 2a
{dirlist}/cms/wp-content/uploads/1/2/a{/dirlist}

– Ordner 2b
{dirlist}/cms/wp-content/uploads/1/2/b{/dirlist}

Im Ordner 2a wird auch der Inhalt aus 2 angezeigt

und in ordner 2b der Inhalt aus 2 und 2a.

Möchte gerne nur den Inhalt des jeweiligen Ordners haben und nicht alles.

OK, sehe ich das richtig, daß die drei Aufrufe innerhalb eines Posts erfolgen?
Bin nicht sicher, ob da das Problem liegt, bitte mal „2b“ alleine in dem Post aufrufen ob das dann immer noch inkl. „2“ und „2a“ kommt.
Wenn ja, dann ggf. mal im Code nach Zeile 15 eine neue Zeile mit folgendem Inhalt einfügen: $dateiliste[] = array();
Und?

Ja, es liegt scheinbar daran das der Aufruf mehrfach im post kommt, wenn ich nur 2b alleine aufrufe wird nur der Inhalt des Ordners 2b angezeigt.

Mit dem Zusatz $dateiliste[] = array(); geht es leider nicht.

Ich sehe auch gerade, dass das nicht das Problem ist. Ich habe im Script schlicht nicht korrekt bedacht, dass ein mehrfacher Aufruf erfolgen kann.
Bitte guck in den nächsten Tagen nochmal hier vorbei, kann nicht sofort, werde mich aber drum kümmern.

So, aufgrund der Info von flocki habe ich das Script aktualisiert.
Schlußendlich mußten nur einige Variablen zwischendurch geleert werden (Zeilen 14-17) damit es (jetzt) auch mit mehrfachen Einträgen innerhalb eines Artikels oder einer Seite funktioniert.
Danke für den Tipp.

Schreibe einen Kommentar

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