고유 주소를 %post_id% 형식으로 사용할 때에는 글을 작성할 때 슬러그를 편집할 수 없습니다.
아래 코드를 사용하면 /%post_id% 로 접속 되면서, 직접 설정한 슬러그로 접속할 수 있습니다. 이 때 /%post_id% 로 자동 리다렉션 됩니다.
슬러그 편집 활성화 코드
/**
* 1. 시스템을 속여서 슬러그 편집 기능을 강제로 부활 (핵심)
*/
add_filter('get_sample_permalink', function($permalink, $post_id, $title, $name, $post) {
// 고유주소가 숫자형이라도, 편집기에게는 "이거 슬러그 편집 가능한 구조야"라고 속임
$permalink[0] = home_url('/') . '%postname%/';
return $permalink;
}, 999, 5);
/**
* 2. 슬러그 입력창 UI를 강제로 화면에 고정 (CSS)
*/
add_action('admin_head', function() {
echo '<style>
/* 블록 편집기(구텐베르크) 슬러그 필드 강제 노출 */
.edit-post-post-link__preview-container,
.edit-post-post-link__preview-label + .components-button,
.post-url-component,
.editor-post-permalink__edit {
display: flex !important;
visibility: visible !important;
}
</style>';
});
/**
* 3. REST API 저장 단계에서 슬러그가 증발하는 것 방지
*/
add_filter('rest_pre_insert_post', function($prepared_post, $request) {
$slug = $request->get_param('slug');
if (!empty($slug)) {
$prepared_post->post_name = sanitize_title($slug);
}
return $prepared_post;
}, 10, 2);
/**
* 4. 슬러그 접속 시 ?p=id 가 아닌 정식 숫자 주소로 깔끔하게 연결
*/
add_action('template_redirect', function() {
// 글 상세 페이지에서만 작동
if (is_singular('post')) {
$post_id = get_the_ID();
$requested_uri = $_SERVER['REQUEST_URI'];
// 만약 주소창에 ?p=id 가 보인다면, 정식 숫자 주소(/123/)로 강제 이동
if (isset($_GET['p']) || strpos($requested_uri, '?p=') !== false) {
wp_redirect(home_url("/$post_id/"), 301);
exit;
}
}
});코드를 적용하는 방법은 플러그인으로 만들거나 테마 파일로 만드는 방법이 있습니다.
플러그인으로 만드려면 /wp-content/plugins/my-custom-plugin/my-custom-plugin.php 형식의 파일을 만들고 코드를 넣고 저장합니다. 플러그인을 활성화하면 적용됩니다.
테마 파일로 만드려면 /wp-content/themes/사용중인 테마-child/function.php 파일에 코드를 넣으면 됩니다. 차일드 테마를 사용하는 것을 권장합니다.
적용 결과
글을 편집할 때, 글 속성에서 슬러그를 클릭하면 아래와 같이 편집 가능한 슬러그 설정 박스가 나타납니다.

