관리자에게 외부 스크립트를로드하지만 특정 게시물 유형에 대해서만?


16

그래서 나는이 문제를 계속 겪고 있으며이 문제를 해결할 수있는 가장 좋고 가장 간단한 해결책을 찾고 있습니다.

많은 다른 프로젝트에서 사용자 정의 게시물 유형을 사용하고 jQuery 이벤트 캘린더 선택기와 같은 사용자 정의 스크립트를 추가하여 확장 한 사용자 정의 메타 박스로 이러한 유형을 확장했습니다 ...이 모든 것은 하나의 주요 문제를 제외하고는 훌륭하게 작동합니다. ...이 사용자 정의 jQuery 스크립트가 관리자의 모든 페이지에로드되는 것을 원하지 않습니다.

필자는 본질적으로 특정 게시물 유형에 대한 "게시물 편집"페이지에있을 때 이러한 사용자 정의 jquery 필드를로드하는 방법을 찾고 있습니다.

여기서 가장 좋은 해결책은 무엇입니까?


업데이트 1

우선, 대단히 감사합니다.

플러그인 개발자가 이와 같은 것을 확신하지 못한다는 사실에 실제로 충격을 받았습니다. 왜냐하면 이것이 다른 플러그인에 문제가있는 주요 이유 중 하나이기 때문입니다.

나는 이것과 관련하여 더 많은 문제를 겪고있다. 예를 들어 ...

다음과 같이 if 문을 호출하도록 스크립트를 수정했습니다.

if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events')

보시다시피 게시물 유형 "이벤트"내에서 게시물을 추가하거나 편집 할 때 스크립트 만 호출되도록 설정하려고합니다.

스크립트가 다른 페이지에로드되는 것을 원하지 않고 포스트 유형 "이벤트"의 페이지 목록에서 스크립트가 실행되는 것을 원하지 않으므로 if 문이 올바른 것으로 생각합니다.

그러나 문제는이 게시물 유형 내에서 새 게시물을 만들 때만 스크립트가로드되지만 기존 게시물을 편집 할 때 작동하지 않는 것 같습니다.

이것을 테스트하고 내가 뭘 잘못했는지 알려 주시겠습니까?

여기에 내가 사용하고있는 정확한 코드가 있습니다 ... 아마 더 좋거나 간단한 방법이 있습니까?

<?php
// INCLUDE METABOX CUSTOM JQUERY DATEPICKER 2
add_action('admin_init','load_admin_datapicker_script');
function load_admin_datapicker_script() {
  global $pagenow, $typenow;
  if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
    wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
    wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
    wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
    wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
  }
}

또한 ... 세 개의 게시물 유형을 추가하고 각 게시물 유형마다 다른 JS 스크립트를로드하려면 세 번의 별도 시간 위에 코드를 복제합니까? 예를 들어 ... 그냥 전화하는 것이 좋습니다 : global $ pagenow, $ typenow; 함수 파일의 맨 위에 또는 두 번 이상 복제 할 때 문제가 발생하거나 복잡합니까?

같은 것과 관련된 다른 문제에 ... 예를 들어 "중력 양식"플러그인을 사용하고 있지만 관리자의 모든 페이지에서 스크립트가 실행되어 다른 플러그인과 문제가 발생하는 것을 알았습니다. 스크립트가 필요할 때만로드되도록 스크립트를 수정하는 방법은 무엇입니까?


업데이트 2

Mike (아래)가 제공 한 코드로 functions.php 파일을 수정했지만 NEW Post 또는 Page를 만들 때 적용 가능한 JavaScript가 여전히 포함되어있는 것 같습니다. 즉, 새 기본 Wordpress 게시물 / 페이지를 만들어서 새 게시물 또는 페이지를 만들거나 사용자 지정 게시물 유형 중 하나를 기반으로 새 게시물 / 페이지를 만들 때를 의미합니다. Mike가 제안한 코드는 다른 모든 관리 페이지에서 작동하며 기존 게시물 / 페이지 또는 사용자 정의 게시물 유형을 "편집"할 때 작동합니다. 이 작업을 올바르게하기 위해 제안 된 수정 사항이 있습니까?

