it-swarm-ko.tech

특정 게시 유형에 대해서만 Admin에 외부 스크립트로드?

그래서 나는이 문제에 계속해서 뛰어 들고이 문제를 해결하기위한 가장 단순하고 간단한 해결책을 찾고 있습니다.

나는 여러 프로젝트에서 커스텀 포스트 타입을 사용하게되었고, 이것들을 jQuery 이벤트 캘린더 셀렉터와 같은 커스텀 스크립트를 추가하여 확장 한 커스텀 메타 보스로 이것을 확장했다 ...이 모든 것은 하나의 중요한 쟁점을 제외하고는 훌륭하게 작동한다. ... 나는이 사용자 정의 jQuery 스크립트가 관리자의 모든 페이지에로드되는 것을 원하지 않습니다.

필자는 본질적으로 단지 특정 포스트 타입에 대한 "edit post"페이지에있을 때 이러한 사용자 정의 jquery 필드를로드하는 방법을 찾고 있습니다.

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


업데이트 1

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

나는 플러그인 개발자들이 다른 플러그인에 문제가 있다는 주요 이유 중 하나라는 것을 알아 냈기 때문에 이와 같은 것을 확실히하지 않는다는 사실에 실제로 충격을 받았습니다.

나는 이것과 함께 몇 가지 추가 문제가 있습니다. 예를 들면 ...

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

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

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

스크립트가 다른 페이지에로드되는 것을 원하지 않고 if 유형이 "이벤트"유형의 페이지 목록에서 실행되는 것을 원하지 않으므로 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");
  }
}

또한 ... 내가 3 개의 게시물 유형을 추가하고 각 게시물 유형에 대해 다른 JS 스크립트를로드하려면 3 번 이상 별도의 코드를 복제해야합니까? 아니면 이렇게하는 것이 좋지 않습니까? 예를 들어 ... global $ pagenow, $ typenow를 호출하는 것이 더 좋을까요? 함수 파일의 맨 위에 또는 두 번 이상 복제 할 때 문제가 복잡하거나 복잡합니까?

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


업데이트 2

나는 functions.php 파일을 Mike가 제공 한 코드 (아래)로 수정했다. 그러나 새로운 Post 또는 Page를 만들 때 해당 자바 스크립트가 여전히 포함되어있는 것으로 보인다. 즉, 새 기본 Wordpress 게시물/페이지를 만들거나 사용자 정의 게시물 유형 중 하나를 기반으로 새로운 게시물/페이지를 만들 때 새로운 게시물 또는 페이지를 만들려고 할 때이를 의미합니다. Mike IS님이 제안한 코드는 다른 모든 관리 페이지에서 작업하며 기존 게시물/페이지 또는 사용자 정의 게시물 유형을 "편집"할 때 작동합니다. 이 작업을 올바르게하기 위해 제안 된 수정 사항은 무엇입니까?

다음은 현재 코드입니다.

<?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");
    }
   }
?> 
16
NetConstructor.com

먼저 wp_enqueue_script()을 사용하여 스크립트를로드한다고 가정합니다 맞습니까?

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

admin_init 함수와 load_my_script() 함수를 연결하여 글로벌 $pagenow을 (를) 관리 페이지 edit.php 및 글로벌 $typenow와 (과) 일치하는지 테스트합니다. 게시물 유형은 원하는 것입니다.

나머지는 자세히 배울 필요가있는 경우 here 에 대해 읽을 수있는 세부 정보입니다.

<?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_type을 (를) 불러 와야합니다. 다음 예에서 볼 수 있듯이 URL 매개 변수 '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'));
    }
  }
}
14
MikeSchinkel

Per Justin Tadlock, 플러그인 또는 관리자 전용 스크립트의 경우 wp_enqueue_scripts가 아닌 admin_enqueue_scripts에 연결해야합니다.

http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin -

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
3

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

백엔드 어디에서 basename( $_SERVER[ 'SCRIPT_FILENAME' ] )을 사용하여 실행할 수있는 솔루션을 찾았습니다. 나는 $_SERVER[ 'SCRIPT_FILENAME' ]의 가용성이 서버와 서버에 따라 다를 수 있다고 생각했지만 (아무도 $_SERVER[ 'SCRIPT_FILENAME' ]가 서버에서 사용 가능하지 않을 가능성이 얼마나되는지 알고 있습니다.)

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

다음과 같은 조작으로 나는 그것을 작동 시켰고, 다른 사람들을 돕고 그것을 향상시키기를 희망하면서 그것을 여기에서 공유하고 있습니다.

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' );

  }
 }
}

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

이것이 최선의 방법을 아는 사람은 누구입니까?

그리고 내 자신의 질문에 대답 :

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

 }
3
Ashley G

이건 어떤가요:

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' ) );


}
1
chifliiiii

$ 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;
}
1
Mark

나는 그 질문에 답을 얻었습니다. 나는 이것이 더 간단한 해결책이라고 생각한다.

<?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
grappler

admin_init 중에 $ typenow에 값이 없습니다.

완전히 정확하지 않습니다. 그것은 admin_init에 most Add New, 택 소노 미리스트, 택 소노 미 편집 및 엔트리리스트와 같은 게시 유형 화면에 설정된 값을 가지고 있지만 "Edit YourPostType"화면에는 값이 없습니다.

또한 다른 사람들이 지적했듯이 WP Admin에 스타일 시트와 스크립트를 추가하는 데 사용할 올바른 훅은 admin_enqueue_scripts입니다. 이 훅을 사용할 경우 WP Admin에서만 실행되므로 is_admin()을 확인할 필요가 없으며 매개 변수로 현재 화면을 가져옵니다. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot