it-swarm.asia

Dış Komut Dosyalarını Yönetici'ye ancak SADECE Belirli Bir Yazı Türü için Yükleme

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

Özel yazı türlerini birçok farklı projede kullanmaya başladım ve bunları daha sonra jQuery etkinlik takvimi seçicileri gibi özel komut dosyaları ekleyerek daha da genişlettiğim özel meta kutularla genişlettim ... Tüm bu önemli konular hariç ... Bu özel jQuery scriptlerinin admin'in her sayfasına yüklenmesini istemiyorum.

Aslında sadece özel bir yazı tipi için "yazıyı düzenle" sayfasındayken sadece bu özel jquery alanlarının yüklenmesinin bir yolunu arıyorum.

Buradaki en iyi çözüm nedir?


GÜNCELLEME 1

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

Aslında, eklenti geliştiricilerin böyle şeylerden emin olmadıklarından dolayı şok oldum çünkü bunun farkına vardığımda, sorunların farklı eklentilerde var olmasının temel nedenlerinden biri.

Bununla birlikte bazı sorunlar yaşıyorum. Örneğin...

Komut dosyasını, if ifadesini bu şekilde çağırmak için 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öylece "olaylar" yazı tipinde bir yazı eklerken ya da düzenlerken SADECE komut dosyalarım çağrılıyor.

Komut dosyasının başka bir sayfaya yüklenmesini istemiyorum ve ayrıca "olaylar" yazı tipinde sayfa listesinde çalışmasını istemiyorum, bu yüzden if ifadesinin doğru olduğunu düşünüyorum.

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

Bunu test edebilir ve belki de yanlış yaptığımı haberim olur mu?

İşte kullanıyorum tam kod ... belki 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 ... üç gönderi türü eklemek ve her gönderi türü için farklı JS komut dosyaları yüklemek isteseydim, üç ayrı zamanın üzerindeki kodu kopyalar mıydım yoksa bu bunu yapmanın iyi bir yolu değil mi? Örneğin ... sadece aramak daha iyi olur mu: global $ pagenow, $ typenow; İşlevlerimin üstünde birden çok kez çoğalttığımda işler önemli mi yoksa karmaşık mı?

Aynı şeyle ilgili farklı bir problemde ... Örneğin, "yerçekimi formları" eklentisini kullanıyorum, ancak komut dosyalarının diğer eklentilerde sorunlara neden olan yönetici üzerindeki her sayfada yayınlandığını fark ettim. Komut dosyalarının yalnızca ihtiyaç duyduğumda yüklenmesini sağlamak için komut dosyalarını nasıl değiştiririm?.


GÜNCELLEME 2

Functions.php dosyamı Mike tarafından verilen kodla değiştirdim (aşağıda), ancak görünen bir javascript hala YENİ bir Yazı veya Sayfa oluşturduğunuzda eklenmiş görünüyor. Bu, yeni bir varsayılan wordpress yazı/sayfa oluşturarak YENİ bir Yazı veya Sayfa oluşturmaya çalıştığınızda veya özel yazı türlerinden birini temel alan YENİ bir yazı/sayfa oluşturduğunuzda anlamına gelir. Mike tarafından önerilen kodIS diğer tüm yönetici sayfalarında çalışıyor ve mevcut bir yazıyı/sayfayı ya da özel yazı türünü "DÜZENLENDİRDİĞİNİZ" ÇALIŞIYOR. Bu işi düzeltmek için önerilen herhangi bir değişiklik var mı?

İşte şu anki kodum:

<?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
NetConstructor.com

Öncelikle, sanırım komut dosyalarınızı yüklemek için wp_enqueue_script() kullanıyorsunuz , değil mi?

Bununla birlikte, eğer sorunuzu anlarsam ihtiyacınız olan şey şunun gibi bir şeydir . Elbette ayrıntılarınız için düzenlemek zorunda kalacaksınız, ancak size genel bir çerçeve sunuyor.

admin_init işlevini, yönetici sayfası $pagenow ile bir eşleşme için global edit.php testini yapmak için load_my_script() işlevini ve post tipinin istediğiniz olup olmadığını görmek için global $typenow kodunu çektik.

Gerisi sadece here hakkında daha fazla bilgi edinmek istersen okuyabileceğiniz detaylar:

<?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ÜNCELLEŞTİRME

