web-dev-qa-db-fra.com

Lister et afficher dynamiquement les fichiers pdf téléchargés

Je souhaite afficher tous les PDF d'une page WordPress spécifique. Je souhaite exactement que les PDF documents soient téléchargés à partir du panneau d'administration et je souhaite afficher tous les fichiers PDF d'une page de manière dynamique. Lorsque je télécharge un nouveau PDF à partir du panneau d'administration, le PDF s'affiche automatiquement dans l'interface. Est-il possible de faire ça?

Voici le code que j'ai essayé:

<?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

Possibilités de récupérer des pièces jointes

WordPress enregistre non seulement les fichiers sur un disque physique, mais également le type de poste attachment dans votre base de données MySQL/MariaDB. Cela signifie que vous avez deux possibilités pour rechercher des fichiers téléchargés et que vous devez choisir ce dont vous avez besoin dans quel scénario/contexte.

Système de fichiers uniquement

Pour parcourir tous les fichiers ou un type spécifique dans un répertoire spécifique, vous pouvez utiliser le \FilesystemIterator (PHP 5.3+ requis), puis envoyez simplement les résultats dans une Array[]. Dans l'exemple suivant, nous parcourons tous les fichiers PDF du répertoire déterminé par wp_upload_dir() _ / la source .

$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();
}

Vous pouvez ensuite créer facilement votre MarkUp final en utilisant, par exemple, des exemples. PHP natif explode() fonction:

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

N'oubliez pas que wp_upload_dir() effectue les opérations suivantes et diffère donc d'un environnement à l'autre. Vous devez définir les paramètres par défaut ou définir une constante avec soin dans votre fichier wp-config.php.

Selon les installations uniques ou multisites, le répertoire uploads/ est déterminé par les constantes UPLOADBLOGSDIR, BLOGUPLOADSDIR, UPLOADS.

De plus, si vous souhaitez boucler plusieurs répertoires, utilisez plutôt RecursiveDirectoryIterator au lieu de \FilesystemIterator. Vous pouvez ensuite envelopper cet Iterator dans une RecursiveIteratorIterator pour le bouclage. Directory Iterator hérite des méthodes de \FilesystemIterator, qui hérite à nouveau de \DirectoryIterator. Vous devez donc lire attentivement la documentation PHP pour voir tout le potentiel et les possibilités que vous avez sous la main.

Cela signifie que vous pouvez, comme dans le premier exemple, créer un lien symbolique vers votre dossier uploads et le conserver en dehors des dossiers principaux de WordPress que vous avez téléchargés. La raison pour cela serait par exemple.

  • déploiements automatisés
  • des constructions automatisées,
  • les constructions faites en utilisant Composer,
  • version contrôlée de WordPress,
  • des sauvegardes séparées du système de fichiers (ou rsync-ed) pour vos téléchargements

Bien entendu, tout cela dépend fortement de votre configuration et vous aurez besoin de saisir beaucoup de configurations différentes au cas où vous envisagiez de distribuer publiquement du code qui fasse ce que vous avez besoin de faire.

ProTip: Envisagez de ne renvoyer que des données JSON au cas où il s'agit du résultat d'une requête de système de fichiers AJAX.

ProTip: Vous pouvez utiliser les méthodes \DirectoryIterators getMTime() pour obtenir la dernière modification d'un fichier et getATime() pour obtenir le dernier accès au fichier.

Requête base de données et système de fichiers

La deuxième méthode consiste à utiliser un \WP_Query et une requête pour un type MIME:

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

Vous pouvez maintenant parcourir tous les $files et disposer des éléments \WP_Post entre vos mains. Cela signifie que vous pouvez utiliser la méthode de votre choix pour les publications normales, telles que get_the_ID() , the_title(), etc.

Le fait est que vous ne frappez pas seulement le système de fichiers maintenant, mais aussi la base de données, qui est lente. Gardez cela à l'esprit lorsque vous empruntez cette route. Vous devriez probablement ne pas faire cela pour tous pièces jointes à la fois. Mieux paginez la requête en utilisant une variable offset et le filtre pre_get_posts approprié (puis supprimez le rappel immédiatement après).

Notez également que le type MIME application/pdf est le standard RFC 3778 , ce qui signifie que vous pouvez vous en fier - tant qu’il n’ya pas d’extension au type PDF et un fichier non standard " X "- utilisé en cours d'utilisation, ce qui le rendrait" non enregistré ", ce qui n'est pas si rare. Plus d'informations dans l'article RFC 2045 .

x-token: =

En pleine longueur:

Au-delà de cette syntaxe, la seule contrainte syntaxique à la définition des noms de sous-types est le souhait que leurs utilisations ne doivent pas entrer en conflit. Autrement dit, il ne serait pas souhaitable que deux communautés différentes utilisent "Content-Type: application/foobar" pour signifier deux choses différentes. Le processus de définition des sous-types de nouveaux médias n’est donc pas destiné à être un mécanisme permettant d’imposer des restrictions, mais simplement un mécanisme permettant de rendre publique leur définition et leur utilisation. Il existe donc deux mécanismes acceptables pour définir les sous-types de nouveaux médias:

et ensuite en détail:

Les valeurs privées (commençant par "X-") peuvent être définies de manière bilatérale entre deux agents coopérants sans enregistrement extérieur ni normalisation. De telles valeurs ne peuvent pas être enregistrées ou normalisées.

Conclusion

Personnellement, je n’utiliserais la requête pour les types de fichiers que si j’ai besoin du titre et des métadonnées ajoutées par les utilisateurs lorsqu’ils téléchargent des fichiers. Par expérience, l'interface utilisateur est encore source de confusion et les gens complètent rarement ces ensembles de données. Aussi - encore une fois - ne l’utilisez que si vous avez vraiment besoin de ces données.

2
kaiser