it-swarm-id.com

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

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 hanya 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 "gravitasi bentuk" 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 BAIK ketika Anda "MENGEDIT" pos/halaman yang ada 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");
    }
   }
?> 
16

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

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

Kami menghubungkan admin_init dengan fungsi load_my_script() untuk menguji $pagenow global untuk kecocokan dengan halaman admin edit.php, dan $typenow global untuk melihat apakah jenis posting adalah yang Anda inginkan.

Sisanya hanyalah detail yang dapat Anda baca tentang 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) $typenow tidak memiliki nilai selama admin_init sehingga Anda harus mendapatkan post_type dengan memuat postingan berdasarkan parameter URL 'post' seperti yang Anda lihat pada contoh berikut (saya sudah salin baris di atas dan baris di bawah ini 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') {

P.S. 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 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 luar biasa. sumber daya untuk komunitas alih-alih forum ceroboh lain 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'));
    }
  }
}
14
MikeSchinkel

Per Justin Tadlock, Anda harus menghubungkan ke admin_enqueue_scripts yang bertentangan dengan wp_enqueue_scripts untuk plugin atau skrip admin saja:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');

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 diterapkan menggunakan 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 $_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' );

  }
 }
}

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

 }
3
Ashley G

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


}
1
chifliiiii

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

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

}
?> 
1
grappler

Ini

$ typenow tidak memiliki nilai selama admin_init

tidak sepenuhnya benar. Itu memang memiliki nilai yang ditetapkan pada admin_init di most layar jenis posting seperti Tambah Baru, daftar taksonomi, edit taksonomi dan daftar entri, tetapi tidak ada 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 hanya diaktifkan dalam WP Admin dan Anda mendapatkan sebagai parameter layar saat ini. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot