예배 찬양 자료실
장수와 제목으로 검색할 수 있고, PDF / PPT / TXT를 미리보기 또는 다운로드할 수 있습니다.
전체 보기
PDF 있는 항목
PPT 있는 항목
TXT 있는 항목
총 645개 항목
if (!defined(‘ABSPATH’)) exit;
/**
* 예배 찬양 자료실 통합 코드
*
* 기능
* 1) hymn 폴더의 PDF / PPT / PPTX / TXT를 자동 수집
* 2) 장수 + 제목으로 검색
* 3) PDF는 iframe 미리보기
* 4) PPT 미리보기 버튼은 같은 제목의 PDF가 있으면 PDF로 미리보기
* (브라우저에서 PPT 직접 미리보기가 불안정하기 때문)
* 5) TXT는 워드프레스를 거쳐 UTF-8 BOM으로 다시 내려보내서
* 다운로드 시 한글이 덜 깨지게 처리
*
* 사용 방법
* – Code Snippets 플러그인에 이 코드 전체를 넣고 활성화
* – 페이지 본문에
예배 찬양 자료실
장수와 제목으로 검색할 수 있고, PDF / PPT / TXT를 미리보기 또는 다운로드할 수 있습니다.
전체 보기
PDF 있는 항목
PPT 있는 항목
TXT 있는 항목
총 645개 항목
입력
*
* 파일명 권장 형식
* 001장-만복의-근원-하나님.pdf
* 001장-만복의-근원-하나님.ppt
* 001장-만복의-근원-하나님.txt
*/
/**
* TXT 다운로드/미리보기용 URL 생성
*/
function hymn_library_txt_proxy_url($attachment_id, $mode = ‘download’) {
return add_query_arg([
‘hymn_txt’ => 1,
‘attachment_id’ => intval($attachment_id),
‘mode’ => $mode,
], home_url(‘/’));
}
/**
* TXT를 워드프레스가 대신 내려보냄
* – UTF-8 BOM 보정
* – Content-Disposition 보정
* – 미리보기 / 다운로드 둘 다 처리
*/
add_action(‘template_redirect’, function () {
if (empty($_GET[‘hymn_txt’]) || empty($_GET[‘attachment_id’])) {
return;
}
$attachment_id = intval($_GET[‘attachment_id’]);
$mode = isset($_GET[‘mode’]) ? sanitize_text_field($_GET[‘mode’]) : ‘download’;
$url = wp_get_attachment_url($attachment_id);
if (!$url) {
wp_die(‘TXT 파일을 찾을 수 없습니다.’);
}
$response = wp_remote_get($url, [
‘timeout’ => 30,
‘redirection’ => 5,
]);
if (is_wp_error($response)) {
wp_die(‘TXT 파일을 불러오지 못했습니다.’);
}
$body = wp_remote_retrieve_body($response);
if ($body === ”) {
wp_die(‘TXT 내용이 비어 있습니다.’);
}
// 기존 BOM 제거
if (substr($body, 0, 3) === “\xEF\xBB\xBF”) {
$body = substr($body, 3);
}
// 인코딩 추정 후 UTF-8 변환
$encoding = mb_detect_encoding($body, [‘UTF-8’, ‘CP949’, ‘EUC-KR’, ‘ASCII’, ‘ISO-8859-1’], true);
if ($encoding === false) {
$encoding = ‘UTF-8’;
}
$utf8 = @mb_convert_encoding($body, ‘UTF-8’, $encoding);
if ($utf8 === false) {
$utf8 = $body;
}
// 윈도우 메모장 호환 위해 BOM 추가
$output = “\xEF\xBB\xBF” . $utf8;
$filename = get_the_title($attachment_id);
if (!$filename) {
$filename = basename(parse_url($url, PHP_URL_PATH));
}
if (strtolower(pathinfo($filename, PATHINFO_EXTENSION)) !== ‘txt’) {
$filename .= ‘.txt’;
}
nocache_headers();
header(‘Content-Type: text/plain; charset=UTF-8’);
if ($mode === ‘preview’) {
header(‘Content-Disposition: inline; filename=”‘ . rawurlencode($filename) . ‘”; filename*=UTF-8\’\” . rawurlencode($filename));
} else {
header(‘Content-Disposition: attachment; filename=”‘ . rawurlencode($filename) . ‘”; filename*=UTF-8\’\” . rawurlencode($filename));
}
echo $output;
exit;
});
add_shortcode(‘hymn_library’, function () {
$attachments = get_posts([
‘post_type’ => ‘attachment’,
‘post_status’ => ‘inherit’,
‘posts_per_page’ => -1,
‘orderby’ => ‘title’,
‘order’ => ‘ASC’,
]);
$items = [];
foreach ($attachments as $attachment) {
$url = wp_get_attachment_url($attachment->ID);
if (!$url) continue;
if (strpos($url, ‘/hymn/’) === false) continue;
$path = parse_url($url, PHP_URL_PATH);
$filename = basename($path);
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if (!in_array($ext, [‘pdf’, ‘ppt’, ‘pptx’, ‘txt’], true)) continue;
$base = preg_replace(‘/\.(pdf|ppt|pptx|txt)$/i’, ”, $filename);
$normalized = preg_replace(‘/-\d+$/’, ”, $base);
$display = str_replace(‘-‘, ‘ ‘, $normalized);
if (!isset($items[$normalized])) {
preg_match(‘/^(\d{1,3})장/u’, $display, $m);
$num = isset($m[1]) ? intval($m[1]) : 9999;
$title_only = trim(preg_replace(‘/^\d{1,3}장\s*/u’, ”, $display));
$items[$normalized] = [
‘base’ => $normalized,
‘number’ => $num,
‘display’ => $display,
‘title’ => $title_only,
‘pdf’ => ”,
‘pdf_id’ => 0,
‘ppt’ => ”,
‘ppt_id’ => 0,
‘txt’ => ”,
‘txt_id’ => 0,
];
}
if ($ext === ‘pdf’ && !$items[$normalized][‘pdf’]) {
$items[$normalized][‘pdf’] = $url;
$items[$normalized][‘pdf_id’] = $attachment->ID;
}
if (($ext === ‘ppt’ || $ext === ‘pptx’) && !$items[$normalized][‘ppt’]) {
$items[$normalized][‘ppt’] = $url;
$items[$normalized][‘ppt_id’] = $attachment->ID;
}
if ($ext === ‘txt’ && !$items[$normalized][‘txt’]) {
$items[$normalized][‘txt’] = $url;
$items[$normalized][‘txt_id’] = $attachment->ID;
}
}
$items = array_values($items);
usort($items, function ($a, $b) {
if ($a[‘number’] === $b[‘number’]) {
return strcmp($a[‘title’], $b[‘title’]);
}
return $a[‘number’] <=> $b[‘number’];
});
ob_start();
?>
예배 찬양 자료실
장수와 제목으로 검색할 수 있고, PDF / PPT / TXT를 미리보기 또는 다운로드할 수 있습니다.
전체 보기
PDF 있는 항목
PPT 있는 항목
TXT 있는 항목
총 개 항목