it-swarm-eu.dev

Načítání externích skriptů ve správci, ale POUZE pro konkrétní typ příspěvku?

Tak jsem se do této problematiky nadále dostávala a já jsem hledala nejlepší a nejjednodušší řešení tohoto problému.

Přišel jsem využít vlastní typy příspěvků v mnoha různých projektech a rozšířil jsem je o vlastní metaboxy, které jsem pak dále rozšířil přidáním vlastních skriptů, jako jsou například jQuery event calendar selectors ... To vše funguje kromě jednoho klíčového problému ... Nechci, aby tyto vlastní jQuery skripty byly načteny na každé stránce v admin.

Jsem v podstatě jen hledá způsob, jak jen tyto vlastní jQuery pole načten, když jsem na stránce "upravit příspěvek" pro SPECIFIC příspěvek typu.

Jaké je zde nejlepší řešení?


UPDATE 1

Především vám děkuji.

Jsem vlastně šokován, že vývojáři pluginů se ujistit, že takové věci, protože jak jsem zjistil, že je to jeden z klíčových důvodů, že problémy existují s různými pluginy.

Mám s tím však nějaké další otázky. Například...

Upravil jsem skript tak, aby zavolal příkaz if takto:

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

Jak vidíte, snažím se věci nastavovat tak, aby se mé skripty mohli zavolat pouze tehdy, když přidávám nebo upravuji příspěvek v rámci příspěvku typu události.

Nechci, aby se skript načítal na jakoukoli jinou stránku a také nechci, aby se spouštěl na seznamu stránek v rámci typu příspěvku typu "události", takže si myslím, že je-li prohlášení správné.

Problém se však zdá být, že skript se načte pouze tehdy, když v tomto typu příspěvku vytvořím nový příspěvek, ale zdá se, že nefunguje, když upravuji existující příspěvek.

Můžete to vyzkoušet a možná mi dejte vědět, co bych mohl dělat špatně?

Zde je přesný kód, který používám ... možná je lepší nebo jednoduchý způsob, jak to udělat?

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

Také ... kdybych chtěl přidat tři typy příspěvků a načíst různé JS skripty pro každý typ příspěvku, pak bych měl duplikovat kód nad tři samostatné časy nebo to není dobrý způsob, jak to udělat? Například ... bylo by lepší zavolat: globální $ pagenow, $ typenow; V horní části souboru funkcí, nebo to záleží nebo komplikuje věci, když jsem duplikovat více než jednou?

Na jiný problém týkající se stejné ... Já jsem například s využitím "gravitace formuláře" plugin, ale všiml jsem si jejich skripty běží na každé stránce na admin, který způsobuje problémy s jinými pluginy. Jak bych šel o úpravě jejich skriptu, aby bylo zajištěno, že skripty budou načteny pouze tehdy, když je potřebuji.


AKTUALIZACE 2

Upravil jsem soubor functions.php kódem poskytnutým společností Mike (níže), ale zdá se, že při vytváření nového příspěvku nebo stránky se příslušný javascript stále obsahuje. To znamená, že když se pokusíte vytvořit NOVÝ příspěvek nebo stránku buď vytvořením nového výchozího příspěvku na stránce nebo stránky nebo při vytvoření nového příspěvku nebo stránky založeného na jednom z vašich vlastních typů příspěvků. Kód navržený společností Mike IS pracuje na všech dalších stránkách administrátora a funguje, když "EDIT" existující příspěvek/stránku nebo vlastní příspěvek typu. Jakékoli navrhované úpravy, které by tuto práci opravily?

Zde je můj aktuální kód:

<?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

Nejprve předpokládám, že používáte wp_enqueue_script() k načtení skriptů , že?

To znamená, že pokud chápu vaši otázku pak to, co potřebujete, je něco jako následující . Samozřejmě to budete muset upravit pro své údaje, ale dává vám obecný rámec.

Jsme háčkování admin_init s funkcí load_my_script() testuje globální $pagenow pro zápas s admin stránky edit.php a globální $typenow zjistit, zda typ příspěvku je ten, který chcete.

Ostatní jsou jen detaily, které si můžete přečíst o zde pokud se potřebujete dozvědět více:

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

AKTUALIZACE

Odpovídám na vaši aktualizaci. Bohužel (z jakéhokoliv důvodu) $typenow nemá hodnotu admin_init, takže budete muset získat post_type načtením příspěvku na základě parametru adresy URL 'post', jak vidíte v následujícím příkladu. zkopírovat řádek nahoře a řádek níže z příkladu, abyste viděli, kam jej umístit:

<?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. Pokud jde o vaše další otázky, pošlete je jako novou otázku na webu pro mne nebo pro ostatní. Vzhledem k tomu, že vám tak tvrdě pomáháme, věnujte velkou pozornost tomu, abyste svému titulu udělili nejlepší titul, který můžete, a také napište své otázky tak jasně a stručně, jak je to možné, s dobrým formátováním a správnou angličtinou. Pokud to uděláte, pomůže vám se stejnými problémy rozpoznat vaši otázku jako podobnou té, kterou potřebují, a to nám usnadní, kdo zodpoví vaše otázky.

Ptám se vás toto (a ze všech ostatních, kteří kladou otázky na WordPress odpovědi) jako laskavost výměnou za to, že jste se snažili odpovědět na vaše otázky, protože já a ostatní moderátoři chtějí, aby WordPress odpovědi byly ohromné zdroj pro komunitu místo dalšího nedbalého fóra, které je těžké číst a těžko najít odpovědi jako mnoho jiných stránek na webu.

UPDATE # 2

Myslel jsem, že jste měli ve svém prohlášení, pokud jste testovali, ale když jsem testoval dřív, než jsem do něj narazil. Pokud se chová jako vaše tvrzení, pak to téměř určitě zkuste místo toho (promiňte, nemám čas otestovat toto právo, aby bylo jisté, že to funguje):

<?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

Na Justin Tadlock byste měli zavést do admin_enqueue_scripts na rozdíl od wp_enqueue_scripts pro pluginy nebo administrátorské skripty:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');

Myslel jsem, že sem přidám nějaký kód, který vyřešil můj problém. V mém případě se snažím dostat JavaScript a css načíst pouze na stránky a příspěvky a (upravit a vytvořit) a ne tam, kde jinde.

Našel jsem funkční řešení s použitím basename( $_SERVER[ 'SCRIPT_FILENAME' ] ), abych zjistil, kde jsem byl. Byl jsem však znepokojen tím, že dostupnost $_SERVER[ 'SCRIPT_FILENAME' ] se může lišit server na server (někdo ví, jak je pravděpodobné, že $_SERVER[ 'SCRIPT_FILENAME' ] není k dispozici na serveru?)

Pak jsem narazil na tuto otázku a MikeSchinkel odpověď. S malou úpravou jsem to udělal pro mě, až na jednu věc. Zdá se, že z jakéhokoli důvodu, když je vytvořen nový příspěvek pomocí funkce Přidat nový, nefunguje to.

S následujícími vylepšeními jsem to dostal do práce a sdílím to zde v naději, že budu pomáhat druhým a zlepšovat ho.

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

  }
 }
}

Další Snažím se omezit některé skripty na stránku s možnostmi motivů, což nelze provést na základě $ pagenow, protože adresa URL, která přichází, je admin.php? Page = themeoptions a nechci skripty na každém adminovi Stránka .php, pouze na dané stránce (stránka s možnostmi motivu)

Každý, kdo ví, jak to nejlépe udělat?

A odpovědět na vlastní otázku:

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

 }
3
Ashley G

Co takhle:

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

Vytvořil jsem verzi, která nepoužívá proměnnou $ 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

Vím, že otázka byla zodpovězena. Myslím, že je to jednodušší řešení.

<?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

Tento

$ typenow nemá hodnotu během admin_init

není zcela správné. Má hodnotu nastavenou na admin_init v většině post obrazovkách typu jako Přidat nový, seznam taxonomií, editaci taxonomií a seznam položek, ale na obrazovce "Edit YourPostType" nemá žádnou.

Také, jak jiní ukázali, správný háček použít k přidání stylů a skriptů do WP Admin je admin_enqueue_scripts. Pokud použijete tento háček, nemusíte kontrolovat is_admin(), protože je spuštěn pouze v režimu WP Admin a dostanete jako parametr aktuální obrazovku. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot