Adminで外部スクリプトを読み込みますが、特定の投稿タイプのみを読み込みますか?


16

したがって、私はこの問題に引き続き取り組み、この問題を解決するための最良かつ最も簡単なソリューションを探しています。

私は多くの異なるプロジェクトでカスタム投稿タイプを利用するようになり、jQueryイベントカレンダーセレクターなどのカスタムスクリプトを追加することでさらに拡張したカスタムメタボックスでこれらを拡張しました。 ...これらのカスタムjQueryスクリプトを管理者のすべてのページにロードしたくない。

基本的に、特定の投稿タイプの「投稿の編集」ページにいるときに、これらのカスタムjqueryフィールドをロードする方法を探しています。

ここで最善の解決策は何ですか?


更新1

まず第一に、どうもありがとうございました。

プラグイン開発者がこのようなことを確認していないことに実際にショックを受けています。これは、さまざまなプラグインに問題が存在する主な理由の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");
  }
}

また... 3つの投稿タイプを追加し、投稿タイプごとに異なるJSスクリプトをロードしたい場合、上記のコードを3回別々に複製するか、これは良い方法ではありませんか?たとえば、次のように呼び出す方が良いでしょう:global $ pagenow、$ typenow; 関数ファイルの一番上にあるのか、それを複数回複製するときに問題になるのですか、それとも複雑になりますか?

同じことに関連する別の問題について...たとえば、「重力フォーム」プラグインを使用していますが、管理者のすべてのページでスクリプトが実行され、他のプラグインで問題が発生していることに気付きました。スクリプトが必要な場合にのみロードされるように、スクリプトを変更するにはどうすればよいですか。


更新2

Mikeが提供するコード(下記)を使用して、functions.phpファイルを変更しましたが、新しい投稿またはページを作成するときに、適切なjavascriptがまだ含まれているようです。これは、新しいデフォルトのワードプレスの投稿/ページを作成して新しい投稿またはページを作成しようとしたとき、またはカスタム投稿タイプのいずれかに基づいて新しい投稿/ページを作成したときを意味します。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中に値がないため、次の例に示すようにURLパラメータに基づいて投稿をロードadmin_initすることで取得する必要があります(例から上の行と下の行をコピーしました配置場所を確認できます):post_type'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') {

PS 他の質問については、私や他の人が答えられるように、新しい質問としてサイトに投稿してください。私たちはあなたを助けるために一生懸命に働いているので、あなたのタイトルにあなたができる限り最高のタイトルを与えるように細心の注意を払ってください。これを行うと、同じ問題があなたの質問を彼らが必要とするものに類似していると認識するのに役立ち、あなたの質問に答えている私たちが簡単になります。

私は、あなた(の本を尋ねると、WordPressの回答に質問をする他のすべての Iと他の司会者は、ワードプレスがコミュニティのために多大なリソースを回答代わりにしたいので、ご質問にお答えするために、時間の努力を取ると引き換えに賛成のように)読みにくく、ウェブ上の他の多くのサイトのように答えを見つけるのが難しい、もう1つのずさんなフォーラム。

更新#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

こんにちはMike ... 1つの問題を除いてコードは完全に機能します...新しい投稿または新しいページ(デフォルトの投稿/ページについて話している)を追加できる管理ページにいるときは、カスタム投稿タイプのためにロードされますDOESロードされます。この問題以外は完全に機能しているようで、指定された投稿タイプでのみJavaScriptをロードしています。提案できる修正はありますか?
NetConstructor.com

申し訳ありませんがマイク-私の最初の仮定は実際には間違っていました。あなたが提供したコードには、私が持っている他の投稿タイプのJavaScriptも含まれているようです。私が行って、あなたが提案したとおりにスクリプトを含めました。これをもう一度見直してください。
NetConstructor.com

1
OK ...これをさらに検討した結果、「新しい」投稿を作成する場合を除いて、Mikeのコードはどこでも正しく動作していることがわかりました。私がここで見ているものから、新しいページ、デフォルトのワードプレスのページ/投稿、およびあなたが持つかもしれないカスタム投稿タイプの新しい投稿を作成するときに、javascriptが誤って含まれています。デフォルトのワードプレス投稿またはページまたはカスタム投稿タイプのいずれかである既存の投稿またはページを編集すると、コードは機能します(javascriptを含むことはできません)。誰かがこの問題を修正するための修正案を提供できますか?
NetConstructor.com

3

私の関連する問題を解決するコードをここに追加すると思いました。私の場合、私はJavaScriptとcssをページと投稿のみにロードして(編集と作成)、他のどこにもロードしないようにしています。

basename( $_SERVER[ 'SCRIPT_FILENAME' ] )バックエンドのどこにいるかを判断するために使用できる実用的なソリューションを見つけました。ただし、$_SERVER[ 'SCRIPT_FILENAME' ]サーバーの可用性はサーバーごとに異なる可能性があるため、心配していました(サーバー$_SERVER[ 'SCRIPT_FILENAME' ]で利用できないことがどれほどありそうかを知っている人はいますか?)

その後、この質問とマイクシンチンの答えに出会いました。少しの修正を加えて、1つの点を除いて機能させました。「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' );

 }


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

この

$ typenowはadmin_init中に値を持ちません

完全に正しいわけではありません。[ 新規追加]、分類リスト、分類編集、エントリリストなど、ほとんどの投稿タイプ画面でadmin_initに値が設定されていますが、[YourPostTypeの編集]画面にはありません。

また、他の人が指摘したように、スタイルシートとスクリプトをWP Adminに追加するために使用する正しいフックはadmin_enqueue_scriptsです。このフックを使用する場合is_admin()、WP Adminでのみ起動され、パラメーターとして現在の画面を取得するため、チェックする必要はありません。 http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.