내 현재 코드는 다음과 같습니다.

<?php
   add_action('admin_init','load_admin_datapicker_script');
   function load_admin_datapicker_script() {
    global $pagenow, $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
        $post = get_post($_GET['post']);
        $typenow = $post->post_type;
    }
    if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }
   }
?> 

2
@ NetConstuctor.com : 충격을받지 마십시오. 많은 사람들이 플러그인을 작성하여 프로그래밍 배경을 거의 갖지 못하도록 프로그래밍하는 방법을 배운 플러그인을 작성합니다. 모범 사례를 따르지 않고 가려움증을 긁고 있습니다.
MikeSchinkel

답변:


14

먼저 스크립트를로드 하는 wp_enqueue_script()데 사용 한다고 가정합니다 .

즉, 귀하의 질문을 이해 하면 필요한 것은 다음과 같습니다 . 물론 세부 사항을 위해 편집해야하지만 일반적인 프레임 워크를 제공합니다.

우리는 후킹하는 admin_init기능과 함께 load_my_script()글로벌 테스트에 대한 $pagenow관리자 페이지와 일치 edit.php하고, 세계는 $typenow포스트 유형을 원하는 사람이 있는지.

나머지는 자세한 정보가 필요한 경우 여기에서 읽을 수있는 세부 사항입니다 .

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if ($pagenow=='edit.php' && $typenow=='my-custom-type') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
  }
}

최신 정보

업데이트에 응답하고 있습니다. 불행히도 ( 어떤 이유에서든 ) $typenow동안 값이 admin_init없으므로 다음 예제에서 볼 수 있듯이 post_typeURL 매개 변수 'post'를 기반으로 게시물을로드하여 게시물을 가져와야합니다 (예제에서 위와 아래를 복사했습니다) 위치를 확인할 수 있습니다) :

<?php
global $pagenow, $typenow;
if (empty($typenow) && !empty($_GET['post'])) {
  $post = get_post($_GET['post']);
  $typenow = $post->post_type;
}
if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {

추신 다른 질문에 대해서는 저 또는 다른 사람들이 대답 할 수 있도록 사이트새로운 질문으로 게시하십시오 . Google은 귀하를 돕기 위해 최선을 다하고 있으므로 제목에 최상의 제목을 부여하고 올바른 형식과 적절한 영어로 질문을 가능한 한 명확하고 간결하게 작성하십시오. 이 작업을 수행하면 동일한 문제로 질문이 필요한 것과 비슷한 것으로 인식하고 질문에 답변하는 사람이 더 쉽게 만들 수 있습니다.

본인 과 다른 중재자가 WordPress 답변을 커뮤니티 대신 엄청난 자원으로 만들기를 원하기 때문에 귀하 ( 및 WordPress 답변에 대한 질문을하는 다른 모든 사람)에게 귀하의 질문에 답변하기 위해 시간을내는 것에 대한 대가로 부탁합니다. 웹에서 다른 많은 사이트와 같이 읽기 어렵고 답을 찾기 어려운 또 다른 조잡한 포럼입니다.

업데이트 # 2

if 문에 연산자 우선 순위 문제가 있다고 생각했지만 실행하기 전에 테스트했을 때. 그것이 당신의 말처럼 행동한다면 거의 확실하게 그렇게 시도하십시오 (죄송합니다, 지금 제대로 작동하는지 확인하기 위해 이것을 테스트 할 시간이 없습니다).

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if (empty($typenow) && !empty($_GET['post'])) {
    $post = get_post($_GET['post']);
    $typenow = $post->post_type;
  }
  if (is_admin() && $typenow=='events') {
    if ($pagenow=='post-new.php' OR $pagenow=='post.php') { 
      $ss_url = get_bloginfo('stylesheet_directory');
      wp_enqueue_script('jquery');
      wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
    }
  }
}

안녕 마이크 ... 아래 내 의견을 참조하십시오 ... 죄송합니다, 나는 잘못된 상자에 게시
NetConstructor.com

