# [メタ情報] # 識別子: 公開用スクリプト表示のphp_exe # システム名: 公開用スクリプト表示のphp # 技術種別: Misc # 機能名: Misc # 使用言語: php # 状態: 実行用 env化終了 差異正常 # [/メタ情報] 要約:このコードは、WordPress で 公開用 TXT ファイル一覧を表示・配信するショートコードとダウンロード処理を実装したものです。pmedia/scripts_pub を基点とし、サブフォルダにも対応したページ遷移型のブラウザを構築します。?pubtxt_dir= による階層移動、見出しクリックによる並び替え(名前・更新日時・サイズ)が可能で、初期ソートは「更新日時 desc → 名前 asc → サイズ asc」。@eaDir や隠しファイル、特定ファイルを除外し、.txt のみ表示します。パンくずリストを生成し、各ファイルには「閲覧」「DL」リンクを付与。?pubtxt= リクエスト時には realpath によるディレクトリトラバーサル防止を行い、UTF-8 の text/plain として配信、dl=1 でダウンロードに切替。iOS 対策として charset=UTF-8 を明示し、安全で階層対応の TXT 公開機能を提供します。 functions.php ``` /* ========================================================================= * 3) 公開用TXTリスト: [pub_txt_list] * =======================================================================*/ add_shortcode('pub_txt_list', function($atts){ $base_dir = WP_CONTENT_DIR . '/pmedia/scripts_pub'; $allowed_exts = ['txt']; $exclude_files = ['key_patterns.txt']; $exclude_dirs = ['@eaDir']; $uid = 'pub-txt-' . (function_exists('wp_generate_uuid4') ? wp_generate_uuid4() : uniqid()); if (!is_dir($base_dir)) return '

一覧ディレクトリが存在しません。

'; // ページURL(この固定ページ自身)を動的取得 $page_url = get_permalink(); $rel_dir = (isset($_GET['pubtxt_dir']) && is_string($_GET['pubtxt_dir'])) ? trim(str_replace('\\','/', $_GET['pubtxt_dir']), '/') : ''; if ($rel_dir === '.' || strpos($rel_dir, '..') !== false || strpos($rel_dir, "\0") !== false) $rel_dir = ''; $current_dir = $base_dir . ($rel_dir ? '/'.$rel_dir : ''); if (!is_dir($current_dir)) $current_dir = $base_dir; $validSort = ['name','mtime','size']; $sort = (isset($_GET['sort']) && in_array($_GET['sort'], $validSort, true)) ? $_GET['sort'] : 'mtime'; $order = (isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc','desc'], true)) ? strtolower($_GET['order']) : 'desc'; $nextOrder = function($key) use ($sort,$order){ if ($key !== $sort) return ($key === 'mtime') ? 'desc' : 'asc'; return ($order === 'asc') ? 'desc' : 'asc'; }; $fmt = function($f,$ts){ if(function_exists('wp_date')) { $s=wp_date($f,$ts); if($s) return $s; } return date_i18n($f,$ts); }; $items = []; foreach (scandir($current_dir) as $name) { if ($name === '.' || $name === '..') continue; if ($name[0] === '.' || in_array($name, $exclude_dirs, true)) continue; $full = $current_dir . '/' . $name; $rel = ltrim($rel_dir . '/' . $name, '/'); $mtime = @filemtime($full) ?: 0; if (is_dir($full)) { $items[] = [ 'type'=>'dir','name'=>$name,'rel'=>$rel,'mtime'=>$mtime,'size'=>0, 'href'=>add_query_arg(['pubtxt_dir'=>$rel,'sort'=>null,'order'=>null], $page_url) ]; } elseif (is_file($full)) { $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if (!in_array($ext, $allowed_exts, true)) continue; if (in_array($name, $exclude_files, true)) continue; $items[] = [ 'type'=>'file','name'=>$name,'rel'=>$rel,'mtime'=>$mtime,'size'=>(@filesize($full) ?: 0), 'view'=>add_query_arg(['pubtxt'=>$rel], $page_url), 'dl'=>add_query_arg(['pubtxt'=>$rel,'dl'=>'1'], $page_url) ]; } } if (!$items) return '

対象ファイルがありません。

'; usort($items, function($a,$b) use($sort,$order){ $cmp = ($sort==='name') ? strcasecmp((string)$a[$sort],(string)$b[$sort]) : ($a[$sort] <=> $b[$sort]); return ($order==='asc') ? $cmp : -$cmp; }); $latest = max(array_column($items,'mtime')); ob_start(); ?>
root /
©
名前 更新日時 サイズ 操作
..戻る