एचईएडी में एक विजेट की स्क्रिप्ट / स्टाइलशीट को सशर्त रूप से संलग्न करें (केवल पृष्ठ पर मौजूद होने पर!)


13

मैं निम्नलिखित स्थितियों के साथ एक WordPress विजेट के लिए स्क्रिप्ट और शैलियों को लोड करने की कोशिश कर रहा हूं ...

  1. लिपियों को HEAD में लोड करना होगा (अन्यथा वे टूट जाते हैं)।
  2. जब स्क्रिप्ट वास्तव में प्रदर्शित होती है (वे काफी भारी हैं) तो स्क्रिप्ट को केवल लोड करना होगा।

मैंने बहुत खोज की है, और यह एक आम (अनसुलझी) समस्या प्रतीत हो रही है ... लेकिन मैं उम्मीद कर रहा हूं कि यहां किसी ने सफलतापूर्वक एक समाधान लागू किया है।

यह सबसे अच्छा है जो मुझे अब तक मिला है ...

निम्नलिखित एक सरल विजेट है जो पाठ को साइडबार पर प्रिंट करता है। यह सफलतापूर्वक jQuery के सशर्त लोड करता है (जब विजेट वास्तव में प्रदर्शित होता है) ... हालांकि केवल कभी पाद में! (नोट: यह केवल वर्डप्रेस 3.3 पर भी काम कर सकता है , हालांकि यह हैक बैकवर्ड संगतता प्रदान कर सकता है)।

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

ऐसा लगता है कि एक बार वर्डप्रेस विजेट्स को संभालना शुरू कर देता है, यह बहुत देर हो चुकी है (या फिर पहले से बताई गई किसी चीज़ को डीरगिस्टर करने के लिए)।

कोई भी उपाय बहुत प्रशंसनीय होगा!

निशान।

जवाबों:


15

एक अच्छा फ़ंक्शन के रूप में वर्डप्रेस is_active_widgetजो आप अपने __construct में उपयोग कर सकते हैं और परीक्षण कर सकते हैं यदि विजेट वर्तमान पृष्ठ में मौजूद है और उस पूर्व के आधार पर अपनी स्क्रिप्ट / शैली जोड़ें:

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

आपके उत्तर के लिए धन्यवाद, Bainternet! मैं अभी आपके कोड का परीक्षण कर रहा हूं और दुर्भाग्य से, जबकि जावास्क्रिप्ट वास्तव में सशर्त लोड करता है, यह अभी भी फुटर में लोड होता है ... भले ही इसे wp_head में कहा जा रहा हो। बहुत अजीब! (btw, यह अभी भी "सच" पाद अनुदेश के बिना ऐसा करता है)। इसके अलावा, स्टाइलशीट गूँजने से यह लोड होता है कि पेज पर विजेट है या नहीं। कोई विचार?
मार्क जेल्ली

wp_headयह कहा जाता है कि हेड स्क्रिप्ट पहले से ही प्रिंट की जाती हैं, इसलिए यह उन्हें केवल पाद लेख में लोड करेगा, लेकिन आप इसे इको-कॉपी कर सकते हैं (इसके बजाय एन-क्यूटिंग कर सकते हैं) स्टाइलशीट का उपयोग कर echo '<script src="path/to/script.js"></script>';और जैसा कि स्टाइलशीट के लिए, यह संभव नहीं है कि इसका लोड क्या विगेट्स सक्रिय नहीं है
बेनटर्न

अपनी कार्रवाई के wp_enqueue_scriptsबजाय का उपयोग करने का प्रयास wp_headकरें। यह आपको जावास्क्रिप्ट को सिर या फुटर में डालने की अनुमति देगा। http://codex.wordpress.org/Function_Reference/wp_enqueue_script
निक

धन्यवाद, निक! मैंने wp_enqueue_scripts की कोशिश की, और जब तक कि यह सिर में जावास्क्रिप्ट लोड नहीं करता, तब तक यह लोड नहीं होगा।
मार्क जलेदी

0

वैकल्पिक रूप से आप "विजेट तर्क" प्लग-इन का प्रयास कर सकते हैं ... यह विजेट लोडिंग के लिए सशर्त विवरण का उपयोग करता है।

यही कारण है कि चारों ओर बहुत सोच रहा है - लेकिन परिणाम उम्मीद के मुताबिक होना चाहिए।

wp_print_scripts और wp_print_styles उचित हुक हो सकते हैं, बस इन हुक के साथ क्रियाओं को प्राथमिकता के साथ जोड़ें 100 कुछ - कतार में बहुत अंतिम होने के लिए। wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

ऊपर दिए गए कोड के साथ आपके मुद्दों में प्राथमिकता पैरामीटर (परीक्षण नहीं) की कमी हो सकती है? WP कोडेक्स


धन्यवाद Syslogic! मैंने विजेट लॉजिक को भी आज़माया, यह सोचकर कि मैं इसके widget_content फ़िल्टर में हुक लगा सकता हूँ। दुर्भाग्य से नहीं। यह विजेट आउटपुट को बफर करने के लिए ob_start का उपयोग करता है ताकि आप इसे स्क्रीन पर प्रिंट करने से पहले इसमें हेरफेर कर सकें, लेकिन सिर में कुछ भी आग लगने में अभी भी बहुत देर हो रही है। जब तक शायद आप एक समाधान का पता है?
मार्क जेल्डी

हो सकता है कि Bainternet के समाधान का संयोजन जो विजेट-लॉजिक के साथ ठीक लगे? इस तरह आप परिभाषित कर सकते हैं कि किस विजेट को लोड करने के लिए कहाँ - और क्या लोड किया गया है। एक विषय के functions.php के लिए अपने सशर्त बयान जोड़ना आगे सुधार करने में मदद कर सकता है।
मार्टिन ज़िटलर 20'12

-1

आप बस अपने कस्टम विजेट वर्ग में विजेट विधि (फ़ंक्शन) में wp_enqueue_script या wp_enqueue_style का उपयोग कर सकते हैं और यह तभी स्क्रिप्ट को लोड करेगा जब विजेट सक्रिय हो। विवरण और उदाहरण यहां देखें: https://wpshed.com/wordpress/load-scripts-styles-widget-active/


लिंक केवल उत्तर ही खराब होते हैं क्योंकि लिंक समय के साथ टूट जाते हैं। आपको कम से कम संक्षेप में बताना चाहिए कि लिंक में क्या है। किसी भी मामले में, यह सिर्फ गलत है। ओपी को पृष्ठ के शीर्षलेख में स्क्रिप्ट की आवश्यकता होती है।
मार्क कप्लुन

function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }में "झूठा" और हेडर या पाद लेख में स्क्रिप्ट लोड करने के लिए संदर्भित करता है। फिर से संक्षेप में, विजेट विधि (फ़ंक्शन) में wp_enqueue_script या wp_enqueue_style का उपयोग करें । यह कैसे WordPress.com/org के डेवलपर्स कर रहे हैं।
इत्तेफान

टिप्पणी का जवाब में एक संपादन किया जाना चाहिए था;) लेकिन जब विजेट "प्रदर्शित" होता है तो आप पहले ही पृष्ठ के मुख्य भाग को कर चुके होते हैं और उसके बाद जेएस itno को इसमें शामिल नहीं कर सकते।
मार्क कप्लून
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.