动态列出和显示上传的pdf文件

时间:2016-01-14 作者:Gautam Chawla

我想显示特定WordPress页面的所有PDF。我确实希望PDF文档将从管理面板上载,并且我希望在前端动态显示页面中的所有PDF。当我从管理面板上传新的PDF时,PDF将自动显示在前端。有可能做到吗?

以下是我尝试的代码:

<?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 个回复
SO网友:kaiser

获取附件的可能性WordPress不仅将文件保存到物理磁盘,而且attachment 将类型发布到MySQL/MariaDB数据库中。这意味着您有两种可能查询上传的文件,并且您必须选择在哪个场景/上下文中需要什么。

仅文件系统要循环遍历特定目录中的所有文件或特定类型,可以使用\\FilesystemIterator (需要PHP 5.3以上),然后只需将结果推送到Array/[]. 在下面的示例中,我们将遍历由确定的目录中的所有PDF文件wp_upload_dir() 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();
}
然后,您可以轻松地使用for(例如,本机PHP)创建最终标记explode() 功能:

printf(
     "<ul><li>%s</li></ul>",
     explode( "</li><li>", $html )
);
请记住wp_upload_dir() 以下内容是否因环境而异,需要在wp-config.php 文件

根据单站点与多站点的安装情况uploads/ 目录,由确定UPLOADBLOGSDIR, BLOGUPLOADSDIR, UPLOADS 常量。

此外,如果您想循环多个目录,您需要使用RecursiveDirectoryIterator 而不是\\FilesystemIterator. 然后可以将此迭代器包装在RecursiveIteratorIterator 用于循环。目录迭代器从继承方法\\FilesystemIterator, 再次继承自\\DirectoryIterator, 因此,您应该仔细阅读PHP文档,以了解手边的全部潜力和可能性。

这意味着,如第一个示例所示,可以将uploads 文件夹并保存outside the WordPress core folders 您下载的。原因可能是:。

自动化部署自动化构建,使用Composer、版本控制的WordPress core完成构建,上载时需要单独的文件系统备份(或rsync-ed)……所有这些当然高度取决于您的设置,您需要在这里捕获许多不同的设置,以防您计划公开分发执行所需操作的代码。

ProTip: 考虑只返回JSON数据,以防这是AJAX文件系统查询的结果。

ProTip: 您可以使用\\DirectoryIterators方法getMTime() 获取上次修改文件的时间,以及getATime() 获取上次访问文件的时间。

数据库和文件系统查询第二种方法是使用\\WP_Query 并查询MIME类型:

$files = new \\WP_Query( [
    \'post_type\'      => \'attachment\',
    \'post_mime_type\' => \'application/pdf\',
] );
现在您可以循环所有$files 事实上\\WP_Post 元素在您手中。这意味着你可以使用任何方法,你可以在正常的帖子上使用,比如get_the_ID(), the_title(), 等

关键是,您现在不仅要访问文件系统,还要访问数据库,这很慢。走这条路的时候要记住这一点。你可能应该not do that for all 立即添加附件。较好的paginate the query 使用offset 以及适当的pre_get_posts 筛选(然后立即删除回调)。

还要记住application/pdf MIME类型是RFC 3778 标准,这意味着您可以依赖它–只要没有对PDF类型的扩展和非标准;X“-正在使用令牌,这将使其;“未注册”;,这并不罕见。更多信息,请参阅RFC 2045 paper.

x标记:=<;“两个字符”;X-“X”;或“或”;x-“x”;以任何标记紧随其后,没有中间的空格>;

全长:

除了这种语法之外,子类型名称定义的唯一语法约束是希望它们的使用不能冲突。也就是说,不希望两个不同的社区使用;内容类型:应用程序/foobar“;意味着两种不同的东西。因此,定义新媒体子类型的过程并不是一种施加限制的机制,而只是一种宣传其定义和使用的机制。因此,定义新媒体子类型有两种可接受的机制:

然后详细介绍:

私有值(以“X-”开头)可在两个合作代理之间进行双边定义,无需外部注册或标准化。此类价值无法注册或标准化。

结论

我个人只会在需要用户上传文件时添加标题和元数据的情况下使用文件类型查询。根据经验,UI仍然令人困惑,人们很少完成这些数据集。同样,只有在您真正需要这些数据时才使用它。