Güncellemene cevap veriyorum. Ne yazık ki (ne nedenle olursa olsun) $typenow, admin_init sırasında bir değere sahip değildir; bu nedenle, aşağıdaki örnekte gördüğünüz gibi post_type URL parametresini temel alarak gönderiyi yükleyerek 'post' almanız gerekir (ı yukarıdaki çizgiyi ve aşağıdaki çizgiyi örneğinizden kopyaladı, böylece nereye yerleştireceğinizi görebilirsiniz):

<?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ı siteye yeni sorular olarak gönderin benim veya başkalarının yanıtlaması için. Size yardımcı olmak için çok çalıştığımız için, lütfen başlığınıza mümkün olan en iyi unvanı vermeye özen gösterin ve lütfen sorularınızı iyi biçimlendirme ve uygun İngilizce ile mümkün olduğunca açık ve net bir şekilde yazın. Bunu yaparsanız, aynı sorunların sorunuzu ihtiyaç duyduklarına benzer olarak algılamasına yardımcı olacak ve sorularınızı yanıtlayan bizim için daha kolay hale getirecektir.

Bunu sizden (ve WordPress Cevapları hakkında sorular soran diğer herkesin)) sorularınızı cevaplamak için zaman harcaması karşılığında bir iyilik olarak rica ediyorum, çünkü ben ve diğer moderatörler WordPress Yanıtlarını çok büyük yapmak istiyor web'de başka pek çok site gibi cevapları bulmak zor ve okunması zor başka bir özensiz forum yerine topluluk için kaynak.

GÜNCELLEME # 2

İf ifadenizde operatör önceliği sorunları olabileceğini düşündüm, ancak daha önce test etmeden önce test etmedim. Söylediğiniz gibi davranıyorsa, o zaman neredeyse kesinlikle bunu yapın, bunun yerine bunu 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'));
    }
  }
}
14
MikeSchinkel

Justin Tadlock'a göre, eklentiler için wp_enqueue_scripts yerine, sadece admin betikleri için admin_enqueue_scripts'e bağlanmalısınız:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');

Buraya ilgili bir sorunu çözen bir kod ekleyeceğimi düşündüm. Benim durumumda sadece Sayfa ve Yazılara yüklenecek JavaScript ve css kullanmaya çalışıyorum (ve düzenle ve oluştur) ve başka hiçbir yerde yok.

Nerede olduğumu belirlemek için basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) işlevini kullanarak uygulanabilir bir çözüm bulmuştum. $_SERVER[ 'SCRIPT_FILENAME' ] 'nin kullanılabilirliği sunucudan sunucuya değişebileceğinden endişe duydum (kimse $_SERVER[ 'SCRIPT_FILENAME' ]'un bir sunucuda bulunmamasının ne kadar muhtemel olduğunu bilen var mı?)

Sonra bu soru ve MikeSchinkel cevap geldi. Küçük bir değişiklikle, bir şey dışında benim için çalışmasını sağladım. Her ne sebeple olursa olsun, "Yeni Ekle" ile yeni bir gönderi oluşturulduğunda işe yaramaz.

İzleyen tweaks ile çalışmasını sağladım ve burada başkalarına yardım etme ve geliştirme 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, $ pagenow'a dayanarak yapılmayan URL, admin.php? Page = themeoptions olduğundan ve komutları her yöneticide istemiyorum. .php sayfası, yalnızca o sayfada (tema seçenekler sayfam)

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

Ve kendi soruma cevap vermek için:

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

 }
3
Ashley G

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


}
1
chifliiiii

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

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
grappler

Bu

$ typenow admin_init sırasında bir değere sahip değildir

tamamen doğru değil. Admin_init'te most post tipi ekranlarda Yeni Ekle, taksonomi listesi, taksonomi düzenleme ve giriş listesi gibi ayarlanmış bir değere sahiptir, ancak "Edit YourPostType" ekranında bir tane yoktur.

Ayrıca, başkalarının da belirttiği gibi, WP Admin'ye stil sayfaları ve komut dosyaları eklemek için kullanılacak doğru kanca. admin_enqueue_scripts. Eğer bu kancayı kullanırsanız, sadece WP Admin'de ateşlendiğinden is_admin() işlevini kontrol etmeniz ve mevcut ekranın parametresi olarak almanız gerekmez. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot