it-swarm.com.de

Listet hochgeladene PDF-Dateien auf und zeigt sie dynamisch an

Ich möchte alle PDFs für eine bestimmte WordPress-Seite anzeigen. Ich möchte genau, dass die PDF Dokumente aus dem Admin-Bereich hochgeladen werden, und ich möchte alle PDFs auf einer Seite im Front-End dynamisch anzeigen. Wenn ich ein neues PDF über das Admin-Panel hochlade, wird das PDF automatisch im Frontend angezeigt. Ist das möglich?

Hier ist der Code, den ich ausprobiert habe:

<?php   
define('MYDIR','/wp-content/uploads/2016/01/');

if (!defined('MYDIR')) die ('Directory Is not correct or is not defined!');
$filesindir=scandir(MYDIR);
echo '<pre>';
$counter=0;
foreach($filesindir as $files)
{
     if ($files=='.pdf') continue;
     $counter++;
     echo "<a href=" . MYDIR . $files .  ">Download $files</a><br>";
}
echo "<br>Theris $counter PDF file(s)</pre>";
unset($files);
die;
1
Gautam Chawla

Möglichkeiten zum Abrufen von Anhängen

WordPress speichert Dateien nicht nur auf einer physischen Festplatte, sondern auch mit dem Post-Typ attachment in Ihrer MySQL/MariaDB-Datenbank. Dies bedeutet, dass Sie zwei Möglichkeiten haben, nach hochgeladenen Dateien zu fragen, und Sie müssen auswählen, was Sie in welchem ​​Szenario/Kontext benötigen.

Nur Dateisystem

Um alle Dateien oder einen bestimmten Typ in einem bestimmten Verzeichnis durchzugehen, können Sie den \FilesystemIterator (PHP 5.3+ erforderlich) verwenden und die Ergebnisse dann einfach an einen Array/[] senden. Im folgenden Beispiel durchlaufen wir alle PDF Dateien in dem Verzeichnis, das durch wp_upload_dir()bestimmt wird. quelle  .

$extension = 'pdf';
$uploads = wp_upload_dir();

$files = new \FilesystemIterator( 
    $uploads['path'],
    \FilesystemIterator::SKIP_DOTS 
    | \FilesystemIterator::FOLLOW_SYMLINKS
);

$html = [];
foreach ( $files as $pdf )
{
    /** @noinspection PhpIncludeInspection */
    if ( 
        ! $files->isDir() 
        && $extension === $files->getExtension()
    )
        $html[] = $files->getRealPath();
}

Sie können dann ganz einfach Ihr endgültiges MarkUp erstellen, indem Sie z. native PHPs explode() Funktion:

printf(
     "<ul><li>%s</li></ul>",
     explode( "</li><li>", $html )
);

Beachten Sie, dass wp_upload_dir() die folgenden Funktionen ausführt und daher je nach Umgebung unterschiedlich ist und entweder die Standardeinstellungen oder die sorgfältig in Ihrer wp-config.php-Datei festgelegten Konstanten benötigt.

Abhängig von der Installation einzelner oder mehrerer Standorte wird das Verzeichnis uploads/ durch die Konstanten UPLOADBLOGSDIR, BLOGUPLOADSDIR, UPLOADS bestimmt.

Wenn Sie mehrere Verzeichnisse in einer Schleife verwalten möchten, sollten Sie statt des \FilesystemIterator auch ein RecursiveDirectoryIterator verwenden. Sie können diesen Iterator dann in eine RecursiveIteratorIterator für die Schleife einschließen. Der Directory Iterator erbt Methoden von \FilesystemIterator, die wiederum von \DirectoryIterator erben. Lesen Sie daher die PHP -Dokumente sorgfältig durch, um das volle Potenzial und die verfügbaren Möglichkeiten zu ermitteln.

Das heißt, Sie können, wie im ersten Beispiel zu sehen, Ihren Ordner uploads symbolisieren und ihn außerhalb der WordPress-Kernordner , den Sie heruntergeladen haben, behalten. Grund dafür wäre z.B.

  • automatisierte Bereitstellungen
  • automatisierte Builds,
  • builds erstellt mit Composer,
  • versionskontrollierter WordPress-Kern,
  • separate Dateisystem-Backups (oder rsync-ed) für Ihre Uploads

All dies hängt natürlich stark von Ihrem Setup ab, und Sie müssen hier viele verschiedene Setups abrufen, falls Sie planen, Code öffentlich zu verbreiten, der genau das tut, was Sie benötigen.

ProTip: Geben Sie nur JSON-Daten zurück, falls dies das Ergebnis einer AJAX -Dateisystemabfrage ist.

ProTip: Sie können \DirectoryIterators Methoden getMTime() verwenden, um das letzte Mal abzurufen, an dem eine Datei geändert wurde, und getATime() , um das letzte Mal abzurufen, an dem auf eine Datei zugegriffen wurde.

Datenbank- und Dateisystemabfrage

Die zweite Methode besteht darin, einen \WP_Query zu verwenden und nach einem MIME-Typ zu fragen:

$files = new \WP_Query( [
    'post_type'      => 'attachment',
    'post_mime_type' => 'application/pdf',
] );

Jetzt können Sie alle $files -Elemente durchlaufen und haben tatsächlich \WP_Post -Elemente zur Hand. Dies bedeutet, dass Sie jede Methode verwenden können, die Sie für normale Posts wie get_the_ID() , the_title() usw. verwenden können.

Punkt ist, dass Sie jetzt nicht nur das Dateisystem treffen, sondern auch die Datenbank, die langsam ist. Denken Sie daran, wenn Sie diesen Weg gehen. Sie sollten das wahrscheinlich nicht für alle tun Anhänge auf einmal. Besser paginieren Sie die Abfrage mit einem offset und dem entsprechenden pre_get_posts-Filter (und entfernen Sie den Rückruf direkt danach).

Denken Sie auch daran, dass der application/pdf MIME-Typ der RFC 3778 -Standard ist, was bedeutet, dass Sie sich darauf verlassen können - solange es keine Erweiterung für den PDF -Typ und einen Nicht-Standard gibt. " X "-Token in Gebrauch, was es" unregistriert "machen würde, was nicht so ungewöhnlich ist. Weitere Informationen in der RFC 2045 Papier .

x-token: =

In voller Länge:

Über diese Syntax hinaus besteht die einzige syntaktische Einschränkung für die Definition von Untertypnamen darin, dass deren Verwendung nicht in Konflikt stehen darf. Das heißt, es wäre unerwünscht, zwei verschiedene Communities zu haben, die "Content-Type: application/foobar" verwenden, um zwei verschiedene Dinge zu bedeuten. Der Prozess der Definition neuer Medienuntertypen soll also kein Mechanismus zur Auferlegung von Beschränkungen sein, sondern lediglich ein Mechanismus zur Bekanntmachung ihrer Definition und Verwendung. Es gibt daher zwei akzeptable Mechanismen zum Definieren neuer Medienuntertypen:

und dann im Detail:

Private Werte (beginnend mit "X-") können bilateral zwischen zwei kooperierenden Agenten ohne externe Registrierung oder Standardisierung definiert werden. Solche Werte können nicht registriert oder standardisiert werden.

Fazit

Persönlich würde ich die Abfrage nach Dateitypen nur verwenden, wenn ich die Titel- und Metadaten benötige, die Benutzer beim Hochladen von Dateien hinzugefügt haben. Erfahrungsgemäß ist die Benutzeroberfläche immer noch verwirrend und die Daten werden nur selten vervollständigt. Verwenden Sie es auch - wieder - nur, wenn Sie diese Daten wirklich benötigen.

2
kaiser