요즘 내 블로그에 이것저것 건드리는 게 많아졌다. 테마를 TwentyTwenty로 바꾸고 나서 여러 가지 바꾸고 있다. 일단 이 테마, 글씨가 커도 너무 크다. 장난하나? 싶을 정도로 크다. 글씨 크기 좀 조정하고 색상 같은 것 좀 취향에 맞게 바꾸고 스크린샷을 찍었다. 블로그 기념 사진 같은 걸로 해서 남겨 둬야지.
(더 보기…)[작성자:] changwoo
-
지메일의 ‘별’ 기능으로 이메일 업무 효율 늘리기
지메일 > 설정 > 기본 설정에 보면 아래 그림처럼 “별” 항목이 있습니다. 별을 클릭하면 순서가 변경되는데, 이 별을 잘 활용하면 이메일 업무 효율이 상당히 좋아집니다. 요령을 간단하게 기록해 둡니다. 유용하게 활용되었으면 좋겠습니다.
(더 보기…) -
옵션 테이블을 수동으로 정리해 보다
블로그를 운영하는 서버가 열악해서 블로그 또한 가능한 만큼 가볍게 만들어야 한다. 그러나 운영한 기간만큼은 꽤 되어서 이런저런 시도를 꽤 했었다고 기억한다. 과연 사용량에 비해 옵션 테이블의 사이즈가 너무 커 보였다.
옵션테이블을 직접 수동으로 점검하고 정리해 봤다. 도대체 그동안 어떤 찌꺼기들이 사라지지 않고 고스란히 남아서 성능에 영향을 준 것인가? 대부분의 플러그인과 테마들은 삭제되면서 자신의 옵션을 철저하게 지우지 않는 편이다. 애초에 테마는 삭제 옵션이 없기도 하고. 대략 옵션 이름을 보면서 없어진 플러그인에서 사용했던 것들은 다 지워 보았다.
물론 프로그래머가 플러그인에서 필요하니까 옵션을 사용하지만, 좀 과한 것들이 있다. 우선 젯팩. 옵션이 젯팩 투성이였다. Enlighter 라는 코드 하이라이트 플러그인도 심각했다. 너무 많은 옵션 항목을 생성하고 있다. 그리고 테마. 테마를 이것저것 설치하고 활성하면 그 테마의 옵션, 테마가 만드는 위젯 등등 여러 값들이 생성된다.
그리고 이 값들이 지워지지 않고 영속하고 있다. 이게 문제였다. 그동안 재미삼아 여러 테마, 플러그인을 깔고 지우고를 반복했다. 그 결과 꽤 사용하지도 않지만 남아 있는 옵션들이 테이블 안에 덕지덕지 남아 있었고, 이런 값들이 워드프레스 로딩 때 같이 불려오고 있었다.
모든 값들을 다 알고 고칠 수 없겠지만 대략 접두사로 추측하여 불필요한 옵션들을 제거했다. 그리고 젯팩과 Enlighter도 사용을 해제하고 옵션 테이블에서 값을 제거해 봤다. 그 결과 관리자 페이지에서도 페이지 로딩이 좀 더 빨라진 느낌이 든다. 아마도 젯팩이 제거되어 퍼포먼스 향상이 더 컸을지도. 제대로 퍼포먼스를 비교하면서 체계적으로 진행한 것이 아니니까 확신하기는 어렵다. 그러나 옵션값을 정리한 것이 나름 의미는 있을 것으로 보인다. 한 번 실험해 볼 만한 주제가 되지 않을까?
-
트러블슈팅을 편하게! Health Check & Troubleshooting
워드프레스 사이트 이용을 하다 보면 별 희한한 버그를 만날 때가 가끔씩 있다. 뭐, 사실 대부분은 내가 짠 프로그램에서 나는 버그지만, 가끔은 진짜 서드파티 플러그인의 버그일 때도 있고 아니면 내가 만든 플러그인이 아닌 레거시에서 의도치 않은 버그가 나올 때가 있다.
이럴 때는 모든 테마와 플러그인을 완전히 끄고 하나하나 켜 가면서 범인을 색출하는 방법이 있다. 워드프레스에는 수많은 필터와 액션이 뒤엉켜 돌아가기 때문에 문제 파악이 매우 어려울 수도 있다. 그러므로 이럴 땐 기능을 꺼보면서 시작점을 찾아 보는 것이 가장 단순명료하다.
그런데 문제가 있다. 운영 중인 사이트에 함부로 플러그인과 테마를 껐다 켤 수는 없다. 사이트의 기능이 멈출 수도 있기 때문이다. 과연 이럴 때는 어떻게 해야 할까?
(더 보기…) -
워드프레스 개발자로 고인물
다른 분야의 개발자들이 얼마나 치열하게 사는지 모른다. 그들의 전문 지식은 어떤 것들인지 또 어떤 일들을 하는지 모른 채 살고 있다.
CMS 하나로도 의미가 있을 수도 있을 것이다. 또한 모든 것을 알 수는 없겠지만, 너무 모른 채 살고 있는 것 같다.
-
미립자팁: 플러그인 설문 폼 안 보고 비활성화하기
가끔 보면 플러그인 비활성화 할 때 순순히 비활성화가 되지 않고 어떤 설문 폼을 띄우는 녀석들이 있다. 이런 녀석들의 귀찮은 설문 폼을 안 보고 비활성화하는 방법이 하나 있긴 하다.
(더 보기…) -
내 이메일이 이렇게 많이 털렸구나!
패스워드에 좀 더 주의를 기울여야 한다는 자극을 받아 포스팅한다. 이전 포스트 [워드펜스 “유출된 패스워드” 경고를 실제 체험하다]에 이은 포스트이다. 최근 파이어폭스 웹브라우저를 다시 셋팅하면서 이런 배너를 발견하였다.
(더 보기…) -
페이지 목록 관리의 깨알 팁
사이트 페이지 목록을 만들 때 정돈되어 있으면 더욱 효율적입니다. 메인 페이지나 중요한 페이지를 1페이지에 빠르게 로드할 수 있다면 더 좋겠지요? 이럴 때 쓰는 것이 페이지 “순서” 속성입니다.
페이지 순서는 기본이 0입니다. 그래서 보통보다 뒤로 보내려면 양수를, 반대로 앞으로 가져오려면 음수로 둡니다. 그러면 1페이지 상위에 가장 자주 관리하는 메뉴를 먼저 볼 수 있게 되어 편리합니다.
메인 페이지나 자주 편집하는 주요 페이지를 먼저 출력해 두면 편리합니다. -
WordPress Clean Startup: 최소한의 워드프레스 시동을 보조하는 MU Plugin
보통 워드프레스 기반의 사이트에서는 쇼트코드나 빌더 요소를 활용하여 동적인 콘텐츠를 삽입합니다. 이렇게 하면 테마에서 셋팅한 헤더, 푸터, 사이드바의 구조와 UI를 가져다 편리하게 개발할 수 있습니다.
그러나 개발을 진행하다 보면 워드프레스 코어의 기본 요소는 활용하되, 그외 테마나 플러그인을 완전히 배제하여 독립된 페이지를 구축하고 싶을 때가 있을 겁니다. 이렇게 만들면 어떤 테마이든 구애받지 않는 독립적인 UI를 가질 수 있습니다.
이 때 자주 활용하는 액션이 template_redirect입니다. 테마가 동작하기 전에 다른 플러그인이 어떤 동작을 부가적으로 처리할 수 있도록 해 주는 액션입니다. 이 액션에서 웹페이지 모두를 걸어버리고 시동을 중단해 버리면 테마가 실행되지 않게 되어 원하는 모습으로 결과믈 만들 수 있는 원리입니다.
이렇게 하면 테마가 동작하지 않아 웹페이지는 한결 빠르게 동작합니다. 그런데 HTML 소스까지 자세하게 살펴보면 그다지 신통치는 않다는 것을 알 수 있습니다. 이미 여러 플러그인이 응답 메시지에 손대버렸기 때문입니다. 꽤 많은 불필요한 요소들이 헤더/푸터 사이로 덕지덕지 붙어 있고, 실행 속도가 현저히 느린 웹사이트면 여전히 실행 속도가 굼뜬 것을 체감할 수 있을 겁니다.
사실 우리가 독립적으로 구축하기로 한 웹페이지이기 때문에 다른 플러그인의 개입은 전혀 필요 없습니다. 있다 하더라도 필요한 플러그인 한둘쯤이겠지요. 그리고 코어에서 붙여 넣는 여러 태그 요소들도 그다지 필요 없는 것이 많습니다. 아무튼, 필요없는 것들이 너무 많습니다.
워드프레스를 활용하되, 최대한 헤더와 푸터에서 쓰지 않는 요소를 배제하여 웹페이지를 시동하기 위해 WordPress Clean Startup 플러그인을 제작하였습니다. 이것을 활용하면 무진장 빠른 커스텀 웹페이지를 시작할 수 있습니다.
-
워드프레스 5.2 에러 복구 기능 스터디
들어가며
워드프레스 5.2에 들어오면서 여러 개선점이 있었습니다. 릴리즈 노트에 나열된 사항 중 단연 사이트 상태 점검(Site Health Check), 치명적인 에러에서 코어 동작을 보호하는 기능 (PHP Error Protection) 이 눈에 띕니다.
사이트 동작 체크는 도구 > Site Health 에서 확인할 수 있으며, 기능 자체는 Health Check & Troubleshooting에서 많은 것을 가져온 것으로 보입니다. 코어 버전과 플러그인 버전의 차이는 문제 진단 기능(troubleshooting)의 유무로 보입니다. 이 기능에 대해서는 별도로 정리하기로 하지요. 지금까지 여러 플러그인들이 시스템 정보 수집 페이지를 각자 개발했었습니다. 이제 앞으로 이런 시스템 정보는 코어에서 잘 통합될 것으로 보입니다.
코어에 새로 추가된 사이트 정보 화면 업데이트 이후 갑자기 서버가 죽는 일. 워드프레스를 장기적으로 운영할 때 가장 골치아픈 문제일 겁니다. 코어가 아무리 안정적으로 발전한다 하더라도, 세상에 완벽은 없습니다. 언제 어디서든 잘못된 코드를 작성할 위험은 도사리고 있습니다. 어느 순간 업데이트를 끝마치고 페이지를 재접속했더니 텅 빈 화면만 나온다고 생각해 보세요. 영어권에서는 이것을 WSOD라고 부르더군요. White Screen of Death.
그렇다고 그게 무서워 업데이트를 마냥 미뤄 놓을 수는 없습니다. 아주 가끔 실수가 있다고는 하지만, 전반적으로는 업데이트란 모든 플러그인과 테마가 지금보다 더욱 편하고 좋은 환경을 만들기 위해 노력한 결과물입니다. 보안상 중요한 문제가 일어날 수도 있어 외면해서는 절대 안 되겠죠.
각설하고, 이번 워드프레스 코어 개발진이 이에 적극적으로 대응하기로 결정했나 봅니다. 5.2부터는 PHP 코드에 의도치 않은 치명적인 에러가 발생하도 무조건 WSOD 상태로 빠지지 않도록 동작합니다. 사용자에게도, 개발자에게도 매우 환영할 만한 기능입니다. 이 포스트를 통해 이 기능이 어떻게 동작하는지, 또 어떻게 에러로부터 사용자를 보호하는지 기록해 보려 합니다.
에러 보호 기능
PHP 에러 보호 기능의 핵심 중의 핵심은 아래 두 PHP 함수라고 볼 수 있습니다.
register_shutdown_function() 은 PHP가 완전히 종료하기 전에 특정 기능을 실행할 수 있도록 하는 함수입니다. 그리고 error_get_last() 함수는 PHP 실행 중 현재 시점에서 가장 마지막에 발생한 에러를 조회하는 함수입니다.
코어는 이 두 함수를 이용해 다음 과정을 실행할 것입니다.
- register_shutdown_function() 함수를 이용해 스크립트 종료 직전 에러 핸들러를 등록합니다.
- 스크립트 종료 직전 에러 핸들러가 error_get_last() 함수를 이용해 스크립트 실행 중 심각한 에러가 발생했는지 아닌지 점검합니다. 만약 별다른 에러가 없다면 임무는 여기까지입니다.
- 그러나 어떤 에러를 발견하였다면 에러 대응을 시도합니다.
아주 간략하게 3단계로 축약한 기본 개념입니다. 이 부분을 구현한 코드는 wp-includes/error-protection.php 파일의 wp_register_fatal_error_handler() 함수를 참고하시면 됩니다.
코어의 구체적인 에러 복구
에러를 만나게 되면 이 에러가 난 위치를 파악하여 테마면 테마 에러로, 플러그인 에러면 플러그인 에러로 DB 옵션 테이블에 기록합니다. 관리자에겐 복구 모드를 접근할 수 있는 링크를 이메일로 전달합니다.
복구 모드는 쿠키로 구워진 토큰값을 통해 인식됩니다. 복구 모드를 통해 관리자 패널에 접속하면 해당 사용자는 에러가 난 테마나 플러그인을 중단시킨 상태에서 접속하게 됩니다. 복구 모드에서는 그림처럼 어드민 바 상단 우측에 어드민 바임을 알리는 띠가 붙습니다. 브라우저 제목도 ‘Recovery Mode’라고 나오지요.
복구 모드 중인 관리자 화면 이 모드에서 관리자는 테마 혹은 플러그인의 에러를 확인할 수 있습니다.
테마 에러 진단. Themes 페이지 (wp-admin/themes.php)의 밑바닥에서 출력됩니다. 플러그인의 에러 진단. Plugins 페이지 (wp-admin/plugins.php)의 플러그인 목록에서 발견됩니다. 테마는 에러 메시지가 조금 불친절하군요. 반면 플러그인은 파일 몇 번째 줄에서 어떤 에러가 나오는지까지 나오네요. 테마 메시지는 좀 더 개선되어야 할 필요가 있어 보입니다.
여기서 관리자는 해당 오류를 수정하여 ‘resume’을 선택하든지, 아니면 ‘deactivate’를 선택하여 해당 플러그인 기능을 비활성화하더라도 전체 사이트가 마비되는 것을 막든지 선택할 수 있습니다.
어떻게 복구 모드로 진입하는가?
관리자 페이지에서도 심각한 에러를 만나게 되면, 코어는 관리자에게 이메일을 보내어 사이트의 에러 상태, 그리고 복구를 위한 링크를 전달합니다. 이메일은 아래 그림과 유사합니다.
에러 탐지가 되면 이런 메일이 날아옵니다 메일 중간에 있는 임시 URL로 접근하면 복구 모드로 동작할 수 있는 로그인 페이지를 만나게 됩니다. 이 페이지로 로그인을 하면 로그인 세션 토큰 외 특별한 토큰을 쿠키로 전달받게 됩니다.
워드프레스 로그인 세션 쿠키 wordpress_rec_로 시작하는 것이 바로 복구 모드를 위해 발급된 쿠키입니다. 이 쿠키값이 올바르면 사용자는 복구 모드로 동작하는 것입니다.
또한 쿠키 값은 특별한 규칙이 있고, 이 규칙대로 잘 디코딩하면 세션 ID라는 것이 있습니다. 에러가 나면 에러 내용을 DB 옵션 테이블에 기록하는데, 옵션 테이블 이름은 이 세션 ID에 의해 조금씩 달라집니다. 세션 ID는 보통 난수적으로 선택됩니다. 실험을 위해 일부러 에러를 내고 복구모드에 들어왔을 때 옵션 테이블에는 아래와 같은 에러 내용이 기록된 것을 확인했습니다.
option name: 3a3f3bd482a7a6f2fc2a4480a7c1d8da3a6002e3_paused_extensions option value: array(2) { 'theme' => array(1) { 'twentyseventeen' => array(4) { 'type' => int(256) 'message' => string(17) "Error on purpose." 'file' => string(90) "/home/changwoo/develop/wordpress/wp-contents/wp.local/themes/twentyseventeen/functions.php" 'line' => int(11) } } 'plugin' => array(1) { 'wsod-test' => array(4) { 'type' => int(256) 'message' => string(17) "Error on purpose." 'file' => string(85) "/home/changwoo/develop/wordpress/wp-contents/wp.local/plugins/wsod-test/wsod-test.php" 'line' => int(6) } } } (옵션값은 unserialize 시켰습니다.)
에러 탐지 및 복구 모드와 관련된 설정값
에러 탐지와 복구 모드에 대한 설명이 어느 정도 된 것 같네요. 이제 이와 관련된 define 상수나 설정값을 메모하면서 포스팅을 마치기로 합니다.
- WP_DISABLE_FATAL_ERROR_HANDLER: 참일 때는 아예 에러 보호 기능이 동작하지 않습니다. 개발 중에는 유용하게 쓸 수 있겠네요.
- RECOVERY_MODE_EMAIL: 에러가 생길 때 복구 모드 안내를 위한 메일 주소를 설정하는데 쓰입니다. 선언되지 않으면 워드프레스 관리자 이메일입니다.
- WP_RECOVERY_MODE_SESSION_ID: 난수로 발생되는 세션 ID를 고정할 수 있습니다.
- wp-content/php-error.php 파일: 기본 에러 화면을 변경할 수 있는 템플릿 파일로 사용할 수 있습니다. 원한다면 WP_Fatal_Error_Handler::display_default_error_template() 메소드를 참고하여 사이트 고유의 에러 화면으로 만들 수 있습니다.
- wp-content/fatal-error-handler.php 파일: WP_Fatal_Error_Handler 가 아닌 다른 에러 핸들러 클래스를 정의할 수 있습니다. 반드시 ‘handle()’이라는 퍼블릭 메소드가 정의되어 있어야 합니다.
-
디버그 로그는 가려놓읍시다!
워드프레스는 흔히 카페24 같은 호스팅을 사용한다든지, 이런 오픈된 개발 서버에서 작업되는 경우도 흔합니다. 그리고 워드프레스의 동작을 보다 정밀하게 파악하기 위해, 아래 같은 설정을 사용하기도 합니다.
(더 보기…) -
새 워드프레스 운영자에게 보내는 잔소리
클라이언트에게 답신 메일을 보내다, 장문이 되어버렸다. 그런데 나중에 발췌해서 공유하고자 함이니 고객에 대한 것은 편집해서 공유해 본다. 잘 쓴 글은 아니지만 그래도 나누고 싶다.
워드프레스를 사용하여 운영을 시작하시는 분들께는 다음과 같은 조언을 드리고 싶습니다.
(더 보기…) -
wp-login.php 직접 접근을 리다이렉트
wp-login.php 파일에 직접 접근하면 워드프레스의 기본 로그인 창이 뜨는데, 몇몇 고객들은 이것을 달가워하지 않는다. 그래서 이것을 막아달라는 요청을 하는데, wp-login.php는 사실 로그인, 로그아웃에 대한 백엔드를 담당하는 역할을 맡고 있기 때문에 접근 자체를 차단하는 것은 바람직하지 않다.
(더 보기…) -
커스텀 포스트가 관리자 페이지에서 일반 페이지처럼 템플릿을 선택할 수 있도록 하기
register_post_type() 함수 인자에서 ‘support’ 항목에 ‘page-attributes’를 추가한다. 그리고 아래의 필터를 추가한다.
<?php add_filter( 'theme_' . 'custom_post_type' . '_templates', 'my_templates', 10, 4); function my_templates( $post_templates, $wp_theme, $post, $post_type ) { if ( empty( $post_templates ) ) { $pt = $wp_theme->get_post_templates(); $post_templates = $pt['page'] ?? array(); } return $post_templates; }
-
님프 2018. 06. 16. DEB 패키지 파일
https://drive.google.com/drive/u/1/folders/1jauPO0AREW-RqXWItThi03A2pVFaaZUA
님프 2018. 06. 16. 버전.
삽질을 줄이고자 패키징해봤습니다. 우분투 18.04 (리눅스 민트 19 타라) 에서 작업했습니다. 한글만 사용하려면 nimf-libhangul_2018.06.16_amd64.deb, nimf_2018.06.16_amd64.deb 이 두개만 설치하면 됩니다.
https://cogniti-works.blogspot.com/
-
워드프레스의 패스워드 해싱 방법 노트
해싱 방법
워드프레스는 Portable PHP password hashing framework(phpass)를 사용하여 패스워드를 해싱한다. 이 프레임워크에서는 PHP5.5이후의 내장된 password_hash(), password_verify()를 사용하는 것이 권장하며, 자신들은 그 이전 프로젝트를 위한 호환성을 보장한다고 한다. 워드프레스 최소 환경이 5.2.9인 것을 감안하면 그렇게 해야 할 듯.
예를 들어 설명하는 것이 낫겠다. 워드프레스에서 시험적으로 ‘guest’라는 계정과 ‘guest’라는 매우 취약한 패스워드를 사용하여 계정을 만들었다. 그러면 패스워드 해쉬 값은 ‘$P$ByCNnCoqFGHDSjIkWjlf8heBFfLJLI1’로 나오게 된다.