@ NetConstuctor.com : 답변을 위해 설계된 장소에서 질문 에 대한 설명을 제공하지 마십시오 . 귀하의 질문에 대한 답변으로 입력 한 내용을 옮겼으며 해당 답변을 마무리하기 위해 투표하고 있습니다.
MikeSchinkel

안녕 마이크 ... 하나의 문제를 제외하고 코드가 완벽하게 작동합니다 ... 관리 페이지에있을 때 새 게시물이나 새 페이지를 추가 할 수 있습니다 (기본 게시물 / 페이지에 대해 이야기하고 있습니다). DOES가로드되는 사용자 정의 게시물 유형에 대해로드됩니다. 이 문제 이외에는 완벽하게 작동하는 것으로 보이며 지정된 게시물 유형에 대해서만 자바 스크립트를로드하고 있습니다. 제안 할 수있는 수정 사항이 있습니까?
NetConstructor.com

미안 마이크-내 초기 가정은 실제로 잘못되었습니다. 제공 한 코드에 내가 가지고있는 다른 게시물 유형에 자바 스크립트가 포함 된 것 같습니다. 나는 당신이 제안한대로 정확하게 스크립트를 포함 시켰습니다. 이것을 다시 한 번 검토해 주시겠습니까?
NetConstructor.com

1
OK .. 이것을 더 검토 한 결과 Mike의 코드가 "새로운"게시물을 만들 때를 제외하고는 모든 곳에서 제대로 작동한다는 것을 알았습니다. 내가보고있는 내용에서 새 페이지, 기본 워드 프레스 페이지 / 게시물에 대한 새 POST 및 사용자 정의 게시물 유형을 만들 때 자바 스크립트가 잘못 포함됩니다. 기본 워드 프레스 게시물 또는 페이지 또는 사용자 정의 게시물 유형 인 기존 게시물 또는 페이지를 편집 할 때 코드가 작동합니다 (자바 스크립트가 포함되어 있지 않음). 누군가이 문제를 해결하기 위해 제안 된 수정을 제공 할 수 있습니까?
NetConstructor.com

3

내 관련 문제를 해결하는 코드를 여기에 추가 할 것이라고 생각했습니다. 필자의 경우 JavaScript 및 CSS를 페이지 및 게시물에만로드하고 다른 곳에서는 (편집 및 작성)하지 않으려 고합니다.

basename( $_SERVER[ 'SCRIPT_FILENAME' ] )백엔드의 위치를 ​​결정하는 데 사용할 수있는 솔루션을 찾았습니다 . $_SERVER[ 'SCRIPT_FILENAME' ]서버 의 가용성이 서버마다 다를 수 있기 때문에 걱정했습니다 (서버에서 서버를 $_SERVER[ 'SCRIPT_FILENAME' ]사용할 수 없을 가능성을 아는 사람이 있습니까?)

그런 다음이 질문과 MikeSchinkel이 대답했습니다. 약간의 수정으로 나는 한 가지를 제외하고 나를 위해 일하게했다. "새로 추가"를 통해 새 게시물을 만들 때 어떤 이유로 든 작동하지 않는 것 같습니다.

다음과 같은 비틀기를 통해 나는 그것을 작동 시켰고 다른 사람들을 돕고 개선하기 위해 여기에서 그것을 공유하고 있습니다.

add_action( 'admin_init','imp_add_admin_scripts' );

function imp_add_admin_scripts() {

 $urljs = get_bloginfo( 'template_directory' ).IMP_JS;
 $urlcss =get_bloginfo( 'template_directory' ).IMP_STYLES;

 // Register our scripts
 wp_register_script('imp_jquerytools', $urljs.'jquery/imp_tabs_jquery.tools.min.js' );
 wp_register_style( 'rpanel-css', $urlcss.'impoweradmin.css' );


 global $pagenow, $typenow;
 if ( empty( $typenow ) && !empty( $_GET['post'] ) ) {
  $post = get_post( $_GET['post'] );
  $typenow = $post->post_type;
 } elseif ( empty( $typenow ) && ( $pagenow == 'post-new.php' ) ){ 
  $typenow = 'post';
 }

 if ( is_admin() && ( ( $typenow == 'page') || ( $typenow == 'post') ) ){

  if ( $pagenow == 'post-new.php' OR $pagenow == 'post.php' ) {

   wp_enqueue_script( 'imp_jquerytools' );
   wp_enqueue_style( 'rpanel-css' );

  }
 }
}

