Komut dosyalarını yalnızca belirli bir kısa kod veya widget varsa yükleme


17

Belirli bir kısa kod varsa başlığa komut dosyaları eklemek böylece yüklenmeden önce bir sayfa / mesaj içeriği filtre için bir yol gerekiyordu. Çok arama yaptıktan sonra http://wpengineer.com adresinde karşılaştım

function has_my_shortcode($posts) {
    if ( empty($posts) )
        return $posts;

    $found = false;

    foreach ($posts as $post) {
        if ( stripos($post->post_content, '[my_shortcode') )
            $found = true;
            break;
        }

    if ($found){
        $urljs = get_bloginfo( 'template_directory' ).IMP_JS;

    wp_register_script('my_script', $urljs.'myscript.js' );

    wp_print_scripts('my_script');
}
    return $posts;
}
add_action('the_posts', 'has_my_shortcode');

hangi kesinlikle parlak ve tam olarak ne gerekli yaptı.

Şimdi biraz daha genişletmem ve kenar çubukları için de aynısını yapmam gerekiyor. Belirli bir widget türü, kısa kod, kod snippet'i veya komut dosyasının ne zaman yüklenmesi gerektiğini belirlemeye yarayacak herhangi bir şey olabilir.

Sorun, kenar çubuğu yüklenmeden önce kenar çubuğu içeriğine nasıl erişileceğini anlayamıyorum (söz konusu temanın birkaç kenar çubuğu olacak)


Başlıktaki komut dosyaları durumunuz için zor bir gereksinim mi? Sayfanın sonundaki komut dosyalarının performans için koşullu ve önerilen uygulamalarla uğraşması daha kolaydır.
Rarst

Ben güzel içerik ön filtreleme ihtiyacını ortadan kaldırır ilk wp_footer denedim, ama komut dosyaları iyi yüklenirken, onlar işe yaramadı. Bu komut dosyaları, ihtiyaç duydukları şeyleri yapmak için wp_head içinde olmalıdır.
Ashley G

Yanıtlar:


20

İs_active_widget işlevini kullanabilirsiniz . Örneğin:

function check_widget() {
    if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used
        wp_enqueue_script('my-script');
    }
}

add_action( 'init', 'check_widget' );

Komut dosyasını yalnızca pencere öğesinin yüklü olduğu sayfaya yüklemek için pencere öğesi sınıfınıza is_active_widget () kodunu eklemeniz gerekir. Örneğin, varsayılan son yorumlar widget'ına bakın (wp-include / default-widgets.php, satır 602):

class WP_Widget_Recent_Comments extends WP_Widget {

