web-dev-qa-db-ja.com

管理で外部スクリプトをロードするが特定の投稿タイプのみ

だから私はこの問題に遭遇し続けており、私はこの問題を解決するための最善かつ最も簡単な解決策を探しているだけです。

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

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

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


アップデート1

まずはじめに、ありがとうございました。

プラグイン開発者がこのようなことを確認してはいけないことに私は実際にショックを受けています。

私はこれでいくつかのさらなる問題を抱えています。例えば...

このようにif文を呼び出すようにスクリプトを修正しました。

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

ご覧のとおり、投稿タイプを "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回に分けて複製するだけでいいのでしょうか、これはあまり良い方法ではありませんか。たとえば...グローバル$ pagenow、$ typenow;と呼ぶだけの方が良いでしょう。私のfunctionsファイルの一番上にありますか、それを何度も複製したときにそれが問題になったり複雑になったりしませんか?

同じことに関連する別の問題について...私は例えば "重力フォーム"プラグインを利用していますが、私は他のプラグインで問題を引き起こしている管理者のすべてのページでそれらのスクリプトが実行されることに気づきました。スクリプトが必要なときにのみロードされるように、スクリプトを変更する方法について説明します。


アップデート2

下記のMikeが提供するコードでfunctions.phpファイルを修正しましたが、新しい投稿やページを作成するときには、該当するJavaScriptがまだ含まれているようです。つまり、新しいデフォルトのワードプレスの投稿/ページを作成して新しい投稿またはページを作成しようとしたとき、またはカスタム投稿タイプの1つに基づいて新しい投稿/ページを作成したとき。 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

まず、 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'));
  }
}

更新

あなたの更新に返信します。残念ながら(何らかの理由で$typenowadmin_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') {

追伸他の質問については、サイトに新しい質問として投稿してください。私たちはあなたを助けるために一生懸命に働いているので、あなたのタイトルにあなたができる限り最高のタイトルを与えるように細心の注意を払ってください。また、良いフォーマットと適切な英語でできるだけ明確かつ簡潔に質問を書いてくださいこれを行うと、同じ問題があなたの質問を彼らが必要とするものに類似していると認識するのに役立ち、あなたの質問に答えている私たちにとって簡単になります。

私はあなた(およびWordPress Answersで質問する他のすべての人)に質問します。私と他のモデレーターは、WordPress Answersを、ウェブ上の他の多くのサイトのように読みにくく、答えを見つけるのが難しい、もう一つのずさんなフォーラムの代わりに、コミュニティのための途方もないリソースにします。

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

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

私の関連する問題を解決するコードをここに追加すると思いました。私の場合は、JavaScriptとcssをPagesとPostsにのみロードし(edit and create)、他にはロードしないようにしています。

バックエンドのどこにいるのかを判断するためにbasename( $_SERVER[ 'SCRIPT_FILENAME' ] )を使った実用的な解決策を見つけました。私は$_SERVER[ 'SCRIPT_FILENAME' ]が利用できるかどうかによってサーバーごとに異なるかもしれないので心配していました(誰でも$_SERVER[ 'SCRIPT_FILENAME' ]がサーバー上で利用できない可能性があることを誰もが知っていますか?)

それから私はこの質問とMikeSchinkelの答えに出くわしました。ちょっとした変更を加えて、1つのことを除いて私はそれを私のために動かしました。何らかの理由で新しい投稿が「新規追加」で作成されたときにはうまくいかないようです。

以下の微調整で、私はそれがうまくいくようにしました、そして、私はここでそれを共有しています。

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であるため、$ pagenowに基づいて実行できないスクリプトをテーマオプションページに制限しようとしていますが、すべての管理者にスクリプトを使用したくないです.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

この

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

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

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

0
Elliot