妙なところで躓いたのでメモ。
調べ切れておらず、理解し切れていない部分もありますので、とりあえず現時点でのメモとして。
マニュアルを元にしたような情報はいろいろあるのですが、語句の意味が理解できないとそれすら迷う要因となり、無駄に時間をくいましたので…。
前提と実現したいこと
前提は以下の通り。
- WordPressをインストールしたフォルダ(/wp/)にダウンロードファイルを入れる専用フォルダを(/download/)を作成
- downloadフォルダにはzipを入れる
- zipファイルの名称は各投稿画面にてカスタムフィールドで指定する
- カスタムフールドの「名前」は「zipname」
続いて実現したいことは以下の通り。
- 該当のzipファイルのファイルサイズを表示
実際にはファイルサイズを表示するだけなので、前提はあまり気にしなくともよいかと思います。
つまりはほとんどWordPressに限定する意味が無いのですが、ファイル名の指定部分だけカスタムフィールドを利用しているので、その一点で「WordPress」をタイトルにつけています。
コード
作ったのは以下のコードです。
なお、functions.phpに関数を作り、single.phpで呼び出す感じにしています。
ので、まずはfunctions.phpから。
function zip_file_size($filename){
$path = $_SERVER['DOCUMENT_ROOT'] . '/wp/download/' . $filename . '.zip';
$filesize = filesize($path);
$s = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
$e = floor(log($filesize)/log(1024));
echo 'File Size: ' . sprintf('%.1f '.$s[$e], ($filesize/pow(1024, floor($e))));
}
上記は「ファイルサイズを取得し、単位を出力するスクリプト」の記事を参考にさせていただきました。
続いて呼び出す側のsigle.php。
zip_file_size(post_custom('zipname'));
これだけです。
つまずいた点
終わってみれば簡単なのですが、できるまでは以下の事柄でつまずきました。
filesize関数
phpでファイルサイズの取得にはfilesize関数を用いますが、php.netさんのfilesizeのページをから該当箇所を引用します。
int filesize ( string $filename )
なお、調べた際のurlを紛失してまったのですが、「Content-Length」はファイルサイズと同一ではないと見ました。
この辺まだ理解できていません…。
size_format関数
WordPressには、size_format関数という便利なものがあります。
どういうものかという部分を、コーデックスの「関数リファレンス/size format」から引用します。
※原文参照を推奨されていますので「Function Reference/size format」もご覧下さい。
バイト数を人間に読みやすい単位にフォーマットする。
ファイルサイズに基づいてKBやMBなどを自動で丸めて表示してくれ便利ですが、丸めすぎてる感がありました。例えば、1.9MBが2MBで表示されるなどです。
そこを制御するためかオプションが存在します。
$decimals
(int) (オプション) 小数点以下の桁数の精度。非推奨。
ところが、引用部分にあるように「非推奨」。ちょっと悩みましたが、非推奨は使いたくないのでsize_format関数は諦めました。
結び
jpgなどの画像やpdfでもなく、zipが対象のためzip関数も調べたりしましたが、filesize関数でよかったようで。
パスの指定や$filenameに渡す値などでも勘違いからつまづきましたので、無駄に時間がかりました…。
1人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。