다음으로 내 URL이 admin.php? page = themeoptions이고 모든 관리자에게 스크립트를 원하지 않기 때문에 $ pagenown 기반으로 수행 할 수없는 테마 옵션 페이지로 일부 스크립트를 제한하려고합니다. .php 페이지, 특정 페이지에만 해당 (내 테마 옵션 페이지)

어떻게 이것이 최선의 방법인지 알고 있습니까?

그리고 내 자신의 질문에 대답하기 위해 :

if( is_admin() && ( $_GET['page'] == 'themeoptions' ) ){
  wp_enqueue_script( 'my-script' );

 }


2

질문에 대한 답변을 받았습니다. 나는 이것이 더 간단한 해결책이라고 생각합니다.

<?php
add_action( 'admin_enqueue_scripts', 'load_admin_datapicker_script' );

function load_admin_datapicker_script() {

    $current_screen = get_current_screen();

    if ( $current_screen->post_type === 'events' )  {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }

}
?> 

1

$ typenow 변수를 사용하지 않는 버전을 만들었습니다.

function isPostEditPage($strCheckType="")
{
    //This function will test for a post type and return true if it is the edit page for this type
    //an empty value means checking for native (original, not custom) post type
    $strCheckType=$strCheckType==""?"post":$strCheckType;
    $blnReturn=false;
    if(is_Admin())  
    {
        $strPage=basename($_SERVER['SCRIPT_FILENAME']);
        switch($strPage)
        {
            case "post.php":
                if(isset($_GET["post"]))
                {
                    $intPostID=$_GET["post"];
                    $strThisPostType=get_post_type($intPostID);
                    if($strCheckType==$strThisPostType)
                    {
                        $blnReturn=true;
                    }
                }
            break;
            case "post-new.php":
                $strThisPostType="post";
                if(isset($_GET["post_type"]))
                {
                    $strThisPostType=$_GET["post_type"];
                }
                if($strCheckType==$strThisPostType)
                {
                    $blnReturn=true;
                }

            break;
        }
    }
    return $blnReturn;
}

세계는 변하지 않으므로 안전하게 사용할 수 있습니다. 또한 해당 페이지와 관련된 후크가 있으므로 해당 기능과 노력이 필요하지 않습니다. 마지막으로 : 엄격하지 않고 요다 스타일이 아닌 문자열을 확인하므로 실패 수 있습니다. 또한 의존하는 $_GET것만으로 실패 수 있습니다. 어쨌든 : WPSE에 오신 것을 환영합니다.
카이저

1

는 어때:

add_action( 'admin_init', 'scripts_admin' );

function scripts_admin($hook){

    global $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
         $post = get_post($_GET['post']);
             $typenow = $post->post_type;
     }
     if( 'post.php' != $hook && 'CUSTOMPOSTTYPE' != $typenow)
        return;

        wp_enqueue_script( 'google-api','http://maps.googleapis.com/maps/api/js?key=AIzaSyCD5TwT3vXLfYEv9WD-kOcEg7YQLcncsls&sensor=true', array( 'jquery' ) );


}

0

admin_init 동안 $ typenow에 값이 없습니다

완전히 정확하지 않습니다. 새 항목 추가, 분류 목록, 분류 편집 및 항목 목록과 같은 대부분의 게시 유형 화면 에서는 admin_init에 값이 설정되어 있지만 "PostPost 유형 편집"화면에는 값이 없습니다.

또한 다른 사람들이 지적했듯이 스타일 시트와 스크립트를 WP Admin에 추가하는 데 사용하는 올바른 후크는 admin_enqueue_scripts입니다. 이 후크를 사용하는 경우 is_admin()WP 관리자에서만 실행되고 현재 화면을 매개 변수로 사용하므로 확인하지 않아도됩니다 . http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.