Harici Betikleri Yönetici'ye Yüklemek SADECE Belirli Bir Yazı Türü için Yüklüyor mu?


16

Bu yüzden bu sorunla karşılaşmaya devam ediyorum ve sadece bu sorunu çözmek için en iyi ve en basit çözümü arıyorum.

Birçok farklı projede özel yazı türlerinden faydalanmaya başladım ve bunları jQuery etkinlik takvimi seçicileri gibi özel komut dosyaları ekleyerek daha da genişlettiğim özel meta kutularla genişlettim ... Tüm bu önemli bir sorun dışında harika çalışıyor ... Bu özel jQuery komut dosyalarının yönetici içindeki her sayfaya yüklenmesini istemiyorum.

Ben sadece bir SPECIFIC yazı türü için "yazı düzenleme" sayfasında olduğumda sadece bu özel jquery alanları yüklü olması için bir yol arıyorum.

Buradaki en iyi çözüm nedir?


GÜNCELLEME 1

Her şeyden önce, çok teşekkür ederim.

Aslında eklenti geliştiricilerinin böyle şeylerden emin olmadıkları için şok oldum, çünkü bu farklı eklentilerle ilgili sorunların varlığının temel nedenlerinden biri.

Bununla ilgili başka sorunlar yaşıyorum. Örneğin...

Bu gibi if ifadesini çağırmak için komut dosyasını değiştirdim:

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

Gördüğünüz gibi bir şeyler ayarlamaya çalışıyorum, böylelikle komut dosyalarım SADECE "olaylar" yazı tipinde bir yazı eklerken veya düzenlerken çağrılıyor.

Ben komut dosyası başka bir sayfada yüklemek istemiyorum ve ayrıca "olaylar" yazı türü içinde sayfa listesinde çalıştırmak istemiyorum, bu yüzden if deyimi doğru olduğunu düşünürdüm.

Ancak sorun betiğin sadece bu yazı türünde yeni bir yazı oluşturduğumda yüklenmesi gibi görünüyor ancak mevcut bir yazı düzenlerken çalışmıyordu.

Bunu test edebilir ve neyi yanlış yapabileceğimi bana bildirir misiniz?

İşte kullanıyorum tam kodu ... belki de bunu yapmanın daha iyi veya basit bir yolu var mı?

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

Ayrıca ... üç yazı tipi eklemek ve her yazı türleri için farklı JS komut dosyaları yüklemek istedim, o zaman sadece üç ayrı kez yukarıdaki kodu çoğaltır mıyım yoksa bu bunu yapmanın iyi bir yolu değil mi? Örneğin ... sadece şunu aramak daha iyi olur: global $ pagenow, $ typenow; İşlevlerimin üst kısmında veya birden fazla kez çoğalttığımda bir şey önemli mi yoksa karmaşık mı?

Aynı ile ilgili farklı bir sorun üzerinde ... Örneğin "yerçekimi formları" eklentisi kullanıyorum ama komut dosyalarını diğer eklentiler ile ilgili sorunlara neden yönetici her sayfada çalıştırmak fark ettim. Nasıl ben sadece onlara ihtiyacım olduğunda yüklenmesini sağlamak için onların komut dosyasını değiştirme hakkında gitmek istiyorum.


GÜNCELLEME 2

Benim fonksiyonları.php Mike (sağlanan) kodu ile değiştirdim ancak yeni bir yazı veya sayfa oluşturduğunuzda geçerli javascript hala dahil ediliyor gibi görünüyor. Bu, yeni bir varsayılan wordpress yazısı / sayfası oluşturarak yeni bir gönderi veya sayfa oluşturmaya çalıştığınızda veya özel gönderi türlerinizden birini temel alan yeni bir gönderi / sayfa oluşturduğunuz anlamına gelir. Mike tarafından önerilen kod diğer tüm yönetici sayfalarında çalışır ve mevcut bir yazı / sayfa veya özel yazı türünü "DÜZENLEME" yaptığınızda çalışır. Bu çalışmayı doğru yapmak için önerilen herhangi bir değişiklik var mı?

İşte benim geçerli kod:

