해당 플러그인에서 개별 함수를 호출 할 때 PHP 조건문을 사용하지 않고 wp 테마에서 플러그인을 요구하는 방법은 무엇입니까?


10

내 Wordpress 테마 중 하나가 제대로 실행 되려면 타사 플러그인이 몇 개 필요합니다.

대부분의 경우 다음과 같은 조건문을 사용하여 타사 플러그인에서 함수를 호출했습니다.

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

테마의 많은 파일을 통해 광범위하게 하나의 플러그인을 사용해야한다고 가정합니다 ... 많은 IF 조건을 사용하고 싶지 않습니다 ... 특정 플러그인을 WP에 설치하거나 더 잘 설치 해야하는 적절한 방법이 있습니까? 테마를 활성화하기 전에 누락 된 경우

감사

답변:


7

is_plugin_active()플러그인 작성자가 메인 파일의 이름을 바꾸거나 사용자가 플러그인의 디렉토리 또는 메인 파일의 이름을 바꾸면 깨질 것입니다. 특정 공공 기능이 존재하는지 확인하는 것이 좋습니다.

플러그인 기능 중 일부가 필요할 때마다 확인하지 않으려면 관리 영역에 메시지를 표시하십시오.

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

또 다른 대안은 http://tgmpluginactivation.com/ 과 같은 것을 사용하는 것입니다.


플러그인 작성자가 질문하는 함수 이름을 변경하면 function_exists일반 사용자는 다른 플러그인이 의존하는 플러그인을 설치하지 않았다는 메시지를 받게됩니다. 문제는 사용자가 실제로 있다는 것입니다 플러그인을 설치 한 후 바로 이유를 궁금해 작업 넣은 사람은 아니다 . 아, 그리고 난 당신을 위해 투표 하지 않을 것입니다.
카이저

투표에 관심이 있다면 좋은 질문이므로 Q 자체를 찬성해야합니다.
카이저

플러그인 작성자가 함수 이름을 변경하면 파일 이름을 변경하는 것보다 더 많은 사용자로부터 불만이 접수됩니다.
scribu

그리고 나는 당신의 대답을 질문에 답하지 않았습니다, IMO. 아니면 아무런 설명도하지 않고 은밀하게 공감할 것을 선호합니까?
scribu

난 그냥 의견이 아니라 공감에 대해 이야기하고 있었다. 이 주제는 토론이 필요한 주제이므로 의견 자체는 괜찮습니다. 내 생각이 댓글 길이를 초과 할 때 다른 답변을 추가하겠습니다. 답을 수정하면 토론 결과를 모든 사람이 수정할 수 있도록 개정 할 수 있습니다. 감사.
카이저

1

플러그인을 사용할 수 없을 때 테마가 깨지는 것을 막지는 않지만 "필수 테마에 대한 관리자 통지를 표시하는 방법" 플러그인에 대한이 매끄러운 기사를 살펴 보겠습니다 . 플러그인을 강제 로 설치 하는 테마에 대해 결코 생각하지 않았 으므로 다음으로 가장 좋은 옵션 인 것 같습니다.

또 다른 빠른 생각 : 나는 이것을 시도하지 않았지만, 단일 조건부에서 여러 후크를 수용하는 영리한 방법을 알아낼 수 있는지 궁금합니다. 어쩌면 모든 조건부 함수를 다른 파일로 분리하고 if( function_exists( 'plugin_function' ) )반환 할 경우에만 필요 합니다 true(불완전한 검사라는 것을 이해하면서).


0

플러그인 페이지 만 필요한 경우가 있습니다 is_plugin_active(). 외부에서 필요한 경우 핵심 기능을 테마에 복사 / 붙여 넣은 다음 재사용하는 것이 좋습니다.

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

조건부 함수를 두 번 정의하면 오류가 발생하지 않습니다.


그것은 실제로 질문에 대답하지 않습니다. 그것은 단순히 다음으로 대체 if(function_exist('plugin_function'))됩니다if(is_plugin_active('plugin-file.php'))
scribu

0

참고 : 이 답변은 @scribu와 @kaiser 간의 토론을보다 쉽게하기위한 것입니다. 개조 : 삭제하지 마십시오. 사용자 / 독자 : 투표하지 마십시오. 토론을 따르려면 개정 / 편집 로그를보십시오. 토론에 참여하려면 답변을 편집하십시오. 토론에 결과가 있으면 그와 같이 표시됩니다. 감사합니다.


시나리오

플러그인 의존성을 가질 수있는 가중치가 다른 시나리오도 있습니다. (이 예제는 허구 일뿐입니다). "(부모) 플러그인"이라는 단어는 부모의 관점에서 "테마"와 교환 될 수 있습니다.

  1. (하드) 기능 만 확장하거나 기존 플러그인의 표시 (및 유사)를 변경하여 부모 없이는 존재할 수없는 하위 플러그인입니다. 예 : BuddyPress»BuddyPress-FunkyCommentDisplay
  2. (정상) 하위 플러그인이 활성화 될 때 기능이 확장 된 플러그인입니다. 예 : jQueryAttachmentCarousel»jQuerySlideDeck
  3. (소프트) 기능 만 추가하는 플러그인. 예 : DisneyWonderlandTheme»MickeysSocialLinks

다음에서는 "other"플러그인을 업데이트 할 때 발생하는 상황을 스케치하려고하는데 검사가 더 이상 작동하지 않습니다.

  • 광고 1) BuddyPress가 활성화되지 않은 상태에서 플러그인을 사용할 수 없습니다»물건이 완전히 파손되었습니다.
  • 광고 2) 플러그인은 회전식 메뉴에서 슬라이드 덱으로 전환하는 옵션을 제공 할 수 없습니다»유선으로 표시됩니다 (스타일이 슬라이드 덱으로 수정되었다고 가정합니다).
  • Ad 3) MickeysSocialLinks가 사라집니다.

검사

플러그인이 활성화되어 있는지 확인하려는 경우 확인할 세 가지 가능성이 있습니다.

  • A. 폴더가 있습니까?
  • B. 메인 파일 (옵션) 'active_plugins'이 존재합니까?
  • C. 특정 기능이 존재합니까?

이제 내부 링크 검사기 플러그인 을 예로 들어 공개 API를 제공하지 않고 확장 할 의도가 없다면 요청시 또는 의도대로 내부 함수 이름을 변경하지 않을 이유가 없습니다 (작성자로서). . 따라서 누군가 가이 플러그인을 피기 백하려고하면 업데이트시 기능과 번들링의 견고성에 따라 문제가 발생합니다. 파일 이름도 마찬가지입니다. 파일 이름을 변경하지 않을 실제 이유 (플러그인이 업데이트시 플러그인이 비활성화되는 것을 제외하고)는 없습니다. 폴더 이름을 변경하지 못하게하는 유일한 방법은 공식 리포지토리에서 호스팅되는 경우 파일 이름에 대해 업데이트 확인 및 알림이 실행된다는 것입니다.

따라서 (부모) 플러그인의 가장 약한 (변경하기 쉬운)에서 가장 힘든 (변경에 반대하는) 부분까지는 다음과 같습니다.

기능»메인 파일 이름»폴더


함수 검사가 사용하는 것보다 덜 취약하다고 말했을 때 is_plugin_active()문제의 함수가 플러그인 작성자가 명시 적으로 권장하는 것으로 가정했습니다. 이것의 궁극적 인 예 wp_pagenavi()는 WP-PageNavi 플러그인이 제공 하는 템플릿 태그입니다.

종속성을 정의하는 데 어려움은 파일 이름이 포함되지 않은 플러그인을 고유하게 식별하는 표준 방법이 없다는 것입니다.

주제에 대한 더 많은 생각 :

http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme


지금까지 세 가지 점으로 요약 할 수 있습니다.

  • 우리는 약간 다른 주제에 대해 이야기했습니다
  • 우리는 내가 생각했던 주제를 해결할 수있는 방탄 방법이 없다는 것에 동의합니다
  • 질문에 대한 당신의 이해에서, 당신은 유효한 갈 길을 제안했습니다

내가 생각할 수있는 가장 현명한 방법은 이미 (너무 덜 적은) 플러그인에서 보았습니다.

// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );

그것에 대해 너무 자세하게 생각하지 않고 '모든'필터에 대한 확인에 통지를 걸고 후크 에있을 때 트리거되면 현재 필터 내부를 확인할 수 있다고 생각합니다 shutdown...?


후크를 사용하면 '정상'및 '약한'종속성에 적합합니다. 유일한 단점은 여전히 ​​사용해야 function_exists()하거나 is_plugin_active()종속성이 충족되지 않은 경우 중지하려는 경우입니다. 이를 위해 '전체'필터를 사용하면 너무 비싼 IMO가됩니다.

@scibu이 주제는 "귀하의"주제를 대상으로합니다. (나는 이미 내 이야기를 중단했다). :)

따라서 기본적으로 의존성이 필요하고 훌륭한 작성자가 있다면 템플릿 태그 대신 후크를 제공 할 수 있습니다. 플러그인은 후크가 존재하거나 단순히 아무것도하지 않을 경우에만 플러그인에 연결되기 때문입니다. 그리고 다른 한편으로는 플러그인이 없으면 오류가 발생하지 않습니다.

어려운 부분은 다음과 같습니다 (또는 Q 이상). 사용자에게 "»DisneyWonderLinks«를 설치해야합니다"종속성을 알리기 위해 관리자 통지를 작성하려면을 확인하십시오 array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] ). 이것이 작동하는지 확실하지 않지만 어레이 (공공 / 관리자) 모두에서 액세스 할 수 있어야합니다.


작동하지 않습니다. 콜백이 후크에 등록되었다고해서 후크가 예상 될 때 트리거되는 것은 아닙니다. 일종의 작업이 될 유일한 것은 앞에서 언급 한 '종료'훅을 사용하는 것입니다.

add_action( 'shutdown', function() {
  if ( !did_action( 'template_tag_like_hook' ) )
    echo 'Problem.';
} );

물론 이것은 </html>태그 뒤의 맨 끝에 인쇄됩니다 (템플릿 태그가 일반적으로 사용되는 위치이기 때문에).

메시지를 wp_options에 저장 한 다음 관리 영역에 표시 할 수 있지만 무효화, 플러그인 캐싱 등 완전히 새로운 웜 캔이 열립니다.


기록을 위해 이것은 사이트 기능을 사용하는 다소 정통적인 방법입니다. c2.com/cgi/wiki를
scribu

그렇습니다. 그러나 나는 우리가 나중에 독자들에게 그것을 숨기지 않고 어떻게 토론을 계속할 수 있는지 전혀 몰랐습니다.
카이저

나는 질문을 게시하는 것이 상당히 토론을 일으킨다는 것을 몰랐습니다 :) 정말 흥미 롭습니다. 조언을하고 사려 깊은 토론을 제공하는 당신의 노력과 시간 모두에 감사드립니다. 나는 SGM Activation 클래스를 사용하는 scribu (많은 것 중 하나)의 조언이 적어도 실제적인 관점에서 내 대답에 대한 해결책을 제공 할 수 있다고 생각합니다. 그러나 제안 된 다른 방법도 특정 시나리오에서 의미가 있고 읽기가 매우 흥미 롭기 때문에 여전히 전체 토론을 주시하고 있습니다. 감사합니다!
unfulvio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.