Bir widget'ın komut dosyasını / stil sayfasını HEAD'de koşullu olarak sıralayın (yalnızca sayfada mevcutsa!)


13

Aşağıdaki koşullarla bir WordPress widget'ı için komut dosyaları ve stiller yüklemeye çalışıyorum ...

  1. Betikler HEAD'e yüklenmelidir ZORUNLU (aksi takdirde bozulur).
  2. Komut dosyaları SADECE widget gerçekten görüntülendiğinde yüklenmelidir (oldukça ağırdır).

Çok fazla arama yaptım ve bu yaygın (çözülmemiş) bir sorun gibi görünüyor ... ama burada birisinin başarıyla bir geçici çözüm uyguladığını umuyorum.

Bu şimdiye kadar aldığım en iyisi ...

Aşağıda, kenar çubuğuna metin yazdıran basit bir widget bulunmaktadır. Başarıyla koşullu olarak jQuery yükler (widget gerçekten görüntülendiğinde) ... sadece altbilgide hiç! (Not: Bu kesmek sadece geriye dönük uyumluluk sağlayabilir , ancak yalnızca WordPress 3.3 üzerinde de çalışabilir ).

class BasicWidget extends WP_Widget
{

    function __construct() {
        parent::__construct(__CLASS__, 'BasicWidget', array(
            'classname' => __CLASS__,
            'description' => "This is a basic widget template that outputs text to the sidebar"
        ));
    }

  function form($instance) {
    $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
    $title = $instance['title'];
?>
  <p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></label></p>
<?php
  }

  function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['title'] = $new_instance['title'];
    return $instance;
  }

  function widget($args, $instance) {

    extract($args, EXTR_SKIP);

    echo $before_widget;
    $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);

    if (!empty($title))
      echo $before_title . $title . $after_title;;

    echo "<h1>This is a basic widget!</h1>";

    echo $after_widget;

        // if we're echoing out content, enqueue jquery.

        if (!empty($after_widget)) {
            wp_enqueue_script('jquery');
        }
    }
}
add_action( 'widgets_init', create_function('', 'return register_widget("BasicWidget");') );

WordPress widget'ları işlemeye başladığında, sıralamak (veya daha önce sıralanan bir şeyin kaydını silmek) için çok geç görünüyor.

Herhangi bir fikir çok takdir edilecektir!

İşaret.

Yanıtlar:


15

Wordpress is_active_widget__construct'ınızda kullanabileceğiniz güzel bir işlev olarak ve widget'ın geçerli sayfada olup olmadığını test edin ve komutlarınızı / stillerinizi eski örneklere göre ekleyin:

function __construct() {
    parent::__construct(__CLASS__, 'BasicWidget', array(
        'classname' => __CLASS__,
        'description' => "This is a basic widget template that outputs text to the sidebar"
    ));
     if ( is_active_widget(false, false, $this->id_base) )
        add_action( 'wp_head', array(&$this, 'add_styles_and_scripts') );
}

function add_styles_and_scripts(){
    //since its wp_head you need to echo out your style link:
    echo '<link rel="stylesheet" href="http://example.com/css/style.css" type="text/css" />';
    //as for javascript it can be included using wp_enqueue_script and set the footer parameter to true:
    wp_enqueue_script( 'widget_script','http://example.com/js/script.js',array(),'',true );
}

Cevabınız için teşekkürler, Bainternet! Ben sadece kodunuzu test ediyorum ve ne yazık ki, javascript gerçekten şartlı olarak yüklerken, hala altbilgi yükler ... wp_head deniliyor olsa bile. Çok ilginç! (btw, bunu yine de "true" altbilgi komutu olmadan yapar). Ayrıca, stil sayfasının yankılanması, widget'ın sayfada olup olmadığına bakılmaksızın yüklenmesini sağlar. Herhangi bir fikir?
Mark Jeldi

wp_headbaş komut dosyaları yazdırıldıktan sonra çağrılır, böylece bunları yalnızca altbilgiye yükler, ancak tıpkı stil sayfası gibi ve stil sayfası için olduğu gibi yankılandırabilirsiniz ( echo '<script src="path/to/script.js"></script>';yüklü olması mümkün değildir) widget etkin değil
Bainternet

eyleminizde kullanmak wp_enqueue_scriptsyerine kullanmayı deneyin wp_head. Bu, javascript'i başlığa veya altbilgiye koymanıza olanak tanır. http://codex.wordpress.org/Function_Reference/wp_enqueue_script
Nick

Teşekkürler, Nick! Ben wp_enqueue_scripts denedim ve kafasına javascript yüklerken, şartlı olarak yüklenmez.
Mark Jeldi

0

Alternatif olarak "Widget Logic" eklentisini deneyebilirsiniz ... Widget yüklemesi için koşullu ifadeler kullanır.

Bu tam tersini düşünüyor - ama sonuç beklendiği gibi olmalı.

wp_print_scripts & wp_print_styles uygun kancalar olabilir, sadece bu kancalara 100 öncelikli bir şey ekleyin - sıradaki sonuncu olmak. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

Yukarıdaki kodla ilgili sorunlarınız öncelik parametresinden yoksun olabilir (test edilmedi)? WP kodeksi


Teşekkürler Syslogic! Widget Mantık da deneyin, onun widget_content filtresine kanca olabilir düşünüyorum. Maalesef şans yok. Widget çıktısını tamponlamak için ob_start kullanır, böylece ekrana yazdırılmadan önce manipüle edebilirsiniz, ancak bu hala kafadaki herhangi bir şeyi ateşlemek için çok geç oluyor. Belki bir geçici çözüm bilmiyorsanız?
Mark Jeldi

Belki Bainternet'in widget-mantığı ile iyi görünen çözümünün bir kombinasyonu? Bunun gibi, hangi widget'ı nereye yükleyeceğinizi ve nelerin yükleneceğini tanımlayabilirsiniz. Bir temanın işlevlerine kendi koşullu ifadeleri eklemek, daha da gelişmeye yardımcı olabilir.
Martin Zeitler

-1

Özel Widget sınıfınızdaki widget yönteminde (işlevinde) wp_enqueue_script veya wp_enqueue_style kullanabilirsiniz ve komut dosyaları yalnızca widget etkinse yüklenir. Ayrıntıları ve örneği burada görebilirsiniz: https://wpshed.com/wordpress/load-scripts-styles-widget-active/


Bağlantılar zamanla koptuğu için sadece bağlantı cevapları kötüdür. En azından bağlantıda ne olduğunu özetlemelisiniz. Her durumda, bu sadece yanlıştır. OP sayfanın başlığında komut dosyalarına ihtiyaç duyduğundan.
Mark Kaplun

function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }Ve içindeki "false", komut dosyasının üstbilgi veya altbilgiye yüklenmesini ifade eder. Tekrar özetlemek için , widget yönteminde (işlev) wp_enqueue_script veya wp_enqueue_style kullanın . WordPress.com/org'dan geliştiriciler bunu yapıyor.
iStefan

Yorum cevap için bir düzenleme olmalı;) ama widget "görüntülendiğinde" zaten sayfanın baş kısmını yaptık ve bunun için JS itque enqueue olamaz.
Mark Kaplun
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.