<?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: Şok olmayın, eklentileri yazan birçok kişi eklentiyi yazabilmeleri için programlamayı öğrendi ve böylece çok az programlama geçmişine sahip oldu. En iyi uygulamaları takip etmeyen bir kaşıntı çiziyorlar.
MikeSchinkel

Yanıtlar:


14

İlk olarak, komut dosyalarınızı yüklemek için kullandığınızıwp_enqueue_script() varsayıyorum , değil mi?

Bununla birlikte, sorunuzu anlarsam, ihtiyacınız olan şey aşağıdaki gibidir . Elbette ayrıntılarınız için düzenlemelisiniz, ancak size genel bir çerçeve sunuyor.

Biz asılı kalıyor admin_initfonksiyonu ile load_my_script()küresel testlere $pagenowyönetici sayfasına bir maç için edit.phpve küresel $typenowsonrası tip istediğiniz biri olup olmadığını görmek için.

Geri kalanı, daha fazla bilgi edinmek istiyorsanız burada okuyabileceğiniz ayrıntılardır :

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

GÜNCELLEME

Güncellemenizi yanıtlıyorum. Ne yazık ki ( hangi nedenle olursa olsun ) $typenowsırasında bir değere sahip olmadığından , aşağıdaki örnekte gördüğünüz gibi URL parametresine göre yayını yükleyerek admin_initalmanız gerekir (Yukarıdaki satırı ve aşağıdaki satırı örneğinizden kopyaladım böylece nereye yerleştireceğinizi görebilirsiniz):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') {

Not : Diğer sorularınız için, lütfen bunları bana veya başkalarının cevaplaması için siteye yeni bir soru olarak gönderin. Size yardımcı olmak için çok çalıştığımızdan, lütfen başlığınıza mümkün olan en iyi başlığı vermek için büyük özen gösterin ve ayrıca sorularınızı iyi biçimlendirme ve uygun İngilizce ile olabildiğince açık ve öz bir şekilde yazın. Bunu yaparsanız, aynı sorunlara, sorunuzu ihtiyaç duydukları şeye benzer olarak tanıma konusunda yardımcı olur ve sorularınızı yanıtlayanları kolaylaştırır.

Sizden ( ve WordPress Cevapları ile ilgili sorular soran diğerlerinden ) sorularınızı cevaplamak için zaman harcamaktan yana bir iyilik olarak soruyorum çünkü ben ve diğer moderatörler WordPress Yanıtlarını topluluk yerine muazzam bir kaynak haline getirmek istiyoruz internetteki diğer pek çok site gibi okunması zor ve cevap bulması zor bir başka özensiz forum.

GÜNCELLEME # 2

İf ifadenizde bir operatör önceliği sorunu yaşayabileceğinizi düşündüm, ancak daha önce test etmediğimde, onunla karşılaşmadım. Söylediğiniz gibi davranıyorsa, neredeyse kesinlikle bunu yerine deneyin (üzgünüm, çalıştığından emin olmak için şu anda bunu test etmek için zamanım yok):

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

merhaba mike ... aşağıdaki
yorumuma

@ NetConstuctor.com : Lütfen cevaplar için tasarlanan yerde sorunuza açıklama vermeyin . Bir yanıta koyduğunuz içeriği sorunuza taşıdım ve bu cevabı kapatmak için oy kullanıyorum.
MikeSchinkel

Merhaba Mike ... kodunuz bir sorun dışında mükemmel çalışıyor ... Yönetici sayfasında yeni bir yazı veya yeni sayfa (varsayılan yazı / sayfa hakkında konuşuyorum) ekleyebileceğiniz javascript kodu özel yazı tipi için yüklenir Yükleniyor. Bu sorun dışında mükemmel çalışıyor gibi görünüyor ve sadece belirtilen yazı türlerine javascript yüklüyor. Önerebileceğiniz bir değişiklik var mı?
NetConstructor.com

Üzgünüm Mike - İlk varsayım aslında yanlıştı. Sağladığınız kod IS de diğer yazı türleri üzerinde javascript dahil gibi görünüyor. Gittik ve tam olarak önerdiğiniz gibi senaryoyu dahil ettim. Bunu bir kez daha gözden geçirebilir misiniz?
NetConstructor.com

