Memuat Skrip Eksternal di Admin tetapi HANYA untuk Jenis Posting Tertentu?

16

Jadi saya terus mengalami masalah ini dan saya hanya mencari solusi terbaik dan paling sederhana untuk menyelesaikan masalah ini.

Saya datang untuk menggunakan jenis posting khusus di banyak proyek yang berbeda dan telah memperpanjang ini dengan metabox khusus yang kemudian saya lanjutkan dengan menambahkan skrip khusus seperti pemilih kalender acara jQuery ... Semua ini berfungsi dengan baik kecuali untuk satu masalah utama ... Saya tidak ingin skrip jQuery kustom ini dimuat di setiap halaman di admin.

Saya pada dasarnya hanya mencari cara untuk memiliki bidang jquery khusus ini dimuat ketika saya pada halaman "edit posting" untuk jenis posting SPESIFIK.

Apa solusi terbaik di sini?


PEMBARUAN 1

Pertama-tama, terima kasih banyak.

Saya benar-benar terkejut bahwa pengembang plugin tidak memastikan hal-hal seperti ini karena ketika saya mencari tahu ini adalah salah satu alasan utama bahwa ada masalah dengan plugin yang berbeda.

Saya memiliki beberapa masalah lebih lanjut dengan ini. Sebagai contoh...

Saya telah memodifikasi skrip untuk memanggil pernyataan if seperti ini:

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

Seperti yang Anda lihat, saya mencoba mengatur semuanya sehingga skrip saya HANYA dipanggil ketika saya menambahkan atau mengedit posting dalam jenis posting "peristiwa".

Saya tidak ingin skrip dimuat pada halaman lain dan juga tidak ingin skrip berjalan pada daftar halaman dalam jenis tulisan "peristiwa" jadi saya akan berpikir pernyataan if benar.

Namun masalahnya tampaknya skrip hanya dimuat ketika saya membuat posting baru dalam jenis posting ini tetapi tampaknya tidak berfungsi ketika saya mengedit posting yang sudah ada.

Bisakah Anda menguji ini dan mungkin memberi tahu saya apa yang bisa saya lakukan salah?

Berikut adalah kode persis yang saya gunakan ... mungkin ada cara yang lebih baik atau sederhana untuk melakukan ini?

<?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");
  }
}

Juga ... jika saya ingin menambahkan tiga jenis posting dan memuat skrip JS yang berbeda untuk setiap jenis posting maka apakah saya akan menduplikasi kode di atas tiga kali terpisah atau apakah ini bukan cara yang baik untuk melakukan ini? Misalnya ... apakah lebih baik menelepon: global $ pagenow, $ typenow; Di bagian atas file fungsi saya atau apakah itu penting atau menyulitkan ketika saya menduplikasinya lebih dari sekali?

Pada masalah yang berbeda terkait dengan hal yang sama ... Saya misalnya menggunakan plugin "gayaberkas" tetapi saya perhatikan skrip mereka berjalan pada setiap halaman di admin yang menyebabkan masalah dengan plugin lain. Bagaimana saya akan memodifikasi skrip mereka untuk memastikan skrip hanya dimuat ketika saya membutuhkannya.


PEMBARUAN 2

Saya telah memodifikasi file functions.php saya dengan kode yang disediakan oleh Mike (di bawah) namun tampaknya javascript yang berlaku masih disertakan ketika Anda membuat Posting atau Halaman BARU. Ini berarti bahwa ketika Anda mencoba untuk membuat Posting atau Halaman BARU baik dengan membuat posting / halaman wordpress default baru atau ketika Anda membuat posting / halaman BARU berdasarkan salah satu jenis posting kustom Anda. Kode yang diusulkan oleh Mike IS bekerja pada semua halaman admin lainnya dan TIDAK AKAN berfungsi ketika Anda "MENGEDIT" pos yang ada / halaman atau jenis pos kustom. Adakah modifikasi yang disarankan untuk membuat pekerjaan ini benar?

Ini kode saya saat ini:

<?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");
    }
   }
?> 
NetConstructor.com
sumber
2
@ NetConstuctor.com: Jangan kaget, banyak orang yang menulis plugin belajar ke program sehingga mereka bisa menulis plugin dan dengan demikian memiliki latar belakang pemrograman yang sangat sedikit. Mereka menggaruk gatal, tidak mengikuti praktik terbaik.
MikeSchinkel

