WordPress 플러그인을 확장 가능하게 만드는 방법
게시 됨: 2022-03-10플러그인을 사용해 본 적이 있고 플러그인이 조금 다르게 작동하기를 바랬습니까? 아마도 플러그인의 설정 페이지 범위를 벗어나는 고유한 것이 필요했을 것입니다.
나는 개인적으로 이것을 경험했고, 당신도 마찬가지일 것이라고 장담합니다. WordPress 플러그인 개발자라면 플러그인을 사용하는 동안 일부 사용자도 이 문제를 겪을 가능성이 큽니다.
다음은 일반적인 시나리오입니다. 마침내 한 가지 작은 중요한 것을 제외하고 필요한 모든 작업을 수행하는 플러그인을 찾았습니다. 그 작은 것을 활성화하는 설정이나 옵션이 없으므로 문서를 찾아보고 그것에 대해 아무 것도 할 수 없다는 것을 알게 됩니다. WordPress 플러그인의 지원 포럼에서 기능을 요청하지만 주사위는 없습니다. 결국, 당신은 그것을 제거하고 검색을 계속합니다.
당신이 이 플러그인의 개발자라면 상상해보세요. 사용자가 특정 기능을 요청하면 어떻게 하시겠습니까?
이상적인 것은 그것을 구현하는 것입니다. 그러나 기능이 매우 특별한 사용 사례를 위한 것이라면 추가하는 것이 비현실적일 것입니다. 0.1%의 사용자만 사용할 수 있는 플러그인 설정을 갖는 것은 좋지 않습니다.
대부분의 사용자에게 영향을 미치는 기능만 구현하고 싶을 것입니다. 실제로 80%의 사용자가 20%의 기능을 사용합니다(80/20 규칙). 따라서 새로운 기능이 많이 요청되고 사용자의 80%가 이를 구현하기 전에 혜택을 받을 수 있는지 확인하십시오. 요청된 모든 기능에 대한 설정을 만들면 플러그인이 복잡해지고 부풀려지며 아무도 원하지 않습니다.
가장 좋은 방법은 다른 사람들이 자신의 필요에 따라 플러그인을 개선하거나 수정할 수 있도록 코드별로 플러그인을 확장할 수 있도록 하는 것입니다.
이 기사에서는 플러그인을 확장 가능하게 만드는 것이 왜 좋은지 배울 것입니다. 나는 또한 이것을 하는 방법을 배운 방법에 대한 몇 가지 팁을 공유할 것입니다.
플러그인을 확장 가능하게 만드는 것은 무엇입니까?
간단히 말해서 확장 가능한 플러그인은 객체 지향 프로그래밍의 SOLID 원칙, 즉 개방/폐쇄 원칙의 "O" 부분을 준수한다는 의미입니다.
개방/폐쇄 원칙에 익숙하지 않다면 기본적으로 다른 사람이 무언가를 수정하기 위해 코드를 편집할 필요가 없다는 의미입니다.
이 원칙을 WordPress 플러그인에 적용하면 플러그인에 다른 사람들이 동작을 수정할 수 있도록 하는 조항이 있는 경우 플러그인을 확장할 수 있습니다. WordPress가 사람들이 WordPress의 다른 영역에 "연결"하도록 허용하는 것과 같지만 플러그인 수준입니다.
플러그인의 일반적인 예
확장 가능한 플러그인이 아닌 샘플 플러그인부터 시작하여 확장 가능한 플러그인을 만드는 방법을 살펴보겠습니다.
세 개의 최신 게시물 제목을 표시하는 사이드바 위젯을 생성하는 플러그인이 있다고 가정합니다. 플러그인의 핵심에는 해당 세 게시물의 제목을 목록 태그로 간단히 감싸는 기능이 있습니다.
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
- ';
foreach ( $posts as $post ) {
$출력 .= '
- ' . $post->post_title . ' '; } $출력 .= '
이 코드가 작동하고 작업을 완료하는 동안 확장 가능하지 않습니다.
왜요? 함수는 고유한 방식으로 설정되기 때문에 코드를 직접 수정하지 않고는 동작을 변경할 수 없습니다.
사용자가 3개 이상의 게시물을 표시하거나 게시물 제목이 포함된 링크를 포함하려는 경우 어떻게 해야 합니까? 위의 코드로는 그렇게 할 수 없습니다. 사용자는 플러그인이 작동하는 방식에 고정되어 있으며 변경할 수 없습니다.
100가지 설정을 포함하는 것이 답은 아닙니다
사용자가 사용자 정의할 수 있도록 위의 플러그인을 향상시키는 여러 가지 방법이 있습니다.
그러한 방법 중 하나는 설정에 많은 옵션을 추가하는 것이지만 사용자가 플러그인에서 원하는 모든 가능성을 충족하지 못할 수도 있습니다.
사용자가 다음 중 하나를 수행하기를 원하면 어떻게 합니까(시나리오는 나중에 다시 살펴보겠습니다).
- 특정 카테고리의 WooCommerce 제품 또는 게시물 표시
- 간단한 목록 대신 다른 플러그인에서 제공하는 캐러셀에 항목을 표시합니다.
- 사용자 지정 데이터베이스 쿼리를 수행한 다음 목록에서 해당 쿼리의 게시물을 사용합니다.
위젯에 100가지 설정을 추가하면 위의 사용 사례를 다룰 수 있습니다. 그러나 이러한 시나리오 중 하나가 변경되고 이제 사용자가 현재 재고가 있는 WooCommerce 제품만 표시하려는 경우 어떻게 될까요? 위젯은 이를 수용하기 위해 더 많은 설정이 필요합니다. 곧, 우리는 엄청난 설정을 갖게 될 것입니다.
또한 설정 목록이 많은 플러그인은 사용자 친화적이지 않습니다. 가능하면 이 경로에서 벗어나십시오.
그렇다면 이 문제를 해결하는 방법은 무엇일까요? 플러그인을 확장 가능하게 만들 것입니다.
확장 가능하도록 자체 후크 추가하기
위의 플러그인 코드를 연구하면 메인 기능이 수행하는 몇 가지 작업을 볼 수 있습니다.
-
get_posts
를 사용하여 게시물을 가져옵니다. - 게시물 제목 목록을 생성합니다.
- 생성된 목록을 반환합니다.
다른 사람들이 이 플러그인의 동작을 수정한다면 그들의 작업은 대부분 이 세 가지 작업을 포함할 것입니다. 플러그인을 확장할 수 있게 하려면 다른 개발자가 사용할 수 있도록 이들 주위에 후크를 추가해야 합니다.
일반적으로 다음은 플러그인에 후크를 추가하기에 좋은 영역입니다.
- 주요 프로세스 주변 및 내에서
- 출력 HTML을 작성할 때
- 게시물 또는 데이터베이스 쿼리를 변경하기 위해
- 함수에서 값을 반환하기 전에
확장 가능한 플러그인의 일반적인 예
이러한 경험 법칙에 따라 플러그인을 확장할 수 있도록 다음 필터를 추가할 수 있습니다.
-
get_posts
의 인수를 수정하기 위해myplugin_get_posts_args
를 추가하십시오. -
get_posts
결과를 재정의하려면myplugin_get_posts
를 추가하십시오. - 목록 항목 생성을 사용자 정의하기 위해
myplugin_list_item
을 추가하십시오. - 반환된 생성 목록을 재정의하기 위해
myplugin_get_some_post_titles
를 추가합니다.
다음은 모든 후크가 추가된 코드입니다.
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
- ';
foreach ( $posts as $post ) {
// 다른 사람들이 목록 항목을 수정하도록 합니다.
$출력 .= '
- ' . apply_filters( 'myplugin_list_item', $post->post_title, $post ) . ' '; } $출력 .= '
GitHub 아카이브에서 위의 코드를 얻을 수도 있습니다.
여기에 많은 후크를 추가하고 있습니다. 샘플 코드가 매우 간단하고 작기 때문에 비실용적으로 보일 수 있지만 제 요점을 보여줍니다. 4개의 후크만 추가하면 다른 개발자가 모든 종류의 방식으로 플러그인의 동작을 사용자 지정할 수 있습니다.
후크에 대한 네임스페이스 및 컨텍스트
계속 진행하기 전에 구현한 후크에 대한 두 가지 중요한 사항에 유의하세요.
-
myplugin_
으로 후크의 이름을 지정합니다.
이것은 후크의 이름이 다른 플러그인의 후크와 충돌하지 않도록 합니다. 같은 이름의 다른 후크가 호출되면 원치 않는 결과가 발생할 수 있으므로 이는 좋은 방법입니다. - 또한 컨텍스트를 위해 모든 후크에서
$args
에 대한 참조를 전달합니다.
다른 사람들이 이 필터를 사용하여 코드 흐름에서 무언가를 변경하는 경우 해당$args
매개변수를 참조로 사용하여 후크가 호출된 이유에 대한 아이디어를 얻을 수 있으므로 이에 따라 조정을 수행할 수 있습니다.
후크의 효과
앞서 이야기한 독특한 시나리오를 기억하십니까? 그것들을 다시 방문하여 우리의 후크가 어떻게 그것을 가능하게 했는지 봅시다:
- 사용자가 특정 카테고리의 WooCommerce 제품 또는 게시물을 표시 하려는 경우 플러그인이 게시물을 쿼리할 때 자체 인수를 추가하기 위해
myplugin_get_posts_args
필터를 사용하거나myplugin_get_posts
를 사용하여 게시물을 자신의 목록으로 완전히 덮어쓸 수 있습니다. - 사용자가 간단한 목록 대신 다른 플러그인에서 제공하는 캐러셀에 항목을 표시 하려는 경우
myplugin_get_some_post_titles
로 함수의 전체 출력을 재정의하고 대신 캐러셀을 출력할 수 있습니다. - 사용자가 사용자 지정 데이터베이스 쿼리를 수행한 다음 목록에서 해당 쿼리의 게시물을 사용하려는 경우 첫 번째 시나리오와 유사하게
myplugin_get_posts
를 사용하여 자체 데이터베이스 쿼리를 사용하고 게시물 배열을 변경할 수 있습니다.
훨씬 낫다!
필터 사용 방법에 대한 간단한 예
개발자는 add_filter
를 사용하여 위의 필터에 연결할 수 있습니다(또는 작업에 add_action
사용).
위의 첫 번째 시나리오에서 개발자는 다음을 수행하여 우리가 만든 myplugin_get_posts_args
필터를 사용하여 WooCommerce 제품을 표시할 수 있습니다.
add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }
액션 훅을 사용할 수도 있습니다.
apply_filters
do_action
사용하여 코드를 확장할 수 있습니다. 둘의 차이점은 첫 번째는 다른 사람들이 변수를 변경할 수 있도록 하는 반면, 후자는 다른 사람들이 코드의 다양한 부분에서 추가 기능을 실행할 수 있도록 한다는 것입니다.
작업을 사용할 때 기본적으로 플러그인의 흐름을 다른 개발자에게 노출하고 다른 개발자가 다른 작업을 동시에 수행할 수 있도록 합니다.
이 예제에서는 유용하지 않을 수 있지만(짧은 코드만 표시하기 때문에) 다른 경우에는 도움이 될 것입니다. 예를 들어 확장 가능한 백업 플러그인이 있는 경우 Dropbox와 같은 타사 서비스에도 백업 파일을 업로드하는 플러그인을 만들 수 있습니다.
"엄청난! 하지만 내 플러그인을 확장 가능하게 만드는 데 왜 신경을 써야 합니까?”
글쎄, 당신이 여전히 아이디어에 매진하지 않았다면, 여기에 다른 사람들이 당신의 플러그인 동작을 수정하도록 허용하는 것이 좋은 생각인 이유에 대한 몇 가지 생각이 있습니다.
더 많은 사용자 정의 가능성에 대한 플러그인을 엽니 다.
사람마다 요구 사항이 다릅니다. 그리고 당신의 플러그인이 그것들을 모두 만족시키지 못할 수도 있고 예상할 수도 없습니다. 플러그인 동작의 주요 영역을 수정할 수 있도록 플러그인을 열면 놀라운 일이 될 수 있습니다.
사람들이 플러그인의 코드를 건드리지 않고 수정 사항을 도입할 수 있습니다.
다른 개발자는 플러그인 파일을 직접 변경하도록 강요되지 않습니다. 플러그인의 파일을 직접 수정하는 것은 일반적으로 좋지 않은 방법이기 때문에 이것은 큰 이점입니다. 플러그인이 업데이트되면 모든 수정 사항이 지워집니다.
다른 사람들이 사용할 수 있도록 자체 후크를 추가하면 플러그인의 수정 사항을 외부 위치(예: 다른 플러그인)에 넣을 수 있습니다. 이렇게 하면 원래 플러그인은 전혀 건드리지 않고 아무 것도 깨지 않고 자유롭게 업데이트할 수 있으며 다른 플러그인의 모든 수정 사항은 그대로 유지됩니다.
결론
확장 가능한 플러그인은 정말 훌륭하고 많은 사용자 정의 가능성을 위한 공간을 제공합니다. 플러그인을 확장 가능하게 만들면 사용자와 다른 개발자가 좋아할 것입니다.
WooCommerce, Easy Digital Downloads 및 ACF와 같은 플러그인을 살펴보십시오. 이러한 플러그인은 확장 가능하며 WordPress의 플러그인 디렉토리에 있는 수많은 다른 플러그인이 기능을 추가하기 때문에 쉽게 알 수 있습니다. 또한 플러그인의 다양한 측면을 수정하는 다양한 작업 및 필터 후크를 제공합니다. 내가 위에서 열거한 경험 법칙은 그것들에 대한 나의 연구에서 나타났습니다.
다음은 플러그인을 확장할 수 있도록 하기 위한 몇 가지 사항입니다.
- 개방/폐쇄 원칙을 따릅니다. 다른 사람들은 무언가를 수정하기 위해 코드를 편집할 필요가 없습니다.
플러그인을 확장 가능하게 만들려면 다음 위치에 후크를 추가하세요.
- 주요 프로세스 주변 및 내에서
- 출력 HTML을 빌드할 때
- 게시물 또는 데이터베이스 쿼리를 변경하기 위해
- 함수에서 값을 반환하기 전에
- 이름 충돌을 방지하기 위해 플러그인 이름으로 후크 이름을 네임스페이스로 지정합니다.
- 후크와 관련된 다른 변수를 전달하여 다른 사람들이 후크에서 발생하는 상황에 대한 컨텍스트를 얻을 수 있도록 하십시오.
- 다른 사람들이 배울 수 있도록 플러그인의 후크를 문서화하는 것을 잊지 마십시오.
추가 읽기
플러그인 확장에 대해 자세히 알아보려면 다음 리소스를 참조하세요.
- WordPress 플러그인을 확장 가능하게 만드는 방법, GitHub
이 기사의 모든 샘플 코드. - "WordPress Hooks를 시작하기 위한 유용한 팁", Thomas Maier, Smashing Magazine
- "WordPress 플러그인을 만드는 방법", Daniel Pataki, Smashing Magazine
- "후크", 플러그인 핸드북, WordPress.org