1
Tamam ... Bu daha da inceledikten sonra Mike kodu gerçekten "YENİ" bir yazı oluşturmak dışında gerçekten her yerde çalıştığını öğrendim. Ne görüyorum burada javascript yanlış varsayılan bir Wordpress sayfaları / yazılar yanı sıra olabilecek herhangi bir özel yazı türü için yeni bir sayfa oluşturduğunuzda dahil ediliyor. Varsayılan bir wordpress postası veya sayfası veya özel bir yazı türü olan varolan bir postayı veya sayfayı DÜZENLEDİĞİNİZDE, kod çalışıyor (Javascript'i ölçmek dahil değildir). Birisi bu sorunu çözmek için önerilen bir değişiklik sağlayabilir mi?
NetConstructor.com

3

Ben burada benim ilgili bir sorunu çözdü bazı kod eklemek düşündüm. Benim durumumda JavaScript ve css sadece Sayfalar ve Yayınlar ve (düzenlemek ve oluşturmak) ve başka hiçbir yerde yüklemek için çalışıyorum.

Ben basename( $_SERVER[ 'SCRIPT_FILENAME' ] )arka uçta nerede olduğumu belirlemek için kullanarak uygulanabilir bir çözüm bulmuştu . Gerçi kullanılabilirliği $_SERVER[ 'SCRIPT_FILENAME' ]sunucudan sunucuya değişebilir gibi (herkes $_SERVER[ 'SCRIPT_FILENAME' ]bir sunucuda kullanılabilir olmaması için ne kadar biliyor ?)

Sonra bu soruya rastladım ve MikeSchinkel cevap verdi. Küçük bir değişiklikle, bir şey dışında benim için çalışmasını sağladım. Öyle görünüyor ki, "Yeni Ekle" ile yeni bir yazı oluşturulduğunda herhangi bir nedenle çalışmaz.

Aşağıdaki tweaks ile işe aldım ve burada başkalarına yardım etmek ve geliştirmek umuduyla paylaşıyorum.

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

  }
 }
}

Daha sonra bazı komut dosyalarını tema seçenekleri sayfamla sınırlamaya çalışıyorum, ortaya çıkan url admin.php? Page = themeoptions olduğundan $ pagenow'a göre yapılamıyor ve komut dosyalarını her yöneticide istemiyorum .php sayfası, yalnızca söz konusu sayfada (tema seçenekleri sayfam)

Bunun en iyi nasıl yapılabileceğini bilen var mı?

Ve kendi sorumu cevaplamak için:

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

 }


2

Sorunun cevaplandığını biliyorum. Bunun daha basit bir çözüm olduğunu düşünüyorum.

<?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 değişkenini kullanmayan bir sürüm oluşturdum:

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

Globaller değişmez, bu yüzden kullanmak güvenlidir. Ayrıca, bu sayfalara özgü kancalar vardır, bu nedenle bu işleve ve çabaya ihtiyacınız yoktur. Son fakat en az değil: Sıkı ve yoda tarzı olmayan dizeleri kontrol ediyorsunuz, bu yüzden başarısız olabilirler . Ayrıca $_GETsadece güvenmek başarısız olabilir . Neyse: WPSE'ye hoş geldiniz.
Kaiser

1

Ne dersin:

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

Bu

$ typenow öğesinin admin_init sırasında bir değeri yok

tamamen doğru değil. Yeni Ekle, sınıflandırma listesi, sınıflandırma düzenleme ve giriş listesi gibi çoğu yazı tipi ekranında admin_init'te ayarlanmış bir değere sahiptir , ancak "Edit YourPostType" ekranında bir tane yoktur.

Ayrıca, diğerlerinin de işaret ettiği gibi, WP Admin'e stil sayfaları ve komut dosyaları eklemek için kullanılacak doğru kanca admin_enqueue_scripts. Bu kancayı kullanırsanız is_admin(), sadece WP Admin'de çalıştırıldığından ve geçerli ekran olarak parametre olarak alındığından kontrol etmeniz gerekmez . http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.