Jawaban:

14

Pertama, saya menganggap Anda menggunakan wp_enqueue_script()untuk memuat skrip Anda , bukan?

Yang mengatakan, jika saya mengerti pertanyaan Anda maka yang Anda butuhkan adalah sesuatu seperti yang berikut . Anda harus mengeditnya untuk detail Anda, tentu saja, tetapi itu memberi Anda kerangka umum.

Kami terhubung admin_initdengan fungsi load_my_script()untuk menguji global $pagenowuntuk kecocokan dengan halaman admin edit.php, dan global $typenowuntuk melihat apakah jenis posting adalah yang Anda inginkan.

Sisanya hanyalah detail yang bisa Anda baca di sini jika Anda perlu mempelajari lebih lanjut:

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

MEMPERBARUI

Saya membalas pembaruan Anda. Sayangnya ( untuk alasan apa pun ) $typenowtidak memiliki nilai selama admin_initjadi Anda harus mendapatkan post_typedengan memuat posting berdasarkan parameter URL 'post'seperti yang Anda lihat pada contoh berikut (saya telah menyalin baris di atas dan baris di bawah dari contoh Anda sehingga Anda dapat melihat di mana menempatkannya):

<?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 Adapun pertanyaan Anda yang lain, silakan posting sebagai pertanyaan baru di situs untuk saya atau orang lain untuk menjawab. Karena kami bekerja sangat keras untuk membantu Anda, harap berhati-hati untuk memberikan judul terbaik Anda sebisa mungkin dan juga silakan tulis pertanyaan Anda sejelas dan sejelas mungkin dengan format yang baik dan bahasa Inggris yang tepat. Jika Anda akan melakukan ini, itu akan membantu dengan masalah yang sama mengenali pertanyaan Anda sebagai mirip dengan apa yang mereka butuhkan dan itu akan memudahkan kita yang menjawab pertanyaan Anda.

Saya menanyakan hal ini kepada Anda ( dan semua orang lain yang mengajukan pertanyaan pada Jawaban WordPress ) sebagai imbalan sebagai imbalan atas upaya waktu untuk menjawab pertanyaan Anda karena saya dan moderator lainnya ingin menjadikan Jawaban WordPress sumber daya yang luar biasa bagi masyarakat alih-alih Belum lagi forum ceroboh yang sulit dibaca dan sulit menemukan jawaban seperti banyak situs lain di web.

PEMBARUAN # 2

Saya pikir Anda mungkin memiliki masalah prioritas operator dalam pernyataan if Anda, tetapi ketika saya menguji sebelum saya tidak mengalami itu. Jika berperilaku seperti yang Anda katakan maka Anda hampir pasti melakukannya, cobalah ini (maaf, saya tidak punya waktu untuk menguji ini sekarang untuk memastikan bahwa itu berfungsi):

<?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'));
    }
  }
}
MikeSchinkel
sumber
hai mike ... lihat komentar saya di bawah ini ... maaf, saya diposting di kotak yang salah
NetConstructor.com
@ NetConstuctor.com : Tolong jangan berikan klarifikasi untuk pertanyaan Anda di tempat yang dirancang untuk jawaban . Saya telah memindahkan konten yang Anda masukkan ke dalam pertanyaan dan memilih untuk menutup jawaban itu.
MikeSchinkel
Hai Mike ... kode Anda berfungsi dengan baik kecuali untuk satu masalah ... Ketika Anda berada di halaman admin di mana Anda dapat menambahkan posting baru atau halaman baru (saya berbicara tentang posting / halaman default) kode javascript yang seharusnya hanya dimuat untuk jenis pos kustom TIDAK dimuat. Selain masalah ini tampaknya berfungsi dengan baik dan hanya memuat javascript pada jenis posting yang ditentukan. Apakah Anda memiliki modifikasi yang dapat Anda sarankan?
NetConstructor.com
Maaf Mike - Asumsi awal saya sebenarnya salah. Tampaknya kode yang Anda berikan IS termasuk javascript pada jenis posting lain yang saya miliki juga. Saya telah pergi dan menyertakan skrip persis seperti yang Anda sarankan. Bisakah Anda tinjau ini sekali lagi?
NetConstructor.com
1
OK ... Jadi setelah meninjau ini lebih jauh, saya menemukan bahwa kode Mike memang berfungsi dengan benar di mana-mana kecuali ketika Anda membuat posting "BARU". Dari apa yang saya lihat di sini, javascript salah dimasukkan ketika Anda membuat HALAMAN BARU, POST BARU untuk halaman / posting wordpress default serta jenis posting kustom yang mungkin Anda miliki. Kode ini berfungsi (berarti javascript tidak termasuk) ketika Anda mengedit posting atau halaman yang ada yang merupakan posting atau halaman wordpress default atau jenis posting kustom. Dapatkah seseorang memberikan modifikasi yang disarankan untuk memperbaiki masalah ini?
NetConstructor.com
3

Saya pikir saya akan menambahkan beberapa kode di sini yang memecahkan masalah saya yang terkait. Dalam kasus saya, saya mencoba untuk mendapatkan JavaScript dan css untuk memuat hanya pada Halaman dan Posting dan (edit dan buat) dan tidak ada tempat lain.

Saya telah menemukan solusi yang bisa digunakan basename( $_SERVER[ 'SCRIPT_FILENAME' ] )untuk menentukan di mana saya berada di backend. Saya prihatin karena ketersediaan $_SERVER[ 'SCRIPT_FILENAME' ]mungkin bervariasi server ke server (ada yang tahu seberapa besar kemungkinan untuk $_SERVER[ 'SCRIPT_FILENAME' ]tidak tersedia di server?)

Kemudian saya menemukan pertanyaan ini dan jawaban MikeSchinkel. Dengan sedikit modifikasi saya membuatnya bekerja untuk saya kecuali untuk satu hal. Tampaknya untuk alasan apa pun ketika posting baru dibuat melalui "Tambah Baru", itu tidak berfungsi.

Dengan tweak berikut saya membuatnya bekerja dan saya berbagi di sini dengan harapan membantu orang lain dan meningkatkannya.

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

  }
 }
}

Selanjutnya saya mencoba membatasi beberapa skrip pada halaman opsi tema saya, yang tidak dapat dilakukan berdasarkan $ pagenow karena url yang muncul adalah admin.php? Page = themeoptions dan saya tidak ingin skrip pada setiap admin halaman .php, hanya pada halaman tertentu (halaman opsi tema saya)

Adakah yang tahu bagaimana ini sebaiknya dilakukan?

Dan untuk menjawab pertanyaan saya sendiri:

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

 }
Ashley G
sumber
2

Saya tahu pertanyaannya telah dijawab. Saya pikir ini adalah solusi yang lebih sederhana.

<?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");
    }

}
?> 
penggenggam
sumber
1

Saya membuat versi yang tidak menggunakan variabel $ 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;
}
Menandai
sumber
Global tidak akan berubah, jadi mereka aman digunakan. Selain itu ada kait yang khusus untuk halaman-halaman itu, jadi Anda tidak memerlukan fungsi dan upaya itu. Last but not least: Anda memeriksa string yang tidak ketat dan juga non-yoda-gaya, karena itu mereka bisa gagal. Juga mengandalkan $_GEThanya bisa gagal. Bagaimanapun: Selamat datang di WPSE.
kaiser
1

Bagaimana dengan:

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


}
chifliiiii
sumber
0

Ini

$ typenow tidak memiliki nilai selama admin_init

tidak sepenuhnya benar. Itu memang memiliki nilai yang ditetapkan pada admin_init di sebagian besar layar jenis posting seperti Tambah Baru, daftar taksonomi, edit taksonomi dan daftar entri, tetapi tidak memiliki satu di layar "Edit YourPostType".

Juga, seperti yang ditunjukkan orang lain, kait yang benar untuk digunakan untuk menambahkan stylesheet dan skrip ke WP Admin adalah admin_enqueue_scripts. Jika Anda menggunakan pengait ini, Anda tidak perlu memeriksa is_admin()karena itu hanya diaktifkan di WP Admin dan Anda mendapatkan sebagai parameter layar saat ini. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Elliot
sumber