라공에디션

썰타래 게시판 마개조 기록(6): 썰타래 게시판 내부 공유 시 미리보기 카드 적용

<span class="sv_member">니루</span>
니루 @tabom0w0
2026-06-12 23:36

clipboard_1781274958013.png

썰타래 게시판의 경우 기존의 render_internal_post_card($bo_table, $wr_id) 함수로는 $tarae_id 값까지 반영되지 않아서 미리보기 카드가 제대로 만들어지지도 않고 링크도 어중간하게 되길래  $tarae_id까지 가져와서 미리보기 카드를 렌더링하도록 render_internal_tarae_card($bo_table, $wr_id, $tarae_id) 함수를 추가했다.

새 함수 적용 시 본문 내용까지 뜨고, 링크도 tarae_id 값까지 포함되어 정확하게 된다.

clipboard_1781274429483.png


board_common.lib.php 을 수정했다.

SCENE(1) render_internal_tarae_card 함수 추가

render_internal_post_card 함수 아래쪽에 추가한다.

새로운 함수가 기존 함수의 {} 사이에 들어가지 않도록 주의할 것!

function render_internal_tarae_card($bo_table, $wr_id, $tarae_id)
{
    global $g5;

    $bo_table = preg_replace('/[^a-zA-Z0-9_]/', '', $bo_table);
    $wr_id = (int)$wr_id;
    $tarae_id = (int)$tarae_id;
    if (!$bo_table || !$wr_id || !$tarae_id) return false;

    $write_table = $g5['write_prefix'] . $bo_table;

    // 테이블 존재 확인
    $table_check = sql_fetch("SHOW TABLES LIKE '{$write_table}'");
    if (!$table_check) return false;

    // 타래 ID(tarae_id)를 기준으로 본문 데이터를 조회합니다.
    // 타래 글이 해당 테이블의 wr_id 번호로 직접 저장되는 구조를 기준으로 작성했습니다.
    $row = sql_fetch("SELECT wr_id, wr_subject, wr_content, wr_name, wr_img,
                         wr_datetime, mb_id
                  FROM {$write_table}
                  WHERE wr_id = '{$tarae_id}'");
    if (!$row) return false;

    // ch_name 컬럼이 있으면 사용 (기존 로직 유지)
    $ch_name = '';
    $col_check = sql_fetch("SHOW COLUMNS FROM {$write_table} LIKE 'ch_name'");
    if ($col_check) {
        $ch_row = sql_fetch("SELECT ch_name FROM {$write_table} WHERE wr_id = '{$tarae_id}'");
        if ($ch_row && !empty($ch_row['ch_name'])) $ch_name = $ch_row['ch_name'];
    }

    // 게시판 이름
    $board = sql_fetch("SELECT bo_subject FROM {$g5['board_table']} WHERE bo_table = '" . sql_real_escape_string($bo_table) . "'");

    // 작성자: ch_name > wr_name
    $author = ($ch_name ?: $row['wr_name']) ?: '익명';

    // 썸네일: 타래 글의 wr_img > 첫 번째 첨부 이미지
    $thumb = '';
    if (!empty($row['wr_img'])) {
        if (strpos($row['wr_img'], 'http') === 0) {
            $thumb = $row['wr_img'];
        } else {
            $thumb = G5_DATA_URL . '/file/' . $bo_table . '/' . $row['wr_img'];
        }
    } else {
        $file = sql_fetch("SELECT bf_file FROM {$g5['board_file_table']}
                       WHERE bo_table='" . sql_real_escape_string($bo_table) . "'
                       AND wr_id='{$tarae_id}' AND bf_type IN (1,2,3)
                       ORDER BY bf_no LIMIT 1");
        if ($file) $thumb = G5_DATA_URL . '/file/' . $bo_table . '/' . $file['bf_file'];
    }

    // 발췌 ({이미지:N}, {비디오:N} 플레이스홀더 및 해시태그 제거 후 추출)
    $raw_for_excerpt = preg_replace('/\{(?:이미지|비디오|tile)(?::\d+)?\}/u', '', $row['wr_content']);
    $raw_for_excerpt = preg_replace('/#[\w가-힣]+/u', '', $raw_for_excerpt);

    $excerpt = cut_str(strip_tags($raw_for_excerpt), 120);

    // 핵심 변경 사항: 생성되는 카드 이동 주소에 tarae_id 파라미터를 유지합니다.
    $url = G5_BBS_URL . '/board.php?bo_table=' . $bo_table . '&wr_id=' . $wr_id . '&tarae_id=' . $tarae_id;

    // HTML 구조 생성 (클래스명에 post-card와 함께 tarae-card를 추가하여 필요시 스타일을 분리할 수 있게 했습니다)
    $html = '<a href="' . htmlspecialchars($url, ENT_QUOTES) . '" class="post-card tarae-card">';
    if ($thumb) {
        $html .= '<span class="post-card-thumb"><img src="' . htmlspecialchars($thumb, ENT_QUOTES) . '" alt="" loading="lazy"></span>';
    }
    $html .= '<span class="post-card-body">';

    // 타래 글에 제목이 없거나 원본 글 제목을 따라가는 경우를 대비해 처리
    $subject = $row['wr_subject'] ? $row['wr_subject'] : '타래 답글';
    $html .= '<span class="post-card-title">' . htmlspecialchars($subject, ENT_QUOTES) . '</span>';

    if ($excerpt) {
        $html .= '<span class="post-card-excerpt">' . $excerpt . '</span>';
    }
    $html .= '<span class="post-card-meta">';
    $html .= '<span class="post-card-author">' . htmlspecialchars($author, ENT_QUOTES) . '</span>';
    if ($board) {
        $html .= ' · <span class="post-card-board">' . htmlspecialchars($board['bo_subject'], ENT_QUOTES) . '</span>';
    }
    $html .= '</span></span></a>';

    return $html;
}


SCENE(2) 미리보기 카드 조건문 추가


// 짧은 내부 공유 URL → 미리보기 카드
if (function_exists('render_internal_short_post_card')) {
    $card = render_internal_short_post_card($url);
    if ($card) return $card;
}

이 부분 바로 아래에 아래 코드를 추가한다.

// 내부 썰타래 게시글 URL → 미리보기 카드
        if (strpos($url, 'board.php') !== false && strpos($url, 'tarae_id=') !== false) {
            if (function_exists('render_internal_tarae_card')) {
                $parsed_url = parse_url($url);
                if (isset($parsed_url['query'])) {
                    parse_str(str_replace('&amp;', '&', $parsed_url['query']), $query_params);

                    $bo_table = $query_params['bo_table'] ?? '';
                    $wr_id = isset($query_params['wr_id']) ? (int)$query_params['wr_id'] : 0;
                    $tarae_id = isset($query_params['tarae_id']) ? (int)$query_params['tarae_id'] : 0;

                    if ($bo_table && $wr_id && $tarae_id) {
                        $card = render_internal_tarae_card($bo_table, $wr_id, $tarae_id);
                        if ($card) return $card;
                    }
                }
            }
        }


댓글목록

등록된 댓글이 없습니다.