    function WP_Widget_Recent_Comments() {
        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
        $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
        $this->alt_option_name = 'widget_recent_comments';

        if ( is_active_widget(false, false, $this->id_base) )
            add_action( 'wp_head', array(&$this, 'recent_comments_style') );

        add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
        add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
    }

Widget yüklenmeden ÖNCE çağrılabilir. Netleştirmek için, sayfa yüklenmeden önce bunun gerçekleşmesi gerekir. Örnek kodum, sayfadaki içeriği filtrelemek için the_posts komutunu kullanır, ancak kenar çubuklarını / widget'ları almaz.
Ashley G

Evet, cevabıma eklediğim örneğe bakın.
sorich87

Örneğiniz aslında çalışmıyor. Açık bir şey mi kaçırıyorum?
Ashley G

Aslında öyleydim. wp_enqueue_script, wp_head'e uygulandığında çalışmıyor gibi görünüyor, ancak wp_print_scripts çalışıyor. wp_enqueue_script, init'e şu şekilde uygulanırsa çalışır: add_action ('init', 'check_widget');
Ashley G

Ancak, widget yalnızca bir kenar çubuğunda etkin olsa bile, komut dosyalarını sitenin her sayfasına yükler. örneğin blog sayfaları için kenar çubuğum ve diğer sayfalar için başka bir kenar çubuğum varsa. Arama widget'ını blog kenar çubuğuna ekliyorum ve komut dosyaları yükleniyor, ancak blog kenar çubuğuna sahip olmayan sayfalara da yükleniyor. Ben sadece widget bu sayfada varsa komut dosyası yüklemek gerekir.
Ashley G

3

Sadece üzerinde çalıştığım ve uygulamamla biraz daha çok yönlü olmamı sağlayan bir çözüm paylaşmak istedim. Fonksiyonun çeşitli kısa kodları kontrol etmesini sağlamak yerine, enküre edilmesi gereken bir komut dosyası / stil işlevine başvuran tek bir kısa kod aramak için değiştirdim. Bu, diğer sınıflardaki (bunu kendileri yapamayan eklentiler gibi) ve kapsam işlevleri için de çalışır. Sadece aşağıdaki kodu function.php dosyasına bırakın ve belirli CSS ve JS'yi istediğiniz herhangi bir sayfaya / yayına aşağıdaki sözdizimini ekleyin.

Sayfa / Mesaj Sözdizimi: [loadCSSandJS function = "(class-> yöntem / işlev adı)"]

function.php kodu:

function page_specific_CSSandJS( $posts ) {
  if ( empty( $posts ) )
    return $posts;

  foreach ($posts as $post) {

    $returnValue = preg_match_all('#\[loadCSSandJS function="([A-z\-\>]+)"\]#i', $post->post_content, $types);

    foreach($types[1] as $type) {
      $items = explode("->",$type);
      if (count($items) == 2) {
        global $$items[0];      
        if( method_exists( $$items[0], $items[1] ))
          add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) );
      }
      else if( !empty( $type ) && function_exists( $type ))
        add_action( 'wp_enqueue_scripts', $type );
    }
  }

  return $posts;
}

Bu, bir sayfaya istediğiniz kadar ekleme yapmanıza da olanak tanır. Yüklemek için bir yönteme / fonksiyona ihtiyacınız olduğunu unutmayın.


1

Bu ipucunu paylaştığınız için teşekkür ederiz! Bana biraz baş ağrısı verdi, çünkü ilk başta işe yaramadı. Yukarıdaki kodda birkaç hata (belki yazım hataları) olduğunu düşünüyorum has_my_shortcodeve aşağıdaki gibi fonksiyonu yeniden yazdım:

function has_my_shortcode( $posts ) {

        if ( empty($posts) )
            return $posts;

        $shortcode_found = false;

        foreach ($posts as $post) {

            if ( !( stripos($post->post_content, '[my-shortcode') === false ) ) {
                $shortcode_found = true;
                break;
            }
        }

        if ( $shortcode_found ) {
            $this->add_scripts();
            $this->add_styles();
        }
        return $posts;
    }

İki ana sorun olduğunu düşünüyorum: breakif ifadesi kapsamında değildi ve bu döngü her zaman ilk yinelemede kırılmasına neden oldu. Diğer sorun daha incelikliydi ve keşfedilmesi zordu. Kısa kod, bir gönderide yazılan ilk şeyse yukarıdaki kod çalışmaz. Bunu ===çözmek için operatörü kullanmak zorunda kaldım .

Her neyse, bu tekniği paylaştığınız için çok teşekkür ederim, çok yardımcı oldu.


1

Wordpress 4.7 ile bunu functions.phpdosyanızda başarmanın başka bir yolu var ,

add_action( 'wp_enqueue_scripts', 'register_my_script');
function register_my_script(){
  wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter);
}

önce kodunuzu kaydettirirsiniz ; bu, kısa kodunuz çağrıldığında enqueue olmadıkça sayfanıza yazdırılmaz,

add_filter( 'do_shortcode_tag','enqueue_my_script',10,3);
function enqueue_my_script($output, $tag, $attr){
  if('myShortcode' != $tag){ //make sure it is the right shortcode
    return $output;
  }
  if(!isset($attr['id'])){ //you can even check for specific attributes
    return $output;
  }
  wp_enqueue_script('my-shortcode-js'); //enqueue your script for printing
  return $output;
}

do_shortcode_tagoldu WP 4.7 tanıtıldı ve bulunabilir yeni geliştiriciler dokümantasyon sayfalarına.

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.