web-dev-qa-db-ja.com

アップデートされたpdfファイルを動的に一覧表示する

特定のWordPressページのすべてのPDFを表示したいです。 PDFドキュメントを管理者パネルからアップロードし、フロントエンドの1ページにすべての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
Gautam Chawla

添付ファイルを取得する可能性

WordPressは、物理ディスクだけでなく、attachment投稿タイプをMySQL/MariaDBデータベースに保存します。これは、アップロードされたファイルを照会する2つの可能性があり、どのシナリオ/コンテキストで必要なものを選択する必要があることを意味します。

ファイルシステムのみ

特定のディレクトリ内のすべてのファイルまたは特定のタイプをループするには、\FilesystemIterator(PHP 5.3以降が必要)を使用して、結果をArray/[]にプッシュするだけです。次の例では、wp_upload_dir()で決定されたディレクトリ内のすべてのPDFファイルをループしています ソース

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

その後、たとえばを使用して最終的なMarkUpを簡単に作成できます。ネイティブPHP explode()関数:

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

wp_upload_dir()は以下を実行するため、環境ごとに異なるため、wp-config.phpファイルにデフォルトを設定するか、定数を慎重に設定する必要があります。

単一サイトとマルチサイトのインストールに応じて、UPLOADBLOGSDIRBLOGUPLOADSDIRUPLOADS定数によって決定されるuploads/ディレクトリ。

また、複数のディレクトリをループする場合は、\FilesystemIteratorの代わりに RecursiveDirectoryIterator を使用します。その後、ループのためにこの変数をRecursiveIteratorIteratorでラップできます。 Directory Iteratorは\FilesystemIteratorからメソッドを継承します。このメソッドは\DirectoryIteratorからも継承するため、PHPのドキュメントを注意深く読んで、手元にある可能性と可能性をすべて確認する必要があります。

これは、最初の例で見たように、uploadsフォルダーをシンボリックリンクし、それを保持することを意味しますWordPressコアフォルダーの外ダウンロードしたもの。その理由は例えば.

  • 自動展開
  • 自動ビルド、
  • Composerを使用して行われたビルド、
  • バージョン管理WordPressコア、
  • アップロード用に個別のファイルシステムバックアップ(またはrsync-ed)

もちろん、これはすべて設定に大きく依存するため、必要な処理を行うコードを公開する予定がある場合は、ここでさまざまな設定をキャッチする必要があります。

ProTip:これがAJAXファイルシステムクエリの結果である場合にのみJSONデータを返すことを検討してください。

ProTip:\DirectoryIteratorsメソッドを使用できます getMTime() ファイルが最後に変更された時刻を取得し、 getATime() を最後に取得しますファイルにアクセスしました。

データベースとファイルシステムのクエリ

2番目の方法は、\WP_Queryを使用し、MIMEタイプを照会することです。

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

これで、すべての$filesをループして、実際に\WP_Post要素を手に入れることができます。これは、 get_the_ID()the_title()などの通常の投稿で使用できるあらゆる方法を使用できることを意味します。

ポイントは、現在ファイルシステムにアクセスしているだけでなく、データベースにもアクセスしていることです。これは遅いです。このルートを下るときは、そのことに留意してください。おそらく、すべてに対してそうしない添付ファイルを一度に作成する必要があります。より良い クエリのページ分割offsetおよび適切なpre_get_postsフィルターを使用します(その後すぐにコールバックを削除します)。

また、application/pdf MIMEタイプは RFC 3778 標準であることに注意してください。これは、PDFの拡張子がない限り、信頼できることを意味しますタイプと使用中の非標準の「X」トークン。これにより「未登録」になりますが、これはそれほど珍しいことではありません。 RFC 2045論文 の詳細情報。

x-token:=

完全な長さ:

この構文を超えて、サブタイプ名の定義に関する唯一の構文上の制約は、それらの使用が競合してはならないという願望です。つまり、「Content-Type:application/foobar」を使用して2つの異なることを意味する2つの異なるコミュニティを持つことは望ましくありません。したがって、新しいメディアサブタイプを定義するプロセスは、制限を課すためのメカニズムではなく、その定義と使用法を公表するためのメカニズムにすぎません。したがって、新しいメディアサブタイプを定義するための2つの受け入れられるメカニズムがあります。

そして詳細に:

プライベートな値(「X-」で始まる)は、外部からの登録や標準化なしで、2つの協力するエージェント間で相互に定義できます。そのような値は登録または標準化できません。

結論

個人的には、ユーザーがファイルをアップロードするときにタイトルとメタデータを追加する必要がある場合にのみ、ファイルタイプのクエリを使用します。経験から、UIは依然として混乱を招き、人々はめったにこれらのデータセットを完成させません。また、再び-本当に必要な場合にのみ使用してください。

2
kaiser